import React from 'react'; import axe from '../../../../../axe-helper'; import { fireEvent, render } from '@testing-library/react'; import NavbarDropdown from './NavbarDropdown'; describe('', () => { const items = [ { label: 'one', href: '#' }, { label: 'two', href: '#' }, ]; const renderItem = ({ item: { label, href }, getItemProps }: any) => ( {label} ); const renderComponent = () => render( <> , ); it.only('renders with no a11y violations', async () => { const { container } = renderComponent(); expect(container.firstChild).toMatchSnapshot(); const results = await axe(container.innerHTML); expect(results).toHaveNoViolations(); }); ['Enter', ' ', 'ArrowUp', 'ArrowDown'].forEach((key) => { it(`should open the dropdown on ${key} press`, () => { const { getAllByTestId } = renderComponent(); const [opener] = getAllByTestId('ZA.navbar-item'); expect(opener.getAttribute('aria-expanded')).toEqual('false'); fireEvent.focus(opener); fireEvent.keyDown(opener, { key }); expect(opener.getAttribute('aria-expanded')).toEqual('true'); }); }); it(`should navigate through items with arrow up/down keys`, () => { const { getAllByTestId, getByText } = renderComponent(); const [opener] = getAllByTestId('ZA.navbar-item'); const itemOne = getByText('one'); const itemTwo = getByText('two'); fireEvent.focus(opener); fireEvent.keyDown(opener, { key: ' ' }); fireEvent.keyDown(opener, { key: 'ArrowDown' }); expect(itemOne).toHaveFocus(); fireEvent.keyDown(itemOne, { key: 'ArrowDown' }); expect(itemTwo).toHaveFocus(); fireEvent.keyDown(itemTwo, { key: 'ArrowUp' }); expect(itemOne).toHaveFocus(); }); it(`should close the dropdown when focused on an element outside of dropdown`, () => { const { getAllByTestId, getByText } = renderComponent(); const [opener] = getAllByTestId('ZA.navbar-item'); const otherElement = getByText('button'); fireEvent.focus(opener); fireEvent.keyDown(opener, { key: ' ' }); expect(opener.getAttribute('aria-expanded')).toEqual('true'); fireEvent.focus(otherElement); expect(opener.getAttribute('aria-expanded')).toEqual('false'); }); });