Skip to content

Commit 84851dc

Browse files
authored
test: Backport tests using the full timer matrix (#962)
1 parent 3325061 commit 84851dc

File tree

1 file changed

+56
-20
lines changed

1 file changed

+56
-20
lines changed

src/__tests__/end-to-end.js

+56-20
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as React from 'react'
2-
import {render, waitForElementToBeRemoved, screen} from '../'
2+
import {render, waitForElementToBeRemoved, screen, waitFor} from '../'
33

44
const fetchAMessage = () =>
55
new Promise(resolve => {
@@ -11,27 +11,63 @@ const fetchAMessage = () =>
1111
}, randomTimeout)
1212
})
1313

14-
class ComponentWithLoader extends React.Component {
15-
state = {loading: true}
16-
async componentDidMount() {
17-
const data = await fetchAMessage()
18-
this.setState({data, loading: false}) // eslint-disable-line
19-
}
20-
render() {
21-
if (this.state.loading) {
22-
return <div>Loading...</div>
14+
function ComponentWithLoader() {
15+
const [state, setState] = React.useState({data: undefined, loading: true})
16+
React.useEffect(() => {
17+
let cancelled = false
18+
fetchAMessage().then(data => {
19+
if (!cancelled) {
20+
setState({data, loading: false})
21+
}
22+
})
23+
24+
return () => {
25+
cancelled = true
2326
}
24-
return (
25-
<div data-testid="message">
26-
Loaded this message: {this.state.data.returnedMessage}!
27-
</div>
28-
)
27+
}, [])
28+
29+
if (state.loading) {
30+
return <div>Loading...</div>
2931
}
32+
33+
return (
34+
<div data-testid="message">
35+
Loaded this message: {state.data.returnedMessage}!
36+
</div>
37+
)
3038
}
3139

32-
test('it waits for the data to be loaded', async () => {
33-
render(<ComponentWithLoader />)
34-
const loading = () => screen.getByText('Loading...')
35-
await waitForElementToBeRemoved(loading)
36-
expect(screen.getByTestId('message')).toHaveTextContent(/Hello World/)
40+
describe.each([
41+
['real timers', () => jest.useRealTimers()],
42+
['fake legacy timers', () => jest.useFakeTimers('legacy')],
43+
['fake modern timers', () => jest.useFakeTimers('modern')],
44+
])('it waits for the data to be loaded using %s', (label, useTimers) => {
45+
beforeEach(() => {
46+
useTimers()
47+
})
48+
49+
afterEach(() => {
50+
jest.useRealTimers()
51+
})
52+
53+
test('waitForElementToBeRemoved', async () => {
54+
render(<ComponentWithLoader />)
55+
const loading = () => screen.getByText('Loading...')
56+
await waitForElementToBeRemoved(loading)
57+
expect(screen.getByTestId('message')).toHaveTextContent(/Hello World/)
58+
})
59+
60+
test('waitFor', async () => {
61+
render(<ComponentWithLoader />)
62+
const message = () => screen.getByText(/Loaded this message:/)
63+
await waitFor(message)
64+
expect(screen.getByTestId('message')).toHaveTextContent(/Hello World/)
65+
})
66+
67+
test('findBy', async () => {
68+
render(<ComponentWithLoader />)
69+
await expect(screen.findByTestId('message')).resolves.toHaveTextContent(
70+
/Hello World/,
71+
)
72+
})
3773
})

0 commit comments

Comments
 (0)