11import "jest-dom/extend-expect"
22import React from "react"
3- import { render , fireEvent , cleanup , waitForElement } from "react-testing-library"
3+ import { render , fireEvent , cleanup , waitForElement , flushEffects } from "react-testing-library"
44import { useAsync } from "."
55
66afterEach ( cleanup )
@@ -13,16 +13,16 @@ const Async = ({ children = () => null, ...props }) => children(useAsync(props))
1313test ( "useAsync returns render props" , async ( ) => {
1414 const promiseFn = ( ) => new Promise ( resolve => setTimeout ( resolve , 0 , "done" ) )
1515 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 ( )
1818 await waitForElement ( ( ) => getByText ( "done" ) )
1919} )
2020
2121test ( "useAsync passes rejection error to children as render prop" , async ( ) => {
2222 const promiseFn = ( ) => Promise . reject ( "oops" )
2323 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 ( )
2626 await waitForElement ( ( ) => getByText ( "oops" ) )
2727} )
2828
@@ -37,8 +37,8 @@ test("useAsync passes isLoading boolean while the promise is running", async ()
3737 } }
3838 </ Async >
3939 )
40- const { getByText, rerender } = render ( component )
41- rerender ( component )
40+ const { getByText } = render ( component )
41+ flushEffects ( )
4242 await waitForElement ( ( ) => getByText ( "done" ) )
4343 expect ( states ) . toEqual ( [ true , true , false ] )
4444} )
@@ -56,8 +56,8 @@ test("useAsync passes startedAt date when the promise starts", async () => {
5656 } }
5757 </ Async >
5858 )
59- const { getByText, rerender } = render ( component )
60- rerender ( component )
59+ const { getByText } = render ( component )
60+ flushEffects ( )
6161 await waitForElement ( ( ) => getByText ( "started" ) )
6262} )
6363
@@ -74,16 +74,16 @@ test("useAsync passes finishedAt date when the promise finishes", async () => {
7474 } }
7575 </ Async >
7676 )
77- const { getByText, rerender } = render ( component )
78- rerender ( component )
77+ const { getByText } = render ( component )
78+ flushEffects ( )
7979 await waitForElement ( ( ) => getByText ( "done" ) )
8080} )
8181
8282test ( "useAsync passes reload function that re-runs the promise" , async ( ) => {
8383 const promiseFn = jest . fn ( ) . mockReturnValue ( resolveTo ( "done" ) )
8484 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 ( )
8787 expect ( promiseFn ) . toHaveBeenCalledTimes ( 1 )
8888 fireEvent . click ( getByText ( "reload" ) )
8989 expect ( promiseFn ) . toHaveBeenCalledTimes ( 2 )
@@ -104,14 +104,14 @@ test("useAsync re-runs the promise when the value of 'watch' changes", () => {
104104 }
105105 const promiseFn = jest . fn ( ) . mockReturnValue ( resolveTo ( ) )
106106 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 ( )
109109 expect ( promiseFn ) . toHaveBeenCalledTimes ( 1 )
110110 fireEvent . click ( getByText ( "increment" ) )
111- rerender ( component )
111+ flushEffects ( )
112112 expect ( promiseFn ) . toHaveBeenCalledTimes ( 2 )
113113 fireEvent . click ( getByText ( "increment" ) )
114- rerender ( component )
114+ flushEffects ( )
115115 expect ( promiseFn ) . toHaveBeenCalledTimes ( 3 )
116116} )
117117
@@ -125,8 +125,8 @@ test("useAsync runs deferFn only when explicitly invoked, passing arguments and
125125 } }
126126 </ Async >
127127 )
128- const { getByText, rerender } = render ( component )
129- rerender ( component )
128+ const { getByText } = render ( component )
129+ flushEffects ( )
130130 expect ( deferFn ) . not . toHaveBeenCalled ( )
131131 fireEvent . click ( getByText ( "run" ) )
132132 expect ( deferFn ) . toHaveBeenCalledWith ( "go" , 1 , expect . objectContaining ( { deferFn, foo : "bar" } ) )
@@ -149,8 +149,8 @@ test("useAsync reload uses the arguments of the previous run", () => {
149149 } }
150150 </ Async >
151151 )
152- const { getByText, rerender } = render ( component )
153- rerender ( component )
152+ const { getByText } = render ( component )
153+ flushEffects ( )
154154 expect ( deferFn ) . not . toHaveBeenCalled ( )
155155 fireEvent . click ( getByText ( "run" ) )
156156 expect ( deferFn ) . toHaveBeenCalledWith ( "go" , 1 , expect . objectContaining ( { deferFn } ) )
@@ -187,8 +187,8 @@ test("useAsync invokes onResolve callback when promise resolves", async () => {
187187 const promiseFn = jest . fn ( ) . mockReturnValue ( Promise . resolve ( "ok" ) )
188188 const onResolve = jest . fn ( )
189189 const component = < Async promiseFn = { promiseFn } onResolve = { onResolve } />
190- const { rerender } = render ( component )
191- rerender ( component )
190+ render ( component )
191+ flushEffects ( )
192192 await Promise . resolve ( )
193193 expect ( onResolve ) . toHaveBeenCalledWith ( "ok" )
194194} )
@@ -197,8 +197,8 @@ test("useAsync invokes onReject callback when promise rejects", async () => {
197197 const promiseFn = jest . fn ( ) . mockReturnValue ( Promise . reject ( "err" ) )
198198 const onReject = jest . fn ( )
199199 const component = < Async promiseFn = { promiseFn } onReject = { onReject } />
200- const { rerender } = render ( component )
201- rerender ( component )
200+ render ( component )
201+ flushEffects ( )
202202 await Promise . resolve ( )
203203 expect ( onReject ) . toHaveBeenCalledWith ( "err" )
204204} )
@@ -207,8 +207,8 @@ test("useAsync cancels pending promise when unmounted", async () => {
207207 const promiseFn = jest . fn ( ) . mockReturnValue ( Promise . resolve ( "ok" ) )
208208 const onResolve = jest . fn ( )
209209 const component = < Async promiseFn = { promiseFn } onResolve = { onResolve } />
210- const { unmount, rerender } = render ( component )
211- rerender ( component )
210+ const { unmount } = render ( component )
211+ flushEffects ( )
212212 unmount ( )
213213 await Promise . resolve ( )
214214 expect ( onResolve ) . not . toHaveBeenCalled ( )
@@ -222,10 +222,10 @@ test("useAsync cancels and restarts the promise when promiseFn changes", async (
222222 const component2 = < Async promiseFn = { promiseFn2 } onResolve = { onResolve } />
223223 const { rerender } = render ( component1 )
224224 await Promise . resolve ( )
225- rerender ( component1 )
225+ flushEffects ( )
226226 expect ( promiseFn1 ) . toHaveBeenCalled ( )
227227 rerender ( component2 )
228- rerender ( component2 )
228+ flushEffects ( )
229229 expect ( promiseFn2 ) . toHaveBeenCalled ( )
230230 expect ( onResolve ) . not . toHaveBeenCalledWith ( "one" )
231231 await Promise . resolve ( )
@@ -235,8 +235,8 @@ test("useAsync cancels and restarts the promise when promiseFn changes", async (
235235test ( "useAsync does not run promiseFn on mount when initialValue is provided" , ( ) => {
236236 const promiseFn = jest . fn ( ) . mockReturnValue ( Promise . resolve ( ) )
237237 const component = < Async promiseFn = { promiseFn } initialValue = { { } } />
238- const { rerender } = render ( component )
239- rerender ( component )
238+ render ( component )
239+ flushEffects ( )
240240 expect ( promiseFn ) . not . toHaveBeenCalled ( )
241241} )
242242
@@ -251,8 +251,8 @@ test("useAsync does not start loading when using initialValue", async () => {
251251 } }
252252 </ Async >
253253 )
254- const { getByText, rerender } = render ( component )
255- rerender ( component )
254+ const { getByText } = render ( component )
255+ flushEffects ( )
256256 await waitForElement ( ( ) => getByText ( "done" ) )
257257 expect ( states ) . toEqual ( [ false ] )
258258} )
@@ -264,8 +264,8 @@ test("useAsync passes initialValue to children immediately", async () => {
264264 { ( { data } ) => data }
265265 </ Async >
266266 )
267- const { getByText, rerender } = render ( component )
268- rerender ( component )
267+ const { getByText } = render ( component )
268+ flushEffects ( )
269269 await waitForElement ( ( ) => getByText ( "done" ) )
270270} )
271271
@@ -277,8 +277,8 @@ test("useAsync sets error instead of data when initialValue is an Error object",
277277 { ( { error } ) => error . message }
278278 </ Async >
279279 )
280- const { getByText, rerender } = render ( component )
281- rerender ( component )
280+ const { getByText } = render ( component )
281+ flushEffects ( )
282282 await waitForElement ( ( ) => getByText ( "oops" ) )
283283} )
284284
@@ -296,8 +296,8 @@ test("useAsync can be nested", async () => {
296296 ) }
297297 </ Async >
298298 )
299- const { getByText, rerender } = render ( component )
300- rerender ( component )
299+ const { getByText } = render ( component )
300+ flushEffects ( )
301301 await waitForElement ( ( ) => getByText ( "outer undefined" ) )
302302 await waitForElement ( ( ) => getByText ( "outer inner" ) )
303303} )
0 commit comments