import React from 'react'; import { cleanup, fireEvent, render, screen, waitFor, } from '@testing-library/react'; import { Icon } from '@leafygreen-ui/icon'; import { SideNavItem } from '../SideNavItem'; import { SideNavGroupProps } from './SideNavGroup.types'; import { SideNavGroup } from './'; describe('packages/side-nav', () => { const testIds = { sideNav: 'side-nav', sideNavGroup: 'side-nav-group', sideNavHeader: 'side-nav-header', sideNavItem: 'side-nav-item', sideNavLink: 'side-nav-link', sideNavHeaderLabel: 'side-nav-group-header-label', sideNavHeaderIcon: 'side-nav-group-header-icon', }; const className = 'test-class-name'; const headerText = 'test-header-text'; const headerContent = (
Header As Content
); afterEach(() => { document.body.innerHTML = ''; cleanup(); }); describe('SideNavGroup', () => { const renderGroup = ({ header, glyph, ...rest }: SideNavGroupProps = {}) => { const { sideNavGroup, sideNavLink } = testIds; render( Clusters , ); }; const { sideNavGroup, sideNavHeader, sideNavLink, sideNavHeaderIcon } = testIds; describe('when the group is passed a glyph', () => { beforeEach(() => { renderGroup({ glyph: }); }); test('a glyph with the presentation role is rendered', () => { expect(screen.getAllByTestId(sideNavHeaderIcon)[0]).toHaveAttribute( 'role', 'presentation', ); }); }); describe('when the group includes a string header', () => { beforeEach(() => { renderGroup({ header: headerText }); }); test('renders the side nav group with a default header', () => { expect(screen.getByTestId(sideNavGroup)).toBeInTheDocument(); expect(screen.queryByText(headerText)).toBeInTheDocument(); expect(screen.queryByTestId(sideNavHeader)).toBeNull(); }); test('it displays the header text in a header', () => { expect( screen.getByTestId(testIds.sideNavHeaderLabel).textContent, ).toEqual(headerText); }); test('renders the children of the side nav group', () => { expect(screen.getByTestId(sideNavLink)).toBeInTheDocument(); }); test('it renders with the provided class name', () => { expect(screen.getByTestId(sideNavGroup)).toHaveClass(className); }); }); describe('when the group includes header content', () => { beforeEach(() => { renderGroup({ header: headerContent }); }); test('renders the side nav group with the header content', () => { expect(screen.getByTestId(sideNavGroup)).toBeInTheDocument(); expect(screen.queryByText(headerText)).toBeNull(); expect(screen.queryByTestId(sideNavHeader)).toBeInTheDocument(); }); }); describe('when the group does not include a header', () => { beforeEach(() => { renderGroup(); }); test('renders the side nav group without a header', () => { expect(screen.getByTestId(sideNavGroup)).toBeInTheDocument(); expect(screen.queryByText(headerText)).toBeNull(); expect(screen.queryByTestId(sideNavHeader)).toBeNull(); }); }); describe('when `collapsible` is true', () => { beforeEach(() => { renderGroup({ collapsible: true }); }); test('the content is collapsed by default', () => { const childContent = screen.queryByTestId(sideNavLink); expect(childContent).not.toBeInTheDocument(); }); test('the content expands when group label is clicked', () => { const hiddenChildContent = screen.queryByTestId(sideNavLink); expect(hiddenChildContent).not.toBeInTheDocument(); const button = screen.getByRole('button'); fireEvent.click(button); const childContent = screen.getByTestId(sideNavLink); expect(childContent).toBeInTheDocument(); }); }); describe('when `collapsible` is true and `initialCollapsed` is false', () => { beforeEach(() => { renderGroup({ collapsible: true, initialCollapsed: false }); }); test('the content appears on the page by default', () => { const childContent = screen.getByTestId(sideNavLink); expect(childContent).toBeInTheDocument(); waitFor(() => { expect(childContent).toBeVisible(); }); }); }); }); });