@@ -3,9 +3,10 @@ import React from "react"
33import { render , fireEvent , cleanup , waitForElement } from "react-testing-library"
44import Async , { createInstance } from "./"
55
6- const abortController = { abort : ( ) => { } }
7- window . AbortController = jest . fn ( ) . mockImplementation ( ( ) => abortController )
6+ const abortCtrl = { abort : jest . fn ( ) }
7+ window . AbortController = jest . fn ( ) . mockImplementation ( ( ) => abortCtrl )
88
9+ beforeEach ( abortCtrl . abort . mockClear )
910afterEach ( cleanup )
1011
1112const resolveIn = ms => value => new Promise ( resolve => setTimeout ( resolve , ms , value ) )
@@ -23,7 +24,7 @@ describe("Async", () => {
2324 test ( "calls promiseFn with props" , ( ) => {
2425 const promiseFn = jest . fn ( ) . mockReturnValue ( Promise . resolve ( ) )
2526 render ( < Async promiseFn = { promiseFn } anotherProp = "123" /> )
26- expect ( promiseFn ) . toHaveBeenCalledWith ( { promiseFn, anotherProp : "123" } , abortController )
27+ expect ( promiseFn ) . toHaveBeenCalledWith ( { promiseFn, anotherProp : "123" } , abortCtrl )
2728 } )
2829
2930 test ( "passes resolved data to children as render prop" , async ( ) => {
@@ -99,6 +100,7 @@ describe("Async", () => {
99100 expect ( promiseFn ) . toHaveBeenCalledTimes ( 1 )
100101 fireEvent . click ( getByText ( "reload" ) )
101102 expect ( promiseFn ) . toHaveBeenCalledTimes ( 2 )
103+ expect ( abortCtrl . abort ) . toHaveBeenCalledTimes ( 1 )
102104 } )
103105
104106 test ( "re-runs the promise when the value of 'watch' changes" , ( ) => {
@@ -121,11 +123,13 @@ describe("Async", () => {
121123 expect ( promiseFn ) . toHaveBeenCalledTimes ( 1 )
122124 fireEvent . click ( getByText ( "increment" ) )
123125 expect ( promiseFn ) . toHaveBeenCalledTimes ( 2 )
126+ expect ( abortCtrl . abort ) . toHaveBeenCalledTimes ( 1 )
124127 fireEvent . click ( getByText ( "increment" ) )
125128 expect ( promiseFn ) . toHaveBeenCalledTimes ( 3 )
129+ expect ( abortCtrl . abort ) . toHaveBeenCalledTimes ( 2 )
126130 } )
127131
128- test ( "runs deferFn only when explicitly invoked, passing arguments and props " , ( ) => {
132+ test ( "runs deferFn only when explicitly invoked, passing arguments, props and AbortController " , ( ) => {
129133 let counter = 1
130134 const deferFn = jest . fn ( ) . mockReturnValue ( resolveTo ( ) )
131135 const { getByText } = render (
@@ -135,21 +139,12 @@ describe("Async", () => {
135139 } }
136140 </ Async >
137141 )
142+ const props = { deferFn, foo : "bar" }
138143 expect ( deferFn ) . not . toHaveBeenCalled ( )
139144 fireEvent . click ( getByText ( "run" ) )
140- expect ( deferFn ) . toHaveBeenCalledWith (
141- "go" ,
142- 1 ,
143- expect . objectContaining ( { deferFn, foo : "bar" } ) ,
144- abortController
145- )
145+ expect ( deferFn ) . toHaveBeenCalledWith ( "go" , 1 , expect . objectContaining ( props ) , abortCtrl )
146146 fireEvent . click ( getByText ( "run" ) )
147- expect ( deferFn ) . toHaveBeenCalledWith (
148- "go" ,
149- 2 ,
150- expect . objectContaining ( { deferFn, foo : "bar" } ) ,
151- abortController
152- )
147+ expect ( deferFn ) . toHaveBeenCalledWith ( "go" , 2 , expect . objectContaining ( props ) , abortCtrl )
153148 } )
154149
155150 test ( "reload uses the arguments of the previous run" , ( ) => {
@@ -169,26 +164,11 @@ describe("Async", () => {
169164 )
170165 expect ( deferFn ) . not . toHaveBeenCalled ( )
171166 fireEvent . click ( getByText ( "run" ) )
172- expect ( deferFn ) . toHaveBeenCalledWith (
173- "go" ,
174- 1 ,
175- expect . objectContaining ( { deferFn } ) ,
176- abortController
177- )
167+ expect ( deferFn ) . toHaveBeenCalledWith ( "go" , 1 , expect . objectContaining ( { deferFn } ) , abortCtrl )
178168 fireEvent . click ( getByText ( "run" ) )
179- expect ( deferFn ) . toHaveBeenCalledWith (
180- "go" ,
181- 2 ,
182- expect . objectContaining ( { deferFn } ) ,
183- abortController
184- )
169+ expect ( deferFn ) . toHaveBeenCalledWith ( "go" , 2 , expect . objectContaining ( { deferFn } ) , abortCtrl )
185170 fireEvent . click ( getByText ( "reload" ) )
186- expect ( deferFn ) . toHaveBeenCalledWith (
187- "go" ,
188- 2 ,
189- expect . objectContaining ( { deferFn } ) ,
190- abortController
191- )
171+ expect ( deferFn ) . toHaveBeenCalledWith ( "go" , 2 , expect . objectContaining ( { deferFn } ) , abortCtrl )
192172 } )
193173
194174 test ( "only accepts the last invocation of the promise" , async ( ) => {
@@ -236,6 +216,7 @@ describe("Async", () => {
236216 unmount ( )
237217 await Promise . resolve ( )
238218 expect ( onResolve ) . not . toHaveBeenCalled ( )
219+ expect ( abortCtrl . abort ) . toHaveBeenCalledTimes ( 1 )
239220 } )
240221
241222 test ( "cancels and restarts the promise when promiseFn changes" , async ( ) => {
@@ -247,6 +228,17 @@ describe("Async", () => {
247228 await Promise . resolve ( )
248229 expect ( onResolve ) . not . toHaveBeenCalledWith ( "one" )
249230 expect ( onResolve ) . toHaveBeenCalledWith ( "two" )
231+ expect ( abortCtrl . abort ) . toHaveBeenCalledTimes ( 1 )
232+ } )
233+
234+ test ( "cancels the promise when promiseFn is unset" , async ( ) => {
235+ const promiseFn = jest . fn ( ) . mockReturnValue ( Promise . resolve ( "one" ) )
236+ const onResolve = jest . fn ( )
237+ const { rerender } = render ( < Async promiseFn = { promiseFn } onResolve = { onResolve } /> )
238+ rerender ( < Async onResolve = { onResolve } /> )
239+ await Promise . resolve ( )
240+ expect ( onResolve ) . not . toHaveBeenCalledWith ( "one" )
241+ expect ( abortCtrl . abort ) . toHaveBeenCalledTimes ( 1 )
250242 } )
251243
252244 test ( "does not run promiseFn on mount when initialValue is provided" , ( ) => {
0 commit comments