import React, { useState } from 'react'; import { render, screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { Accordion, AccordionItem } from './'; import { Button } from '../Button'; describe('Accordion component', () => { it('supports a default open item', () => { render(
Header 1
}> {
Content 1
}
Header 2
}> {
Content 2
}
Header 3
}> {
Content 3
}
, ); expect(screen.getByText('Header 1')).toBeVisible(); expect(screen.getByText('Header 2')).toBeVisible(); expect(screen.getByText('Header 3')).toBeVisible(); expect(screen.getByText('Content 1')).not.toBeVisible(); expect(screen.getByText('Content 2')).toBeVisible(); expect(screen.getByText('Content 3')).not.toBeVisible(); }); it('supports only one item', async () => { render(
Header 1
}> {
Content 1
}
, ); expect(screen.getByText('Header 1')).toBeVisible(); expect(screen.getByText('Content 1')).not.toBeVisible(); await userEvent.click(screen.getByText('Header 1')); expect(screen.getByText('Content 1')).toBeVisible(); await userEvent.click(screen.getByText('Header 1')); await waitFor(() => expect(screen.getByText('Content 1')).not.toBeVisible(), ); }); it('supports programmatically open and close an item', async () => { const Wrapper = () => { const [openItemIndex, setOpenItemIndex] = useState(-1); return ( <> {Array.from({ length: 2 }, (_, i) => { const open = openItemIndex === i; return (
{`Header ${i}`}
} > {
{`Content ${i}`}
}
); })}