UNPKG

3.68 kBJavaScriptView Raw
1import React from 'react';
2import { render, screen } from '@testing-library/react';
3import user from '@testing-library/user-event';
4import { TransitionGroup } from 'react-transition-group';
5import { Fade } from '..';
6import { testForCustomTag } from '../testUtils';
7
8class 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
37describe('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});