1 | import React from 'react';
|
2 | import { render, screen } from '@testing-library/react';
|
3 | import user from '@testing-library/user-event';
|
4 | import { TransitionGroup } from 'react-transition-group';
|
5 | import { Fade } from '..';
|
6 | import { testForCustomTag } from '../testUtils';
|
7 |
|
8 | class Helper extends React.Component {
|
9 | constructor(props) {
|
10 | super(props);
|
11 | this.toggle = this.toggle.bind(this);
|
12 | this.state = {
|
13 | showItem: props.showItem,
|
14 | };
|
15 | }
|
16 |
|
17 | toggle() {
|
18 | this.setState((prevState) => ({
|
19 | showItem: !prevState.showItem,
|
20 | }));
|
21 | }
|
22 |
|
23 | render() {
|
24 | return (
|
25 | <div>
|
26 | <div className="trigger" onClick={this.toggle}>
|
27 | Toggle
|
28 | </div>
|
29 | <TransitionGroup component="div">
|
30 | {this.state.showItem ? this.props.children : null}
|
31 | </TransitionGroup>
|
32 | </div>
|
33 | );
|
34 | }
|
35 | }
|
36 |
|
37 | describe('Fade', () => {
|
38 | beforeEach(() => {
|
39 | jest.useFakeTimers();
|
40 | });
|
41 |
|
42 | afterEach(() => {
|
43 | jest.clearAllTimers();
|
44 | });
|
45 |
|
46 | it('should transition classes from "fade" to "fade show" on appear', () => {
|
47 | render(
|
48 | <Helper showItem>
|
49 | <Fade>Yo!</Fade>
|
50 | <Fade appear={false}>Yo 2!</Fade>
|
51 | </Helper>,
|
52 | );
|
53 |
|
54 | expect(screen.getByText('Yo!')).toHaveClass('fade');
|
55 | expect(screen.getByText('Yo!')).not.toHaveClass('show');
|
56 | expect(screen.getByText('Yo 2!')).toHaveClass('fade');
|
57 | expect(screen.getByText('Yo 2!')).toHaveClass('show');
|
58 |
|
59 | jest.advanceTimersByTime(300);
|
60 |
|
61 | expect(screen.getByText('Yo!')).toHaveClass('fade');
|
62 | expect(screen.getByText('Yo!')).toHaveClass('show');
|
63 | expect(screen.getByText('Yo 2!')).toHaveClass('fade');
|
64 | expect(screen.getByText('Yo 2!')).toHaveClass('show');
|
65 |
|
66 | user.click(document.getElementsByClassName('trigger')[0]);
|
67 |
|
68 | expect(screen.getByText('Yo!')).toHaveClass('fade');
|
69 | expect(screen.getByText('Yo!')).not.toHaveClass('show');
|
70 | expect(screen.getByText('Yo 2!')).toHaveClass('fade');
|
71 | expect(screen.getByText('Yo 2!')).not.toHaveClass('show');
|
72 | });
|
73 |
|
74 | it('should transition classes from "fade" to "fade show" on enter', () => {
|
75 | const onEnter = jest.fn();
|
76 | const onExit = jest.fn();
|
77 | render(
|
78 | <Helper showItem={false}>
|
79 | <Fade onEnter={onEnter} onExit={onExit} key={Math.random()}>
|
80 | Yo 3!
|
81 | </Fade>
|
82 | <Fade appear={false} enter={false} exit={false} key={Math.random()}>
|
83 | Yo 4!
|
84 | </Fade>
|
85 | </Helper>,
|
86 | );
|
87 |
|
88 | expect(document.getElementsByClassName('fade').length).toBe(0);
|
89 | expect(document.getElementsByClassName('fade show').length).toBe(0);
|
90 |
|
91 | user.click(document.getElementsByClassName('trigger')[0]);
|
92 |
|
93 | expect(onEnter).toHaveBeenCalled();
|
94 | expect(onExit).not.toHaveBeenCalled();
|
95 | expect(document.getElementsByClassName('fade').length).toBe(2);
|
96 | expect(document.getElementsByClassName('fade show').length).toBe(1);
|
97 |
|
98 | jest.advanceTimersByTime(300);
|
99 |
|
100 | expect(onEnter).toHaveBeenCalled();
|
101 | expect(onExit).not.toHaveBeenCalled();
|
102 | expect(document.getElementsByClassName('fade show').length).toBe(2);
|
103 |
|
104 | user.click(document.getElementsByClassName('trigger')[0]);
|
105 |
|
106 | expect(onExit).toHaveBeenCalled();
|
107 | expect(document.getElementsByClassName('fade show').length).toBe(0);
|
108 | });
|
109 |
|
110 | it('should pass className down', () => {
|
111 | render(<Fade className="test-class-name">Yo!</Fade>);
|
112 | expect(screen.getByText(/yo/i)).toHaveClass('test-class-name');
|
113 | });
|
114 |
|
115 | it('should pass other props down', () => {
|
116 | render(<Fade data-testprop="testvalue">Yo</Fade>);
|
117 |
|
118 | expect(screen.getByText(/yo/i)).toHaveAttribute(
|
119 | 'data-testprop',
|
120 | 'testvalue',
|
121 | );
|
122 | });
|
123 |
|
124 | it('should support custom tag', () => {
|
125 | testForCustomTag(Fade);
|
126 | });
|
127 | });
|