Skip to content

Commit 456d1a9

Browse files
committed
Fix tests
1 parent 418a755 commit 456d1a9

File tree

41 files changed

+579
-510
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+579
-510
lines changed

src/components/accordion/__tests__/Accordion.test.js

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*/
44

55
import React from 'react';
6-
import {render} from '@testing-library/react';
6+
import {act, render, screen, waitFor} from '@testing-library/react';
77
import userEvent from '@testing-library/user-event';
88
import Accordion from '../Accordion';
99
import AccordionItem from '../AccordionItem';
@@ -91,7 +91,8 @@ describe('Accordion', () => {
9191
).not.toHaveClass('show');
9292
});
9393

94-
test('tracks most recently clicked item with "active_item" prop', () => {
94+
test('tracks most recently clicked item with "active_item" prop', async () => {
95+
const user = userEvent.setup({advanceTimers: jest.advanceTimersByTime});
9596
const mockSetProps = jest.fn();
9697
const {container, rerender} = render(
9798
<Accordion setProps={mockSetProps} active_item="item-0">
@@ -109,9 +110,7 @@ describe('Accordion', () => {
109110
accordionItems.children[1].querySelector('div.accordion-collapse')
110111
).not.toHaveClass('show');
111112

112-
userEvent.click(
113-
accordionItems.children[1].querySelector('h2.accordion-header > button')
114-
);
113+
await user.click(await screen.findByText('item-title-2'));
115114
expect(mockSetProps.mock.calls).toHaveLength(1);
116115

117116
rerender(
@@ -120,7 +119,7 @@ describe('Accordion', () => {
120119
<AccordionItem title="item-title-2">item-content-2</AccordionItem>
121120
</Accordion>
122121
);
123-
jest.runAllTimers();
122+
act(() => jest.runAllTimers());
124123

125124
expect(
126125
accordionItems.children[0].querySelector('div.accordion-collapse')
@@ -130,9 +129,7 @@ describe('Accordion', () => {
130129
).toHaveClass('show');
131130

132131
// clicking on an open item closes it
133-
userEvent.click(
134-
accordionItems.children[1].querySelector('h2.accordion-header > button')
135-
);
132+
await user.click(await screen.findByText('item-title-2'));
136133
expect(mockSetProps.mock.calls).toHaveLength(2);
137134

138135
rerender(
@@ -141,7 +138,7 @@ describe('Accordion', () => {
141138
<AccordionItem title="item-title-2">item-content-2</AccordionItem>
142139
</Accordion>
143140
);
144-
jest.runAllTimers();
141+
act(() => jest.runAllTimers());
145142

146143
expect(
147144
accordionItems.children[0].querySelector('div.accordion-collapse')
@@ -151,7 +148,8 @@ describe('Accordion', () => {
151148
).not.toHaveClass('show');
152149
});
153150

154-
test('keeps item open with "always_open" prop', () => {
151+
test('keeps item open with "always_open" prop', async () => {
152+
const user = userEvent.setup({advanceTimers: jest.advanceTimersByTime});
155153
const mockSetProps = jest.fn();
156154

157155
const {container} = render(
@@ -172,34 +170,31 @@ describe('Accordion', () => {
172170
).not.toHaveClass('show');
173171

174172
// Click on the second item
175-
userEvent.click(
176-
accordionItems.children[1].querySelector('h2.accordion-header > button')
177-
);
173+
await user.click(await screen.findByText('item-title-2'));
178174
expect(mockSetProps.mock.calls).toHaveLength(1);
179175

180-
// Allow the click to take effect
181-
jest.runAllTimers();
176+
// wait for transition to complete
177+
await waitFor(() =>
178+
expect(
179+
accordionItems.children[1].querySelector('div.accordion-collapse')
180+
).toHaveClass('show')
181+
);
182182

183183
// Check just the second item is open
184184
expect(
185185
accordionItems.children[0].querySelector('div.accordion-collapse')
186186
).not.toHaveClass('show');
187-
expect(
188-
accordionItems.children[1].querySelector('div.accordion-collapse')
189-
).toHaveClass('show');
190187

191188
// Click on the first item
192-
userEvent.click(
193-
accordionItems.children[0].querySelector('h2.accordion-header > button')
194-
);
189+
await user.click(await screen.findByText('item-title-1'));
195190
expect(mockSetProps.mock.calls).toHaveLength(2);
196-
// Allow the click to take effect
197-
jest.runAllTimers();
198191

199192
// Check that the first child is now open, and the second remains open
200-
expect(
201-
accordionItems.children[0].querySelector('div.accordion-collapse')
202-
).toHaveClass('show');
193+
await waitFor(() =>
194+
expect(
195+
accordionItems.children[0].querySelector('div.accordion-collapse')
196+
).toHaveClass('show')
197+
);
203198
expect(
204199
accordionItems.children[1].querySelector('div.accordion-collapse')
205200
).toHaveClass('show');
@@ -224,7 +219,8 @@ describe('Accordion', () => {
224219
).toHaveClass('show');
225220
});
226221

227-
test('tracks most recently clicked item with "active_item" prop when always_open', () => {
222+
test('tracks most recently clicked item with "active_item" prop when always_open', async () => {
223+
const user = userEvent.setup({advanceTimers: jest.advanceTimersByTime});
228224
const mockSetProps = jest.fn();
229225
const {container, rerender} = render(
230226
<Accordion setProps={mockSetProps} active_item={['item-0']} always_open>
@@ -248,9 +244,7 @@ describe('Accordion', () => {
248244
).not.toHaveClass('show');
249245

250246
// Click the middle option
251-
userEvent.click(
252-
accordionItems.children[1].querySelector('h2.accordion-header > button')
253-
);
247+
await user.click(await screen.getByText('item-title-2'));
254248
expect(mockSetProps.mock.calls).toHaveLength(1);
255249

256250
rerender(
@@ -264,7 +258,7 @@ describe('Accordion', () => {
264258
<AccordionItem title="item-title-3">item-content-3</AccordionItem>
265259
</Accordion>
266260
);
267-
jest.runAllTimers();
261+
act(() => jest.runAllTimers());
268262

269263
// Check first option stayed open, middle option now open but third still
270264
// closed
@@ -279,9 +273,7 @@ describe('Accordion', () => {
279273
).not.toHaveClass('show');
280274

281275
// clicking on 1st item closes it, but keeps second item open and 3rd closed
282-
userEvent.click(
283-
accordionItems.children[0].querySelector('h2.accordion-header > button')
284-
);
276+
await user.click(await screen.getByText('item-title-1'));
285277
expect(mockSetProps.mock.calls).toHaveLength(2);
286278

287279
rerender(
@@ -295,7 +287,7 @@ describe('Accordion', () => {
295287
<AccordionItem title="item-title-3">item-content-3</AccordionItem>
296288
</Accordion>
297289
);
298-
jest.runAllTimers();
290+
act(() => jest.runAllTimers());
299291

300292
// Check that 1 and 3 now closed, and 2 is open
301293
expect(

src/components/badge/__tests__/Badge.test.js

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,31 +56,34 @@ describe('Badge', () => {
5656
expect(badge.getAttribute('href')).toBe(href);
5757
});
5858

59-
test('tracks clicks with n_clicks', () => {
59+
test('tracks clicks with n_clicks', async () => {
60+
const user = userEvent.setup();
6061
const mockSetProps = jest.fn();
6162
const badge = render(<Badge setProps={mockSetProps}>Clickable</Badge>);
6263

6364
expect(mockSetProps.mock.calls).toHaveLength(0);
6465

65-
userEvent.click(badge.getByText('Clickable'));
66+
await user.click(badge.getByText('Clickable'));
6667

6768
expect(mockSetProps.mock.calls).toHaveLength(1);
6869
expect(mockSetProps.mock.calls[0][0].n_clicks).toBe(1);
6970
});
7071

71-
test('relative links are internal by default', () => {
72+
test('relative links are internal by default', async () => {
73+
const user = userEvent.setup();
7274
const badge = render(<Badge href="/relative">Clickable</Badge>);
7375

7476
const mockEventListener = jest.fn();
7577
window.addEventListener('_dashprivate_pushstate', mockEventListener);
7678
window.scrollTo = jest.fn();
7779

7880
expect(mockEventListener.mock.calls).toHaveLength(0);
79-
userEvent.click(badge.getByText('Clickable'));
81+
await user.click(badge.getByText('Clickable'));
8082
expect(mockEventListener.mock.calls).toHaveLength(1);
8183
});
8284

83-
test('relative links are external with external_link=true', () => {
85+
test('relative links are external with external_link=true', async () => {
86+
const user = userEvent.setup();
8487
const badge = render(
8588
<Badge href="/relative" external_link>
8689
Clickable
@@ -92,7 +95,7 @@ describe('Badge', () => {
9295
window.scrollTo = jest.fn();
9396

9497
expect(mockEventListener.mock.calls).toHaveLength(0);
95-
userEvent.click(badge.getByText('Clickable'));
98+
await user.click(badge.getByText('Clickable'));
9699
expect(mockEventListener.mock.calls).toHaveLength(0);
97100
});
98101
});

src/components/button/Button.js

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,28 +12,26 @@ import Link from '../../private/Link';
1212
* Use the `n_clicks` prop to trigger callbacks when the button has been
1313
* clicked.
1414
*/
15-
const Button = props => {
16-
const {
17-
children,
18-
disabled,
19-
href,
20-
loading_state,
21-
setProps,
22-
n_clicks,
23-
target,
24-
type,
25-
download,
26-
name,
27-
value,
28-
className,
29-
class_name,
30-
color,
31-
outline,
32-
onClick,
33-
rel,
34-
...otherProps
35-
} = props;
36-
15+
const Button = ({
16+
children,
17+
disabled,
18+
href,
19+
loading_state,
20+
setProps,
21+
target,
22+
type,
23+
download,
24+
name,
25+
value,
26+
className,
27+
class_name,
28+
color,
29+
outline,
30+
onClick,
31+
rel,
32+
n_clicks = 0,
33+
...otherProps
34+
}) => {
3735
const incrementClicks = () => {
3836
if (!disabled && setProps) {
3937
setProps({
@@ -73,11 +71,6 @@ const Button = props => {
7371
);
7472
};
7573

76-
Button.dashPersistence = {
77-
n_clicks: 0,
78-
n_clicks_timestamp: -1
79-
};
80-
8174
Button.propTypes = {
8275
/**
8376
* The ID of this component, used to identify dash components

src/components/button/__tests__/Button.test.js

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,19 +84,21 @@ describe('Button', () => {
8484
);
8585
});
8686

87-
test('tracks clicks with n_clicks', () => {
87+
test('tracks clicks with n_clicks', async () => {
88+
const user = userEvent.setup();
8889
const mockSetProps = jest.fn();
8990
const button = render(<Button setProps={mockSetProps}>Clickable</Button>);
9091

9192
expect(mockSetProps.mock.calls).toHaveLength(0);
9293

93-
userEvent.click(button.getByText('Clickable'));
94+
await user.click(button.getByText('Clickable'));
9495

9596
expect(mockSetProps.mock.calls).toHaveLength(1);
9697
expect(mockSetProps.mock.calls[0][0].n_clicks).toBe(1);
9798
});
9899

99-
test("doesn't track clicks if disabled", () => {
100+
test("doesn't track clicks if disabled", async () => {
101+
const user = userEvent.setup();
100102
const mockSetProps = jest.fn();
101103
const button = render(
102104
<Button disabled setProps={mockSetProps}>
@@ -106,24 +108,26 @@ describe('Button', () => {
106108

107109
expect(mockSetProps.mock.calls).toHaveLength(0);
108110

109-
userEvent.click(button.getByText('Clickable'));
111+
await user.click(button.getByText('Clickable'));
110112

111113
expect(mockSetProps.mock.calls).toHaveLength(0);
112114
});
113115

114-
test('relative links are internal by default', () => {
116+
test('relative links are internal by default', async () => {
117+
const user = userEvent.setup();
115118
const button = render(<Button href="/relative">Clickable</Button>);
116119

117120
const mockEventListener = jest.fn();
118121
window.addEventListener('_dashprivate_pushstate', mockEventListener);
119122
window.scrollTo = jest.fn();
120123

121124
expect(mockEventListener.mock.calls).toHaveLength(0);
122-
userEvent.click(button.getByText('Clickable'));
125+
await user.click(button.getByText('Clickable'));
123126
expect(mockEventListener.mock.calls).toHaveLength(1);
124127
});
125128

126-
test('relative links are external with external_link=true', () => {
129+
test('relative links are external with external_link=true', async () => {
130+
const user = userEvent.setup();
127131
const button = render(
128132
<Button href="/relative" external_link>
129133
Clickable
@@ -135,7 +139,7 @@ describe('Button', () => {
135139
window.scrollTo = jest.fn();
136140

137141
expect(mockEventListener.mock.calls).toHaveLength(0);
138-
userEvent.click(button.getByText('Clickable'));
142+
await user.click(button.getByText('Clickable'));
139143
expect(mockEventListener.mock.calls).toHaveLength(0);
140144
});
141145
});

0 commit comments

Comments
 (0)