-
Notifications
You must be signed in to change notification settings - Fork 273
/
Copy pathwait-for-element-to-be-removed.test.tsx
144 lines (112 loc) · 4.18 KB
/
wait-for-element-to-be-removed.test.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
import React, { useState } from 'react';
import { Text, TouchableOpacity, View } from 'react-native';
import { fireEvent, render, screen, waitForElementToBeRemoved } from '..';
const TestSetup = ({ shouldUseDelay = true }) => {
const [isAdded, setIsAdded] = useState(true);
const removeElement = () => {
if (shouldUseDelay) {
setTimeout(() => setIsAdded(false), 300);
} else {
setIsAdded(false);
}
};
return (
<View>
{isAdded && <Text>Observed Element</Text>}
<TouchableOpacity onPress={removeElement}>
<Text>Remove Element</Text>
</TouchableOpacity>
</View>
);
};
afterEach(() => {
jest.useRealTimers();
});
test('waits when using getBy query', async () => {
render(<TestSetup />);
fireEvent.press(screen.getByText('Remove Element'));
const element = screen.getByText('Observed Element');
expect(element).toBeTruthy();
const result = await waitForElementToBeRemoved(() => screen.getByText('Observed Element'));
expect(screen.queryByText('Observed Element')).toBeNull();
expect(result).toEqual(element);
});
test('waits when using getAllBy query', async () => {
render(<TestSetup />);
fireEvent.press(screen.getByText('Remove Element'));
const elements = screen.getAllByText('Observed Element');
expect(elements).toBeTruthy();
const result = await waitForElementToBeRemoved(() => screen.getAllByText('Observed Element'));
expect(screen.queryByText('Observed Element')).toBeNull();
expect(result).toEqual(elements);
});
test('waits when using queryBy query', async () => {
render(<TestSetup />);
fireEvent.press(screen.getByText('Remove Element'));
const element = screen.getByText('Observed Element');
expect(element).toBeTruthy();
const result = await waitForElementToBeRemoved(() => screen.queryByText('Observed Element'));
expect(screen.queryByText('Observed Element')).toBeNull();
expect(result).toEqual(element);
});
test('waits when using queryAllBy query', async () => {
render(<TestSetup />);
fireEvent.press(screen.getByText('Remove Element'));
const elements = screen.getAllByText('Observed Element');
expect(elements).toBeTruthy();
const result = await waitForElementToBeRemoved(() => screen.queryAllByText('Observed Element'));
expect(screen.queryByText('Observed Element')).toBeNull();
expect(result).toEqual(elements);
});
test('checks if elements exist at start', async () => {
render(<TestSetup shouldUseDelay={false} />);
fireEvent.press(screen.getByText('Remove Element'));
expect(screen.queryByText('Observed Element')).toBeNull();
await expect(
waitForElementToBeRemoved(() => screen.queryByText('Observed Element')),
).rejects.toThrow(
'The element(s) given to waitForElementToBeRemoved are already removed. waitForElementToBeRemoved requires that the element(s) exist(s) before waiting for removal.',
);
});
test('waits until timeout', async () => {
render(<TestSetup />);
fireEvent.press(screen.getByText('Remove Element'));
expect(screen.getByText('Observed Element')).toBeTruthy();
await expect(
waitForElementToBeRemoved(() => screen.getByText('Observed Element'), {
timeout: 100,
}),
).rejects.toThrow('Timed out in waitForElementToBeRemoved.');
// Async action ends after 300ms and we only waited 100ms, so we need to wait for the remaining
// async actions to finish
await waitForElementToBeRemoved(() => screen.getByText('Observed Element'));
});
test('waits with custom interval', async () => {
const mockFn = jest.fn(() => <View />);
try {
await waitForElementToBeRemoved(() => mockFn(), {
timeout: 600,
interval: 200,
});
} catch {
// Suppress expected error
}
expect(mockFn).toHaveBeenCalledTimes(4);
});
test.each([false, true])(
'works with fake timers (legacyFakeTimers = %s)',
async (legacyFakeTimers) => {
jest.useFakeTimers({ legacyFakeTimers });
const mockFn = jest.fn(() => <View />);
try {
await waitForElementToBeRemoved(() => mockFn(), {
timeout: 400,
interval: 200,
});
} catch {
// Suppress expected error
}
// waitForElementToBeRemoved runs an initial call of the expectation
expect(mockFn).toHaveBeenCalledTimes(4);
},
);