1
+ import '@testing-library/jest-dom' ; // see: https://testing-library.com/docs/react-testing-library/setup
2
+ import { act , render , renderHook , screen , waitFor } from '@testing-library/react' ;
3
+ import * as React from 'react' ;
1
4
import {
5
+ ErrorCode ,
2
6
EvaluationContext ,
7
+ EvaluationDetails ,
3
8
Hook ,
4
9
InMemoryProvider ,
5
10
OpenFeature ,
6
- StandardResolutionReasons ,
7
- EvaluationDetails ,
8
- ErrorCode ,
9
- } from '@openfeature/web-sdk' ;
10
- import '@testing-library/jest-dom' ; // see: https://testing-library.com/docs/react-testing-library/setup
11
- import { act , render , renderHook , screen , waitFor } from '@testing-library/react' ;
12
- import * as React from 'react' ;
13
- import {
14
11
OpenFeatureProvider ,
12
+ StandardResolutionReasons ,
15
13
useBooleanFlagDetails ,
16
14
useBooleanFlagValue ,
17
15
useFlag ,
@@ -26,6 +24,7 @@ import {
26
24
import { TestingProvider } from './test.utils' ;
27
25
import { HookFlagQuery } from '../src/evaluation/hook-flag-query' ;
28
26
import { startTransition , useState } from 'react' ;
27
+ import { jest } from '@jest/globals' ;
29
28
30
29
describe ( 'evaluation' , ( ) => {
31
30
const EVALUATION = 'evaluation' ;
@@ -332,6 +331,10 @@ describe('evaluation', () => {
332
331
await OpenFeature . setContext ( RERENDER_DOMAIN , { } ) ;
333
332
} ) ;
334
333
334
+ afterEach ( ( ) => {
335
+ jest . clearAllMocks ( ) ;
336
+ } ) ;
337
+
335
338
it ( 'should not rerender on context change because the evaluated values did not change' , async ( ) => {
336
339
const TestComponent = TestComponentFactory ( ) ;
337
340
render (
@@ -366,6 +369,24 @@ describe('evaluation', () => {
366
369
expect ( screen . queryByTestId ( 'render-count' ) ) . toHaveTextContent ( '2' ) ;
367
370
} ) ;
368
371
372
+ it ( 'should not render on flag change because the provider did not include changed flags in the change event' , async ( ) => {
373
+ const TestComponent = TestComponentFactory ( ) ;
374
+ render (
375
+ < OpenFeatureProvider domain = { RERENDER_DOMAIN } >
376
+ < TestComponent > </ TestComponent >
377
+ </ OpenFeatureProvider > ,
378
+ ) ;
379
+
380
+ expect ( screen . queryByTestId ( 'render-count' ) ) . toHaveTextContent ( '1' ) ;
381
+ await act ( async ( ) => {
382
+ await rerenderProvider . putConfiguration ( {
383
+ ...FLAG_CONFIG ,
384
+ } ) ;
385
+ } ) ;
386
+
387
+ expect ( screen . queryByTestId ( 'render-count' ) ) . toHaveTextContent ( '1' ) ;
388
+ } ) ;
389
+
369
390
it ( 'should not rerender on flag change because the evaluated values did not change' , async ( ) => {
370
391
const TestComponent = TestComponentFactory ( ) ;
371
392
render (
@@ -393,8 +414,37 @@ describe('evaluation', () => {
393
414
expect ( screen . queryByTestId ( 'render-count' ) ) . toHaveTextContent ( '1' ) ;
394
415
} ) ;
395
416
417
+ it ( 'should not rerender on flag change because the config values did not change' , async ( ) => {
418
+ const TestComponent = TestComponentFactory ( ) ;
419
+ const resolverSpy = jest . spyOn ( rerenderProvider , 'resolveBooleanEvaluation' ) ;
420
+ render (
421
+ < OpenFeatureProvider domain = { RERENDER_DOMAIN } >
422
+ < TestComponent > </ TestComponent >
423
+ </ OpenFeatureProvider > ,
424
+ ) ;
425
+
426
+ expect ( screen . queryByTestId ( 'render-count' ) ) . toHaveTextContent ( '1' ) ;
427
+
428
+ await act ( async ( ) => {
429
+ await rerenderProvider . putConfiguration ( {
430
+ ...FLAG_CONFIG ,
431
+ } ) ;
432
+ } ) ;
433
+
434
+ expect ( screen . queryByTestId ( 'render-count' ) ) . toHaveTextContent ( '1' ) ;
435
+ // The resolver should not be called again because the flag config did not change
436
+ expect ( resolverSpy ) . toHaveBeenNthCalledWith (
437
+ 1 ,
438
+ BOOL_FLAG_KEY ,
439
+ expect . anything ( ) ,
440
+ expect . anything ( ) ,
441
+ expect . anything ( ) ,
442
+ ) ;
443
+ } ) ;
444
+
396
445
it ( 'should rerender on flag change because the evaluated values changed' , async ( ) => {
397
446
const TestComponent = TestComponentFactory ( ) ;
447
+ const resolverSpy = jest . spyOn ( rerenderProvider , 'resolveBooleanEvaluation' ) ;
398
448
render (
399
449
< OpenFeatureProvider domain = { RERENDER_DOMAIN } >
400
450
< TestComponent > </ TestComponent >
@@ -415,6 +465,26 @@ describe('evaluation', () => {
415
465
} ) ;
416
466
417
467
expect ( screen . queryByTestId ( 'render-count' ) ) . toHaveTextContent ( '2' ) ;
468
+
469
+ await act ( async ( ) => {
470
+ await rerenderProvider . putConfiguration ( {
471
+ ...FLAG_CONFIG ,
472
+ [ BOOL_FLAG_KEY ] : {
473
+ ...FLAG_CONFIG [ BOOL_FLAG_KEY ] ,
474
+ // Change the default variant to trigger a rerender
475
+ defaultVariant : 'on' ,
476
+ } ,
477
+ } ) ;
478
+ } ) ;
479
+
480
+ expect ( screen . queryByTestId ( 'render-count' ) ) . toHaveTextContent ( '3' ) ;
481
+ expect ( resolverSpy ) . toHaveBeenNthCalledWith (
482
+ 3 ,
483
+ BOOL_FLAG_KEY ,
484
+ expect . anything ( ) ,
485
+ expect . anything ( ) ,
486
+ expect . anything ( ) ,
487
+ ) ;
418
488
} ) ;
419
489
} ) ;
420
490
} ) ;
0 commit comments