reactstrap
Version:
React Bootstrap components
118 lines (100 loc) • 3.29 kB
JavaScript
import React from 'react';
import { render, waitFor, screen } from '@testing-library/react';
import user from '@testing-library/user-event';
import '@testing-library/jest-dom';
import {
UncontrolledAccordion,
AccordionItem,
AccordionHeader,
AccordionBody,
} from '..';
beforeEach(() => {
jest.useFakeTimers();
});
afterEach(() => {
jest.runOnlyPendingTimers();
jest.useRealTimers();
});
describe('UncontrolledAccordion', () => {
const accordionItems = [
<AccordionItem data-testid="item-1" key="1">
<AccordionHeader targetId="1" data-testid="head-1">
Accordion Item 1
</AccordionHeader>
<AccordionBody accordionId="1" data-testid="body-1">
This is the body of first item.{' '}
</AccordionBody>
</AccordionItem>,
<AccordionItem data-testid="item-2" key="2">
<AccordionHeader targetId="2" data-testid="head-2">
Accordion Item 2
</AccordionHeader>
<AccordionBody accordionId="2" data-testid="body-2">
This is the body of second item.{' '}
</AccordionBody>
</AccordionItem>,
];
it('should open and close on click', async () => {
render(
<UncontrolledAccordion
data-testid="accordion"
defaultOpen="1"
className="other-class"
>
{accordionItems}
</UncontrolledAccordion>,
);
const accordion1 = screen.getByTestId('item-1');
const accordion2 = screen.getByTestId('item-2');
expect(screen.getByTestId('accordion')).toHaveClass('accordion');
expect(screen.getByTestId('accordion')).toHaveClass('other-class');
expect(accordion1.querySelector('.accordion-collapse')).toHaveClass('show');
expect(accordion2.querySelector('.accordion-collapse')).not.toHaveClass(
'show',
);
user.click(screen.getByText(/accordion item 2/i));
expect(accordion2.querySelector('.accordion-collapse')).toHaveClass(
'collapsing',
);
await waitFor(() => {
expect(accordion1.querySelector('.accordion-collapse')).not.toHaveClass(
'show',
);
expect(accordion2.querySelector('.accordion-collapse')).toHaveClass(
'show',
);
});
});
it('should allow multiple items to open', async () => {
render(
<UncontrolledAccordion
data-testid="accordion"
defaultOpen="1"
className="other-class"
stayOpen
>
{accordionItems}
</UncontrolledAccordion>,
);
const accordion1 = screen.getByTestId('item-1');
const accordion2 = screen.getByTestId('item-2');
expect(screen.getByTestId('accordion')).toHaveClass('accordion');
expect(screen.getByTestId('accordion')).toHaveClass('other-class');
expect(accordion1.querySelector('.accordion-collapse')).toHaveClass('show');
expect(accordion2.querySelector('.accordion-collapse')).not.toHaveClass(
'show',
);
user.click(screen.getByText(/accordion item 2/i));
expect(accordion2.querySelector('.accordion-collapse')).toHaveClass(
'collapsing',
);
await waitFor(() => {
expect(accordion1.querySelector('.accordion-collapse')).toHaveClass(
'show',
);
expect(accordion2.querySelector('.accordion-collapse')).toHaveClass(
'show',
);
});
});
});