import { StrictMode } from 'react'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import '@testing-library/jest-dom'; import { Nav, NavContext } from '../Nav'; import { NavList } from '../NavList'; import { NavGroup } from '../NavGroup'; import { NavItem } from '../NavItem'; import { NavExpandable } from '../NavExpandable'; import styles from '@patternfly/react-styles/css/components/Nav/nav'; const props = { items: [ { to: '#link1', label: 'Link 1' }, { to: '#link2', label: 'Link 2' }, { to: '#link3', label: 'Link 3' }, { to: '#link4', label: 'Link 4' } ] }; const renderNav = (ui: React.ReactElement>) => render({ui}); describe('Nav', () => { beforeEach(() => { window.location.hash = '#link1'; }); test('Default Nav List', () => { const { asFragment } = renderNav( ); expect(asFragment()).toMatchSnapshot(); }); test('Renders nav list in strict mode', () => { const consoleError = jest.spyOn(console, 'error'); const { asFragment } = renderNav( ); expect(consoleError).not.toHaveBeenCalled(); expect(asFragment()).toMatchSnapshot(); }); test('Default Nav List - Trigger item active update', async () => { const user = userEvent.setup(); const { asFragment } = renderNav( ); await user.click(screen.getByText('Link 2')); expect(asFragment()).toMatchSnapshot(); }); test('Expandable Nav List', () => { const { asFragment } = renderNav( ); expect(asFragment()).toMatchSnapshot(); }); test('Expandable Nav verify onExpand', async () => { const onExpand = jest.fn(); const user = userEvent.setup(); renderNav( ); await user.click(screen.getByRole('button')); expect(onExpand).toHaveBeenCalled(); }); test('Expandable Nav List - Trigger toggle', async () => { window.location.hash = '#link2'; const user = userEvent.setup(); const { asFragment } = renderNav( ); await user.click(screen.getByText('Section 1')); expect(asFragment()).toMatchSnapshot(); }); test('Expandable Nav List with aria label', () => { const { asFragment } = renderNav( ); expect(asFragment()).toMatchSnapshot(); }); test('Nav Grouped List', () => { const { asFragment } = renderNav( ); expect(asFragment()).toMatchSnapshot(); }); test('Horizontal Nav List', () => { const { asFragment } = renderNav( ); expect(asFragment()).toMatchSnapshot(); }); test('Horizontal SubNav List', () => { const { asFragment } = renderNav( ); expect(asFragment()).toMatchSnapshot(); }); test('Nav List with custom item nodes', () => { const { asFragment } = renderNav( ); expect(asFragment()).toMatchSnapshot(); }); test('Nav List with flyout', async () => { const user = userEvent.setup(); const { asFragment } = renderNav( ); await user.hover(screen.getByText('My custom node')); expect(asFragment()).toMatchSnapshot(); }); test('Nav with icon', () => { renderNav( ); expect(screen.getAllByText('this is an icon')[0].parentElement).toHaveClass(styles.navLinkIcon); }); test(`Renders with ${styles.modifiers.docked} class when variant is docked`, () => { renderNav( ); expect(screen.getByTestId('docked-nav')).toHaveClass(styles.modifiers.docked); }); test(`Renders with ${styles.modifiers.textExpanded} class when isTextExpanded is true and variant is docked`, () => { renderNav( ); expect(screen.getByTestId('text-expanded-nav')).toHaveClass(styles.modifiers.textExpanded); }); test(`Does not render with ${styles.modifiers.textExpanded} class when isTextExpanded is not passed`, () => { renderNav( ); expect(screen.getByTestId('nav')).not.toHaveClass(styles.modifiers.textExpanded); }); test(`Does not render with ${styles.modifiers.textExpanded} class when isTextExpanded is true but variant is not docked`, () => { renderNav( ); expect(screen.getByTestId('nav')).not.toHaveClass(styles.modifiers.textExpanded); }); });