1 | import React from 'react';
|
2 | import { render, waitFor, screen } from '@testing-library/react';
|
3 | import user from '@testing-library/user-event';
|
4 | import '@testing-library/jest-dom';
|
5 | import {
|
6 | UncontrolledAccordion,
|
7 | AccordionItem,
|
8 | AccordionHeader,
|
9 | AccordionBody,
|
10 | } from '..';
|
11 |
|
12 | beforeEach(() => {
|
13 | jest.useFakeTimers();
|
14 | });
|
15 |
|
16 | afterEach(() => {
|
17 | jest.runOnlyPendingTimers();
|
18 | jest.useRealTimers();
|
19 | });
|
20 |
|
21 | describe('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 | });
|