import { render, screen, waitFor } from '@testing-library/react'; import { useState } from 'react'; import { Accordion } from './Accordion.component'; import userEvent from '@testing-library/user-event'; describe('Accordion', () => { const selectors = { accordionToggle: () => screen.getByRole('button'), accordionContainer: () => screen.getByRole('region'), accordionContent: () => screen.queryByText(/Test content/i), }; const SUT = ({ open = false }) => { return (
Test content
); }; const renderAccordion = (open = false) => { render(); }; it('should render the Accordion component with title and content', async () => { renderAccordion(); await waitFor(() => screen.findByRole('img', { hidden: true })); const accordionToggle = selectors.accordionToggle(); expect(accordionToggle).toBeInTheDocument(); const accordionContent = selectors.accordionContent(); expect(accordionContent).toBeInTheDocument(); }); it('should toggle the content when clicking on the accordion header', () => { renderAccordion(); const accordionToggle = selectors.accordionToggle(); const accordionContent = selectors.accordionContent(); expect(accordionContent).not.toBeVisible(); userEvent.click(accordionToggle); expect(accordionContent).toBeVisible(); }); it('should toggle the content when pressing the enter key or space key on the accordion header', () => { renderAccordion(); const accordionToggle = selectors.accordionToggle(); const accordionContent = selectors.accordionContent(); expect(accordionContent).not.toBeVisible(); accordionToggle.focus(); userEvent.keyboard('{enter}'); expect(accordionContent).toBeVisible(); userEvent.keyboard('{space}'); expect(accordionContent).not.toBeVisible(); }); it('should toggle the content when open prop changes', () => { const TestWrapper = () => { const [isOpen, setisOpen] = useState(false); return ( <> ); }; render(); userEvent.click(screen.getByRole('button', { name: /Test button/i })); expect(selectors.accordionContent()).toBeInTheDocument(); userEvent.click(screen.getByRole('button', { name: /Test button/i })); expect(selectors.accordionContent()).not.toBeVisible(); }); });