1
1
import "jest-dom/extend-expect"
2
2
import React from "react"
3
- import { render , fireEvent , cleanup , waitForElement } from "react-testing-library"
3
+ import { render , fireEvent , cleanup , waitForElement , flushEffects } from "react-testing-library"
4
4
import { useAsync } from "."
5
5
6
6
afterEach ( cleanup )
@@ -13,16 +13,16 @@ const Async = ({ children = () => null, ...props }) => children(useAsync(props))
13
13
test ( "useAsync returns render props" , async ( ) => {
14
14
const promiseFn = ( ) => new Promise ( resolve => setTimeout ( resolve , 0 , "done" ) )
15
15
const component = < Async promiseFn = { promiseFn } > { ( { data } ) => data || null } </ Async >
16
- const { getByText, rerender } = render ( component )
17
- rerender ( component ) // needed to trigger useEffect
16
+ const { getByText } = render ( component )
17
+ flushEffects ( )
18
18
await waitForElement ( ( ) => getByText ( "done" ) )
19
19
} )
20
20
21
21
test ( "useAsync passes rejection error to children as render prop" , async ( ) => {
22
22
const promiseFn = ( ) => Promise . reject ( "oops" )
23
23
const component = < Async promiseFn = { promiseFn } > { ( { error } ) => error || null } </ Async >
24
- const { getByText, rerender } = render ( component )
25
- rerender ( component )
24
+ const { getByText } = render ( component )
25
+ flushEffects ( )
26
26
await waitForElement ( ( ) => getByText ( "oops" ) )
27
27
} )
28
28
@@ -37,8 +37,8 @@ test("useAsync passes isLoading boolean while the promise is running", async ()
37
37
} }
38
38
</ Async >
39
39
)
40
- const { getByText, rerender } = render ( component )
41
- rerender ( component )
40
+ const { getByText } = render ( component )
41
+ flushEffects ( )
42
42
await waitForElement ( ( ) => getByText ( "done" ) )
43
43
expect ( states ) . toEqual ( [ true , true , false ] )
44
44
} )
@@ -56,8 +56,8 @@ test("useAsync passes startedAt date when the promise starts", async () => {
56
56
} }
57
57
</ Async >
58
58
)
59
- const { getByText, rerender } = render ( component )
60
- rerender ( component )
59
+ const { getByText } = render ( component )
60
+ flushEffects ( )
61
61
await waitForElement ( ( ) => getByText ( "started" ) )
62
62
} )
63
63
@@ -74,16 +74,16 @@ test("useAsync passes finishedAt date when the promise finishes", async () => {
74
74
} }
75
75
</ Async >
76
76
)
77
- const { getByText, rerender } = render ( component )
78
- rerender ( component )
77
+ const { getByText } = render ( component )
78
+ flushEffects ( )
79
79
await waitForElement ( ( ) => getByText ( "done" ) )
80
80
} )
81
81
82
82
test ( "useAsync passes reload function that re-runs the promise" , async ( ) => {
83
83
const promiseFn = jest . fn ( ) . mockReturnValue ( resolveTo ( "done" ) )
84
84
const component = < Async promiseFn = { promiseFn } > { ( { reload } ) => < button onClick = { reload } > reload</ button > } </ Async >
85
- const { getByText, rerender } = render ( component )
86
- rerender ( component )
85
+ const { getByText } = render ( component )
86
+ flushEffects ( )
87
87
expect ( promiseFn ) . toHaveBeenCalledTimes ( 1 )
88
88
fireEvent . click ( getByText ( "reload" ) )
89
89
expect ( promiseFn ) . toHaveBeenCalledTimes ( 2 )
@@ -104,14 +104,14 @@ test("useAsync re-runs the promise when the value of 'watch' changes", () => {
104
104
}
105
105
const promiseFn = jest . fn ( ) . mockReturnValue ( resolveTo ( ) )
106
106
const component = < Counter > { count => < Async promiseFn = { promiseFn } watch = { count } /> } </ Counter >
107
- const { getByText, rerender } = render ( component )
108
- rerender ( component )
107
+ const { getByText } = render ( component )
108
+ flushEffects ( )
109
109
expect ( promiseFn ) . toHaveBeenCalledTimes ( 1 )
110
110
fireEvent . click ( getByText ( "increment" ) )
111
- rerender ( component )
111
+ flushEffects ( )
112
112
expect ( promiseFn ) . toHaveBeenCalledTimes ( 2 )
113
113
fireEvent . click ( getByText ( "increment" ) )
114
- rerender ( component )
114
+ flushEffects ( )
115
115
expect ( promiseFn ) . toHaveBeenCalledTimes ( 3 )
116
116
} )
117
117
@@ -125,8 +125,8 @@ test("useAsync runs deferFn only when explicitly invoked, passing arguments and
125
125
} }
126
126
</ Async >
127
127
)
128
- const { getByText, rerender } = render ( component )
129
- rerender ( component )
128
+ const { getByText } = render ( component )
129
+ flushEffects ( )
130
130
expect ( deferFn ) . not . toHaveBeenCalled ( )
131
131
fireEvent . click ( getByText ( "run" ) )
132
132
expect ( deferFn ) . toHaveBeenCalledWith ( "go" , 1 , expect . objectContaining ( { deferFn, foo : "bar" } ) )
@@ -149,8 +149,8 @@ test("useAsync reload uses the arguments of the previous run", () => {
149
149
} }
150
150
</ Async >
151
151
)
152
- const { getByText, rerender } = render ( component )
153
- rerender ( component )
152
+ const { getByText } = render ( component )
153
+ flushEffects ( )
154
154
expect ( deferFn ) . not . toHaveBeenCalled ( )
155
155
fireEvent . click ( getByText ( "run" ) )
156
156
expect ( deferFn ) . toHaveBeenCalledWith ( "go" , 1 , expect . objectContaining ( { deferFn } ) )
@@ -187,8 +187,8 @@ test("useAsync invokes onResolve callback when promise resolves", async () => {
187
187
const promiseFn = jest . fn ( ) . mockReturnValue ( Promise . resolve ( "ok" ) )
188
188
const onResolve = jest . fn ( )
189
189
const component = < Async promiseFn = { promiseFn } onResolve = { onResolve } />
190
- const { rerender } = render ( component )
191
- rerender ( component )
190
+ render ( component )
191
+ flushEffects ( )
192
192
await Promise . resolve ( )
193
193
expect ( onResolve ) . toHaveBeenCalledWith ( "ok" )
194
194
} )
@@ -197,8 +197,8 @@ test("useAsync invokes onReject callback when promise rejects", async () => {
197
197
const promiseFn = jest . fn ( ) . mockReturnValue ( Promise . reject ( "err" ) )
198
198
const onReject = jest . fn ( )
199
199
const component = < Async promiseFn = { promiseFn } onReject = { onReject } />
200
- const { rerender } = render ( component )
201
- rerender ( component )
200
+ render ( component )
201
+ flushEffects ( )
202
202
await Promise . resolve ( )
203
203
expect ( onReject ) . toHaveBeenCalledWith ( "err" )
204
204
} )
@@ -207,8 +207,8 @@ test("useAsync cancels pending promise when unmounted", async () => {
207
207
const promiseFn = jest . fn ( ) . mockReturnValue ( Promise . resolve ( "ok" ) )
208
208
const onResolve = jest . fn ( )
209
209
const component = < Async promiseFn = { promiseFn } onResolve = { onResolve } />
210
- const { unmount, rerender } = render ( component )
211
- rerender ( component )
210
+ const { unmount } = render ( component )
211
+ flushEffects ( )
212
212
unmount ( )
213
213
await Promise . resolve ( )
214
214
expect ( onResolve ) . not . toHaveBeenCalled ( )
@@ -222,10 +222,10 @@ test("useAsync cancels and restarts the promise when promiseFn changes", async (
222
222
const component2 = < Async promiseFn = { promiseFn2 } onResolve = { onResolve } />
223
223
const { rerender } = render ( component1 )
224
224
await Promise . resolve ( )
225
- rerender ( component1 )
225
+ flushEffects ( )
226
226
expect ( promiseFn1 ) . toHaveBeenCalled ( )
227
227
rerender ( component2 )
228
- rerender ( component2 )
228
+ flushEffects ( )
229
229
expect ( promiseFn2 ) . toHaveBeenCalled ( )
230
230
expect ( onResolve ) . not . toHaveBeenCalledWith ( "one" )
231
231
await Promise . resolve ( )
@@ -235,8 +235,8 @@ test("useAsync cancels and restarts the promise when promiseFn changes", async (
235
235
test ( "useAsync does not run promiseFn on mount when initialValue is provided" , ( ) => {
236
236
const promiseFn = jest . fn ( ) . mockReturnValue ( Promise . resolve ( ) )
237
237
const component = < Async promiseFn = { promiseFn } initialValue = { { } } />
238
- const { rerender } = render ( component )
239
- rerender ( component )
238
+ render ( component )
239
+ flushEffects ( )
240
240
expect ( promiseFn ) . not . toHaveBeenCalled ( )
241
241
} )
242
242
@@ -251,8 +251,8 @@ test("useAsync does not start loading when using initialValue", async () => {
251
251
} }
252
252
</ Async >
253
253
)
254
- const { getByText, rerender } = render ( component )
255
- rerender ( component )
254
+ const { getByText } = render ( component )
255
+ flushEffects ( )
256
256
await waitForElement ( ( ) => getByText ( "done" ) )
257
257
expect ( states ) . toEqual ( [ false ] )
258
258
} )
@@ -264,8 +264,8 @@ test("useAsync passes initialValue to children immediately", async () => {
264
264
{ ( { data } ) => data }
265
265
</ Async >
266
266
)
267
- const { getByText, rerender } = render ( component )
268
- rerender ( component )
267
+ const { getByText } = render ( component )
268
+ flushEffects ( )
269
269
await waitForElement ( ( ) => getByText ( "done" ) )
270
270
} )
271
271
@@ -277,8 +277,8 @@ test("useAsync sets error instead of data when initialValue is an Error object",
277
277
{ ( { error } ) => error . message }
278
278
</ Async >
279
279
)
280
- const { getByText, rerender } = render ( component )
281
- rerender ( component )
280
+ const { getByText } = render ( component )
281
+ flushEffects ( )
282
282
await waitForElement ( ( ) => getByText ( "oops" ) )
283
283
} )
284
284
@@ -296,8 +296,8 @@ test("useAsync can be nested", async () => {
296
296
) }
297
297
</ Async >
298
298
)
299
- const { getByText, rerender } = render ( component )
300
- rerender ( component )
299
+ const { getByText } = render ( component )
300
+ flushEffects ( )
301
301
await waitForElement ( ( ) => getByText ( "outer undefined" ) )
302
302
await waitForElement ( ( ) => getByText ( "outer inner" ) )
303
303
} )
0 commit comments