@@ -56,6 +56,13 @@ export const common = Async => () => {
56
56
await waitForElement ( ( ) => getByText ( "outer undefined" ) )
57
57
await waitForElement ( ( ) => getByText ( "outer inner" ) )
58
58
} )
59
+
60
+ test ( "does not cancel on initial mount" , async ( ) => {
61
+ const onCancel = jest . fn ( )
62
+ const { getByText } = render ( < Async onCancel = { onCancel } > { ( ) => "done" } </ Async > )
63
+ await waitForElement ( ( ) => getByText ( "done" ) )
64
+ expect ( onCancel ) . not . toHaveBeenCalled ( )
65
+ } )
59
66
}
60
67
61
68
export const withPromise = Async => ( ) => {
@@ -112,29 +119,41 @@ export const withPromise = Async => () => {
112
119
} )
113
120
114
121
test ( "cancels a pending promise when unmounted" , async ( ) => {
122
+ const onCancel = jest . fn ( )
115
123
const onResolve = jest . fn ( )
116
- const { unmount } = render ( < Async promise = { resolveTo ( "ok" ) } onResolve = { onResolve } /> )
124
+ const { unmount } = render (
125
+ < Async promise = { resolveTo ( "ok" ) } onCancel = { onCancel } onResolve = { onResolve } />
126
+ )
117
127
unmount ( )
118
128
await sleep ( 10 )
129
+ expect ( onCancel ) . toHaveBeenCalled ( )
119
130
expect ( onResolve ) . not . toHaveBeenCalled ( )
120
131
} )
121
132
122
133
test ( "cancels and restarts the promise when `promise` changes" , async ( ) => {
123
134
const promise1 = resolveTo ( "one" )
124
135
const promise2 = resolveTo ( "two" )
136
+ const onCancel = jest . fn ( )
125
137
const onResolve = jest . fn ( )
126
- const { rerender } = render ( < Async promise = { promise1 } onResolve = { onResolve } /> )
127
- rerender ( < Async promise = { promise2 } onResolve = { onResolve } /> )
138
+ const { rerender } = render (
139
+ < Async promise = { promise1 } onCancel = { onCancel } onResolve = { onResolve } />
140
+ )
141
+ rerender ( < Async promise = { promise2 } onCancel = { onCancel } onResolve = { onResolve } /> )
128
142
await sleep ( 10 )
143
+ expect ( onCancel ) . toHaveBeenCalled ( )
129
144
expect ( onResolve ) . not . toHaveBeenCalledWith ( "one" )
130
145
expect ( onResolve ) . toHaveBeenCalledWith ( "two" )
131
146
} )
132
147
133
148
test ( "cancels the promise when `promise` is unset" , async ( ) => {
149
+ const onCancel = jest . fn ( )
134
150
const onResolve = jest . fn ( )
135
- const { rerender } = render ( < Async promise = { resolveTo ( ) } onResolve = { onResolve } /> )
136
- rerender ( < Async onResolve = { onResolve } /> )
151
+ const { rerender } = render (
152
+ < Async promise = { resolveTo ( ) } onCancel = { onCancel } onResolve = { onResolve } />
153
+ )
154
+ rerender ( < Async onCancel = { onCancel } onResolve = { onResolve } /> )
137
155
await sleep ( 10 )
156
+ expect ( onCancel ) . toHaveBeenCalled ( )
138
157
expect ( onResolve ) . not . toHaveBeenCalled ( )
139
158
} )
140
159
@@ -241,10 +260,11 @@ export const withPromiseFn = (Async, abortCtrl) => () => {
241
260
expect ( promiseFn ) . toHaveBeenCalledTimes ( 1 )
242
261
fireEvent . click ( getByText ( "increment" ) )
243
262
expect ( promiseFn ) . toHaveBeenCalledTimes ( 2 )
244
- expect ( abortCtrl . abort ) . toHaveBeenCalledTimes ( 1 )
263
+ expect ( abortCtrl . abort ) . toHaveBeenCalled ( )
264
+ abortCtrl . abort . mockClear ( )
245
265
fireEvent . click ( getByText ( "increment" ) )
246
266
expect ( promiseFn ) . toHaveBeenCalledTimes ( 3 )
247
- expect ( abortCtrl . abort ) . toHaveBeenCalledTimes ( 2 )
267
+ expect ( abortCtrl . abort ) . toHaveBeenCalled ( )
248
268
} )
249
269
250
270
test ( "re-runs the promise when `watchFn` returns truthy" , ( ) => {
@@ -271,31 +291,38 @@ export const withPromiseFn = (Async, abortCtrl) => () => {
271
291
expect ( promiseFn ) . toHaveBeenCalledTimes ( 1 )
272
292
fireEvent . click ( getByText ( "increment" ) )
273
293
expect ( promiseFn ) . toHaveBeenCalledTimes ( 1 )
274
- expect ( abortCtrl . abort ) . toHaveBeenCalledTimes ( 0 )
294
+ expect ( abortCtrl . abort ) . not . toHaveBeenCalled ( )
275
295
fireEvent . click ( getByText ( "increment" ) )
276
296
expect ( promiseFn ) . toHaveBeenCalledTimes ( 2 )
277
- expect ( abortCtrl . abort ) . toHaveBeenCalledTimes ( 1 )
297
+ expect ( abortCtrl . abort ) . toHaveBeenCalled ( )
278
298
} )
279
299
280
300
test ( "cancels a pending promise when unmounted" , async ( ) => {
301
+ const onCancel = jest . fn ( )
281
302
const onResolve = jest . fn ( )
282
- const { unmount } = render ( < Async promiseFn = { ( ) => resolveTo ( "ok" ) } onResolve = { onResolve } /> )
303
+ const { unmount } = render (
304
+ < Async promiseFn = { ( ) => resolveTo ( "ok" ) } onCancel = { onCancel } onResolve = { onResolve } />
305
+ )
283
306
unmount ( )
284
307
await sleep ( 10 )
308
+ expect ( onCancel ) . toHaveBeenCalled ( )
285
309
expect ( onResolve ) . not . toHaveBeenCalled ( )
286
310
expect ( abortCtrl . abort ) . toHaveBeenCalledTimes ( 1 )
287
311
} )
288
312
289
313
test ( "cancels and restarts the promise when `promiseFn` changes" , async ( ) => {
290
314
const promiseFn1 = ( ) => resolveTo ( "one" )
291
315
const promiseFn2 = ( ) => resolveTo ( "two" )
316
+ const onCancel = jest . fn ( )
292
317
const onResolve = jest . fn ( )
293
- const { rerender } = render ( < Async promiseFn = { promiseFn1 } onResolve = { onResolve } /> )
294
- rerender ( < Async promiseFn = { promiseFn2 } onResolve = { onResolve } /> )
318
+ const { rerender } = render (
319
+ < Async promiseFn = { promiseFn1 } onCancel = { onCancel } onResolve = { onResolve } />
320
+ )
321
+ rerender ( < Async promiseFn = { promiseFn2 } onCancel = { onCancel } onResolve = { onResolve } /> )
295
322
await sleep ( 10 )
323
+ expect ( onCancel ) . toHaveBeenCalled ( )
296
324
expect ( onResolve ) . not . toHaveBeenCalledWith ( "one" )
297
325
expect ( onResolve ) . toHaveBeenCalledWith ( "two" )
298
- expect ( abortCtrl . abort ) . toHaveBeenCalledTimes ( 1 )
299
326
} )
300
327
301
328
test ( "cancels the promise when `promiseFn` is unset" , async ( ) => {
0 commit comments