UNPKG

3.29 kBJavaScriptView Raw
1import React from 'react';
2import { render, waitFor, screen } from '@testing-library/react';
3import user from '@testing-library/user-event';
4import '@testing-library/jest-dom';
5import {
6 UncontrolledAccordion,
7 AccordionItem,
8 AccordionHeader,
9 AccordionBody,
10} from '..';
11
12beforeEach(() => {
13 jest.useFakeTimers();
14});
15
16afterEach(() => {
17 jest.runOnlyPendingTimers();
18 jest.useRealTimers();
19});
20
21describe('UncontrolledAccordion', () => {
22 const accordionItems = [
23 <AccordionItem data-testid="item-1" key="1">
24 <AccordionHeader targetId="1" data-testid="head-1">
25 Accordion Item 1
26 </AccordionHeader>
27 <AccordionBody accordionId="1" data-testid="body-1">
28 This is the body of first item.{' '}
29 </AccordionBody>
30 </AccordionItem>,
31 <AccordionItem data-testid="item-2" key="2">
32 <AccordionHeader targetId="2" data-testid="head-2">
33 Accordion Item 2
34 </AccordionHeader>
35 <AccordionBody accordionId="2" data-testid="body-2">
36 This is the body of second item.{' '}
37 </AccordionBody>
38 </AccordionItem>,
39 ];
40
41 it('should open and close on click', async () => {
42 render(
43 <UncontrolledAccordion
44 data-testid="accordion"
45 defaultOpen="1"
46 className="other-class"
47 >
48 {accordionItems}
49 </UncontrolledAccordion>,
50 );
51
52 const accordion1 = screen.getByTestId('item-1');
53 const accordion2 = screen.getByTestId('item-2');
54
55 expect(screen.getByTestId('accordion')).toHaveClass('accordion');
56 expect(screen.getByTestId('accordion')).toHaveClass('other-class');
57
58 expect(accordion1.querySelector('.accordion-collapse')).toHaveClass('show');
59 expect(accordion2.querySelector('.accordion-collapse')).not.toHaveClass(
60 'show',
61 );
62
63 user.click(screen.getByText(/accordion item 2/i));
64
65 expect(accordion2.querySelector('.accordion-collapse')).toHaveClass(
66 'collapsing',
67 );
68
69 await waitFor(() => {
70 expect(accordion1.querySelector('.accordion-collapse')).not.toHaveClass(
71 'show',
72 );
73 expect(accordion2.querySelector('.accordion-collapse')).toHaveClass(
74 'show',
75 );
76 });
77 });
78
79 it('should allow multiple items to open', async () => {
80 render(
81 <UncontrolledAccordion
82 data-testid="accordion"
83 defaultOpen="1"
84 className="other-class"
85 stayOpen
86 >
87 {accordionItems}
88 </UncontrolledAccordion>,
89 );
90
91 const accordion1 = screen.getByTestId('item-1');
92 const accordion2 = screen.getByTestId('item-2');
93
94 expect(screen.getByTestId('accordion')).toHaveClass('accordion');
95 expect(screen.getByTestId('accordion')).toHaveClass('other-class');
96
97 expect(accordion1.querySelector('.accordion-collapse')).toHaveClass('show');
98 expect(accordion2.querySelector('.accordion-collapse')).not.toHaveClass(
99 'show',
100 );
101
102 user.click(screen.getByText(/accordion item 2/i));
103
104 expect(accordion2.querySelector('.accordion-collapse')).toHaveClass(
105 'collapsing',
106 );
107
108 await waitFor(() => {
109 expect(accordion1.querySelector('.accordion-collapse')).toHaveClass(
110 'show',
111 );
112 expect(accordion2.querySelector('.accordion-collapse')).toHaveClass(
113 'show',
114 );
115 });
116 });
117});