@@ -336,39 +336,43 @@ describe('SplitFactoryProvider', () => {
336
336
logSpy . mockRestore ( ) ;
337
337
} ) ;
338
338
339
- test ( 'cleans up on update and unmount.' , ( ) => {
339
+ test ( 'cleans up on update and unmount if config prop is provided .' , ( ) => {
340
340
let renderTimes = 0 ;
341
341
const createdFactories = new Set < SplitIO . ISDK > ( ) ;
342
342
const clientDestroySpies : jest . SpyInstance [ ] = [ ] ;
343
+ const outerFactory = SplitSdk ( sdkBrowser ) ;
343
344
344
345
const Component = ( { factory, isReady, hasTimedout } : ISplitFactoryChildProps ) => {
345
346
renderTimes ++ ;
346
- if ( factory ) createdFactories . add ( factory ) ;
347
347
348
348
switch ( renderTimes ) {
349
349
case 1 :
350
- case 3 :
350
+ expect ( factory ) . toBe ( outerFactory ) ;
351
+ return null ;
352
+ case 2 :
353
+ case 5 :
351
354
expect ( isReady ) . toBe ( false ) ;
352
355
expect ( hasTimedout ) . toBe ( false ) ;
353
356
expect ( factory ) . toBe ( null ) ;
354
357
return null ;
355
-
356
- case 2 :
358
+ case 3 :
357
359
case 4 :
360
+ case 6 :
358
361
expect ( isReady ) . toBe ( true ) ;
359
362
expect ( hasTimedout ) . toBe ( true ) ;
360
- expect ( __factories . size ) . toBe ( 1 ) ;
361
- clientDestroySpies . push ( jest . spyOn ( ( factory as SplitIO . ISDK ) . client ( ) , 'destroy' ) ) ;
363
+ expect ( factory ) . not . toBe ( null ) ;
364
+ createdFactories . add ( factory ! ) ;
365
+ clientDestroySpies . push ( jest . spyOn ( factory ! . client ( ) , 'destroy' ) ) ;
362
366
return (
363
367
< SplitClient splitKey = 'other_key' >
364
368
{ ( { client } ) => {
365
- clientDestroySpies . push ( jest . spyOn ( client as SplitIO . IClient , 'destroy' ) ) ;
369
+ clientDestroySpies . push ( jest . spyOn ( client ! , 'destroy' ) ) ;
366
370
return null ;
367
371
} }
368
372
</ SplitClient >
369
373
) ;
370
- case 5 :
371
- throw new Error ( 'Child must not be rerendered ' ) ;
374
+ case 7 :
375
+ throw new Error ( 'Must not rerender ' ) ;
372
376
}
373
377
} ;
374
378
@@ -378,24 +382,41 @@ describe('SplitFactoryProvider', () => {
378
382
factory . client ( ) . __emitter__ . emit ( Event . SDK_READY )
379
383
} ;
380
384
381
- // 1st render
385
+ // 1st render: factory provided
382
386
const wrapper = render (
387
+ < SplitFactoryProvider factory = { outerFactory } >
388
+ { Component }
389
+ </ SplitFactoryProvider >
390
+ ) ;
391
+
392
+ // 2nd render: factory created, not ready (null)
393
+ wrapper . rerender (
383
394
< SplitFactoryProvider config = { sdkBrowser } >
384
395
{ Component }
385
396
</ SplitFactoryProvider >
386
397
) ;
387
398
388
- // 2nd render: SDK ready (timeout is ignored due to updateOnSdkTimedout=false)
399
+ // 3rd render: SDK ready (timeout is ignored due to updateOnSdkTimedout=false)
389
400
act ( emitSdkEvents ) ;
390
401
391
- // 3rd render: Update config prop -> factory is recreated
402
+ // 4th render: same config prop -> factory is not recreated
403
+ wrapper . rerender (
404
+ < SplitFactoryProvider config = { sdkBrowser } updateOnSdkReady = { false } updateOnSdkTimedout = { true } >
405
+ { Component }
406
+ </ SplitFactoryProvider >
407
+ ) ;
408
+
409
+ act ( emitSdkEvents ) ; // Emitting events again has no effect
410
+ expect ( createdFactories . size ) . toBe ( 1 ) ;
411
+
412
+ // 5th render: Update config prop -> factory is recreated, not ready yet (null)
392
413
wrapper . rerender (
393
414
< SplitFactoryProvider config = { { ...sdkBrowser } } updateOnSdkReady = { false } updateOnSdkTimedout = { true } >
394
415
{ Component }
395
416
</ SplitFactoryProvider >
396
417
) ;
397
418
398
- // 4th render: SDK timeout (ready is ignored due to updateOnSdkReady=false)
419
+ // 6th render: SDK timeout (ready is ignored due to updateOnSdkReady=false)
399
420
act ( emitSdkEvents ) ;
400
421
401
422
wrapper . unmount ( ) ;
@@ -415,11 +436,11 @@ describe('SplitFactoryProvider', () => {
415
436
{ ( { factory } ) => {
416
437
// if factory is provided as a prop, `factories` cache is not modified
417
438
expect ( __factories . size ) . toBe ( 0 ) ;
418
- destroyMainClientSpy = jest . spyOn ( ( factory as SplitIO . ISDK ) . client ( ) , 'destroy' ) ;
439
+ destroyMainClientSpy = jest . spyOn ( factory ! . client ( ) , 'destroy' ) ;
419
440
return (
420
441
< SplitClient splitKey = 'other_key' >
421
442
{ ( { client } ) => {
422
- destroySharedClientSpy = jest . spyOn ( client as SplitIO . IClient , 'destroy' ) ;
443
+ destroySharedClientSpy = jest . spyOn ( client ! , 'destroy' ) ;
423
444
return null ;
424
445
} }
425
446
</ SplitClient >
0 commit comments