1 | import React from 'react';
|
2 | import { render, screen } from '@testing-library/react';
|
3 | import '@testing-library/jest-dom';
|
4 | import { Collapse } from '..';
|
5 |
|
6 | describe('Collapse', () => {
|
7 | beforeEach(() => {
|
8 | jest.useFakeTimers();
|
9 | });
|
10 |
|
11 | afterEach(() => {
|
12 | jest.clearAllTimers();
|
13 | });
|
14 |
|
15 | it('should render children', () => {
|
16 | render(<Collapse>Hello</Collapse>);
|
17 | expect(screen.getByText(/hello/i)).toBeInTheDocument();
|
18 | });
|
19 |
|
20 | it('works with strict mode', () => {
|
21 | const spy = jest.spyOn(console, 'error');
|
22 | render(
|
23 | <React.StrictMode>
|
24 | <Collapse />
|
25 | </React.StrictMode>,
|
26 | );
|
27 | expect(spy).not.toHaveBeenCalled();
|
28 | });
|
29 |
|
30 | it('should have default isOpen value as false', () => {
|
31 | render(<Collapse>Hello</Collapse>);
|
32 | expect(screen.getByText(/hello/i)).not.toHaveClass('show');
|
33 | });
|
34 |
|
35 | it('should render with class "collapse"', () => {
|
36 | render(<Collapse>Hello</Collapse>);
|
37 | expect(screen.getByText(/hello/i)).toHaveClass('collapse');
|
38 | });
|
39 |
|
40 | it('should render with class "collapse-horizontal" if it has prop horizontal', () => {
|
41 | render(<Collapse horizontal>Hello</Collapse>);
|
42 | expect(screen.getByText(/hello/i)).toHaveClass('collapse-horizontal');
|
43 | });
|
44 |
|
45 | it('should render with class "navbar-collapse" if it has prop navbar', () => {
|
46 | render(<Collapse navbar>Hello</Collapse>);
|
47 | expect(screen.getByText(/hello/i)).toHaveClass('navbar-collapse');
|
48 | });
|
49 |
|
50 | it('should render with class "show" when isOpen is true', () => {
|
51 | render(<Collapse isOpen>Hello</Collapse>);
|
52 | expect(screen.getByText(/hello/i)).toHaveClass('show');
|
53 | });
|
54 |
|
55 | it('should set height to null when isOpen is true', () => {
|
56 | render(<Collapse isOpen data-testid="collapse" />);
|
57 | expect(screen.getByTestId('collapse').style.height).toBe('');
|
58 | });
|
59 |
|
60 | it('should not set height when isOpen is false', () => {
|
61 | render(<Collapse isOpen={false} data-testid="collapse" />);
|
62 | expect(screen.getByTestId('collapse').style.height).toBe('');
|
63 | });
|
64 |
|
65 | it('should forward all styles', () => {
|
66 | render(
|
67 | <Collapse
|
68 | isOpen={false}
|
69 | data-testid="collapse"
|
70 | style={{ backgroundColor: 'black' }}
|
71 | />,
|
72 | );
|
73 | expect(screen.getByTestId('collapse').style.backgroundColor).toBe('black');
|
74 | });
|
75 |
|
76 | it('should forward all callbacks', () => {
|
77 | const callbacks = {
|
78 | onEnter: jest.fn(),
|
79 | onEntering: jest.fn(),
|
80 | onEntered: jest.fn(),
|
81 | onExit: jest.fn(),
|
82 | onExiting: jest.fn(),
|
83 | onExited: jest.fn(),
|
84 | };
|
85 | const { rerender } = render(<Collapse isOpen={false} {...callbacks} />);
|
86 | rerender(<Collapse isOpen {...callbacks} />);
|
87 | expect(callbacks.onEnter).toHaveBeenCalled();
|
88 | expect(callbacks.onEntering).toHaveBeenCalled();
|
89 | expect(callbacks.onEntered).not.toHaveBeenCalled();
|
90 | jest.advanceTimersByTime(350);
|
91 | expect(callbacks.onEntered).toHaveBeenCalled();
|
92 | expect(callbacks.onExit).not.toHaveBeenCalled();
|
93 | rerender(<Collapse isOpen={false} {...callbacks} />);
|
94 | expect(callbacks.onExit).toHaveBeenCalled();
|
95 | expect(callbacks.onExiting).toHaveBeenCalled();
|
96 | expect(callbacks.onExited).not.toHaveBeenCalled();
|
97 | jest.advanceTimersByTime(350);
|
98 | expect(callbacks.onExiting).toHaveBeenCalled();
|
99 | expect(callbacks.onExited).toHaveBeenCalled();
|
100 | });
|
101 |
|
102 | it('should apply correct bootstrap classes', () => {
|
103 | const { rerender } = render(
|
104 | <Collapse isOpen={false} data-testid="collapse" />,
|
105 | );
|
106 | rerender(<Collapse isOpen data-testid="collapse" />);
|
107 | expect(screen.getByTestId('collapse')).toHaveClass('collapsing');
|
108 | jest.advanceTimersByTime(350);
|
109 | expect(screen.getByTestId('collapse')).toHaveClass('collapse show');
|
110 |
|
111 | rerender(<Collapse isOpen={false} data-testid="collapse" />);
|
112 | expect(screen.getByTestId('collapse')).toHaveClass('collapsing');
|
113 | jest.advanceTimersByTime(350);
|
114 | expect(screen.getByTestId('collapse')).toHaveClass('collapse');
|
115 | });
|
116 |
|
117 | it('should set inline style to 0 when isOpen change to false and remove after transition', () => {
|
118 | const { rerender } = render(<Collapse isOpen data-testid="collapse" />);
|
119 | rerender(<Collapse isOpen={false} data-testid="collapse" />);
|
120 | expect(screen.getByTestId('collapse').style.height).toBe('0px');
|
121 | jest.advanceTimersByTime(380);
|
122 | expect(screen.getByTestId('collapse').style.height).toBe('');
|
123 | });
|
124 | });
|