@@ -251,13 +251,15 @@ test('requires either a fallback, fallbackRender, or FallbackComponent', () => {
251
251
console . error . mockClear ( )
252
252
} )
253
253
254
+ // eslint-disable-next-line max-statements
254
255
test ( 'supports automatic reset of error boundary when resetKeys change' , ( ) => {
255
256
const handleReset = jest . fn ( )
256
257
const TRY_AGAIN_ARG1 = 'TRY_AGAIN_ARG1'
257
258
const TRY_AGAIN_ARG2 = 'TRY_AGAIN_ARG2'
258
259
const handleResetKeysChange = jest . fn ( )
259
260
function App ( ) {
260
261
const [ explode , setExplode ] = React . useState ( false )
262
+ const [ extra , setExtra ] = React . useState ( false )
261
263
return (
262
264
< div >
263
265
< button onClick = { ( ) => setExplode ( e => ! e ) } > toggle explode</ button >
@@ -271,16 +273,19 @@ test('supports automatic reset of error boundary when resetKeys change', () => {
271
273
>
272
274
Try again
273
275
</ button >
276
+ < button onClick = { ( ) => setExtra ( e => ! e ) } >
277
+ toggle extra resetKey
278
+ </ button >
274
279
</ div >
275
280
) }
276
281
onReset = { ( ...args ) => {
277
282
setExplode ( false )
278
283
handleReset ( ...args )
279
284
} }
280
285
onResetKeysChange = { handleResetKeysChange }
281
- resetKeys = { [ explode ] }
286
+ resetKeys = { extra ? [ explode , extra ] : [ explode ] }
282
287
>
283
- { explode ? < Bomb /> : null }
288
+ { explode || extra ? < Bomb /> : null }
284
289
</ ErrorBoundary >
285
290
</ div >
286
291
)
@@ -316,6 +321,46 @@ test('supports automatic reset of error boundary when resetKeys change', () => {
316
321
expect ( handleReset ) . not . toHaveBeenCalled ( )
317
322
expect ( screen . queryByRole ( 'alert' ) ) . not . toBeInTheDocument ( )
318
323
expect ( console . error ) . not . toHaveBeenCalled ( )
324
+
325
+ // blow it up again
326
+ userEvent . click ( screen . getByText ( 'toggle explode' ) )
327
+ screen . getByRole ( 'alert' )
328
+ expect ( console . error ) . toHaveBeenCalledTimes ( 2 )
329
+ console . error . mockClear ( )
330
+
331
+ // toggles adding an extra resetKey to the array
332
+ // expect error to re-render
333
+ userEvent . click ( screen . getByText ( 'toggle extra resetKey' ) )
334
+ expect ( handleResetKeysChange ) . toHaveBeenCalledTimes ( 1 )
335
+ expect ( handleResetKeysChange ) . toHaveBeenCalledWith ( [ true ] , [ true , true ] )
336
+ handleResetKeysChange . mockClear ( )
337
+ screen . getByRole ( 'alert' )
338
+ expect ( console . error ) . toHaveBeenCalledTimes ( 2 )
339
+ console . error . mockClear ( )
340
+
341
+ // toggle explode back to false
342
+ // expect error to re-render again
343
+ userEvent . click ( screen . getByText ( 'toggle explode' ) )
344
+ expect ( handleReset ) . not . toHaveBeenCalled ( )
345
+ expect ( handleResetKeysChange ) . toHaveBeenCalledTimes ( 1 )
346
+ expect ( handleResetKeysChange ) . toHaveBeenCalledWith (
347
+ [ true , true ] ,
348
+ [ false , true ] ,
349
+ )
350
+ screen . getByRole ( 'alert' )
351
+ handleResetKeysChange . mockClear ( )
352
+ expect ( console . error ) . toHaveBeenCalledTimes ( 2 )
353
+ console . error . mockClear ( )
354
+
355
+ // toggle extra resetKey
356
+ // expect error to be reset
357
+ userEvent . click ( screen . getByText ( 'toggle extra resetKey' ) )
358
+ expect ( handleReset ) . not . toHaveBeenCalled ( )
359
+ expect ( handleResetKeysChange ) . toHaveBeenCalledTimes ( 1 )
360
+ expect ( handleResetKeysChange ) . toHaveBeenCalledWith ( [ false , true ] , [ false ] )
361
+ handleResetKeysChange . mockClear ( )
362
+ expect ( screen . queryByRole ( 'alert' ) ) . not . toBeInTheDocument ( )
363
+ expect ( console . error ) . not . toHaveBeenCalled ( )
319
364
} )
320
365
321
366
/*
0 commit comments