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}`}
}
);
})}