@@ -25,10 +25,14 @@ import { OptimizelyProvider } from './Provider';
2525import  {  ReactSDKClient  }  from  './client' ; 
2626import  {  OptimizelyVariation  }  from  './Variation' ; 
2727
28+ type  Resolver  =  { 
29+   resolve : ( value : {  success : boolean ;  reason ?: string  } )  =>  void ; 
30+   reject : ( reason ?: string )  =>  void ; 
31+ } ; 
32+ 
2833describe ( '<OptimizelyExperiment>' ,  ( )  =>  { 
2934  const  variationKey  =  'matchingVariation' ; 
30-   // eslint-disable-next-line @typescript-eslint/no-explicit-any 
31-   let  resolver : any ; 
35+   let  resolver : Resolver ; 
3236  let  optimizelyMock : ReactSDKClient ; 
3337  let  isReady : boolean ; 
3438
@@ -58,25 +62,48 @@ describe('<OptimizelyExperiment>', () => {
5862      getIsReadyPromiseFulfilled : ( )  =>  true , 
5963      getIsUsingSdkKey : ( )  =>  true , 
6064      onForcedVariationsUpdate : jest . fn ( ) . mockReturnValue ( ( )  =>  { } ) , 
65+       setUser : jest . fn ( ) , 
6166    }  as  unknown  as  ReactSDKClient ; 
6267  } ) ; 
6368
6469  it ( 'does not throw an error when not rendered in the context of an OptimizelyProvider' ,  ( )  =>  { 
65-     expect ( ( )  =>  { 
66-       render ( 
70+     const  {  container }  =  render ( 
71+       < OptimizelyExperiment  experiment = "experiment1" > 
72+         { ( variation : string  |  null )  =>  < span  data-testid = "variation-key" > { variation } </ span > } 
73+       </ OptimizelyExperiment > 
74+     ) ; 
75+ 
76+     expect ( container ) . toBeDefined ( ) ; 
77+   } ) ; 
78+ 
79+   it ( 'isValidElement check works as expected' ,  async  ( )  =>  { 
80+     const  {  container }  =  render ( 
81+       < OptimizelyProvider  optimizely = { optimizelyMock } > 
6782        < OptimizelyExperiment  experiment = "experiment1" > 
68-           { ( variation : string )  =>  < span  data-testid = "variation-key" > { variation } </ span > } 
83+           { ( variation : string  |  null )  =>  ( 
84+             < > 
85+               < span  data-testid = "variation-key" > { variation } </ span > 
86+               { null } 
87+               { < div  /> } 
88+             </ > 
89+           ) } 
6990        </ OptimizelyExperiment > 
70-       ) ; 
71-     } ) . toBeDefined ( ) ; 
91+       </ OptimizelyProvider > 
92+     ) ; 
93+     resolver . resolve ( {  success : true  } ) ; 
94+ 
95+     await  waitFor ( ( )  =>  { 
96+       const  validChildren  =  container . getElementsByTagName ( 'span' ) ; 
97+       expect ( validChildren ) . toHaveLength ( 1 ) ; 
98+     } ) ; 
7299  } ) ; 
73100
74101  describe ( 'when isServerSide prop is false' ,  ( )  =>  { 
75102    it ( 'should wait client is ready then render result of activate' ,  async  ( )  =>  { 
76103      const  {  container,  rerender }  =  render ( 
77104        < OptimizelyProvider  optimizely = { optimizelyMock }  timeout = { 100 } > 
78105          < OptimizelyExperiment  experiment = "experiment1" > 
79-             { ( variation : string )  =>  < span  data-testid = "variation-key" > { variation } </ span > } 
106+             { ( variation : string   |   null )  =>  < span  data-testid = "variation-key" > { variation } </ span > } 
80107          </ OptimizelyExperiment > 
81108        </ OptimizelyProvider > 
82109      ) ; 
@@ -89,12 +116,10 @@ describe('<OptimizelyExperiment>', () => {
89116      // Simulate client becoming ready: onReady resolving, firing config update notification 
90117      resolver . resolve ( {  success : true  } ) ; 
91118
92-       await  optimizelyMock . onReady ( ) ; 
93- 
94119      rerender ( 
95120        < OptimizelyProvider  optimizely = { optimizelyMock } > 
96121          < OptimizelyExperiment  experiment = "experiment1" > 
97-             { ( variation : string )  =>  < span  data-testid = "variation-key" > { variation } </ span > } 
122+             { ( variation : string   |   null )  =>  < span  data-testid = "variation-key" > { variation } </ span > } 
98123          </ OptimizelyExperiment > 
99124        </ OptimizelyProvider > 
100125      ) ; 
@@ -108,7 +133,7 @@ describe('<OptimizelyExperiment>', () => {
108133      const  {  container }  =  render ( 
109134        < OptimizelyProvider  optimizely = { optimizelyMock }  timeout = { 100 } > 
110135          < OptimizelyExperiment  experiment = "experiment1"  timeout = { 200 } > 
111-             { ( variation : string )  =>  < span  data-testid = "variation-key" > { variation } </ span > } 
136+             { ( variation : string   |   null )  =>  < span  data-testid = "variation-key" > { variation } </ span > } 
112137          </ OptimizelyExperiment > 
113138        </ OptimizelyProvider > 
114139      ) ; 
@@ -120,16 +145,15 @@ describe('<OptimizelyExperiment>', () => {
120145
121146      //   Simulate client becoming ready; onReady resolving, firing config update notification 
122147      resolver . resolve ( {  success : true  } ) ; 
123-       await  optimizelyMock . onReady ( ) ; 
124148
125-       expect ( optimizelyMock . activate ) . toHaveBeenCalledWith ( 'experiment1' ,  undefined ,  undefined ) ; 
149+       await   waitFor ( ( )   =>   expect ( optimizelyMock . activate ) . toHaveBeenCalledWith ( 'experiment1' ,  undefined ,  undefined ) ) ; 
126150    } ) ; 
127151
128152    it ( `should use the Experiment prop's timeout when there is no timeout passed to <Provider>` ,  async  ( )  =>  { 
129153      const  {  container }  =  render ( 
130154        < OptimizelyProvider  optimizely = { optimizelyMock } > 
131155          < OptimizelyExperiment  experiment = "experiment1"  timeout = { 200 } > 
132-             { ( variation : string )  =>  < span  data-testid = "variation-key" > { variation } </ span > } 
156+             { ( variation : string   |   null )  =>  < span  data-testid = "variation-key" > { variation } </ span > } 
133157          </ OptimizelyExperiment > 
134158        </ OptimizelyProvider > 
135159      ) ; 
@@ -141,9 +165,8 @@ describe('<OptimizelyExperiment>', () => {
141165
142166      //   Simulate client becoming ready 
143167      resolver . resolve ( {  success : true  } ) ; 
144-       await  optimizelyMock . onReady ( ) ; 
145168
146-       expect ( optimizelyMock . activate ) . toHaveBeenCalledWith ( 'experiment1' ,  undefined ,  undefined ) ; 
169+       await   waitFor ( ( )   =>   expect ( optimizelyMock . activate ) . toHaveBeenCalledWith ( 'experiment1' ,  undefined ,  undefined ) ) ; 
147170    } ) ; 
148171
149172    it ( 'should render using <OptimizelyVariation> when the variationKey matches' ,  async  ( )  =>  { 
@@ -162,14 +185,13 @@ describe('<OptimizelyExperiment>', () => {
162185          </ OptimizelyExperiment > 
163186        </ OptimizelyProvider > 
164187      ) ; 
188+ 
165189      // while it's waiting for onReady() 
166190      expect ( container . innerHTML ) . toBe ( '' ) ; 
167191
168192      // Simulate client becoming ready 
169193      resolver . resolve ( {  success : true  } ) ; 
170194
171-       await  optimizelyMock . onReady ( ) ; 
172- 
173195      await  waitFor ( ( )  =>  expect ( screen . getByTestId ( 'variation-key' ) ) . toHaveTextContent ( 'correct variation' ) ) ; 
174196    } ) ; 
175197
@@ -194,8 +216,6 @@ describe('<OptimizelyExperiment>', () => {
194216      // Simulate client becoming ready 
195217      resolver . resolve ( {  success : true  } ) ; 
196218
197-       await  optimizelyMock . onReady ( ) ; 
198- 
199219      await  waitFor ( ( )  =>  expect ( screen . getByTestId ( 'variation-key' ) ) . toHaveTextContent ( 'default variation' ) ) ; 
200220    } ) ; 
201221
@@ -219,8 +239,6 @@ describe('<OptimizelyExperiment>', () => {
219239      // Simulate client becoming ready 
220240      resolver . resolve ( {  success : true  } ) ; 
221241
222-       await  optimizelyMock . onReady ( ) ; 
223- 
224242      await  waitFor ( ( )  =>  expect ( screen . getByTestId ( 'variation-key' ) ) . toHaveTextContent ( 'matching variation' ) ) ; 
225243    } ) ; 
226244
@@ -244,12 +262,10 @@ describe('<OptimizelyExperiment>', () => {
244262      // Simulate client becoming ready 
245263      resolver . resolve ( {  success : true  } ) ; 
246264
247-       await  optimizelyMock . onReady ( ) ; 
248- 
249265      await  waitFor ( ( )  =>  expect ( screen . getByTestId ( 'variation-key' ) ) . toHaveTextContent ( 'default variation' ) ) ; 
250266    } ) ; 
251267
252-     describe ( 'a  OptimizelyVariation with default & variation props' ,  ( )  =>  { 
268+     describe ( 'OptimizelyVariation with default & variation props' ,  ( )  =>  { 
253269      it ( 'should render default with NO matching variations ' ,  async  ( )  =>  { 
254270        const  {  container }  =  render ( 
255271          < OptimizelyProvider  optimizely = { optimizelyMock } > 
@@ -270,8 +286,6 @@ describe('<OptimizelyExperiment>', () => {
270286        // Simulate client becoming ready 
271287        resolver . resolve ( {  success : true  } ) ; 
272288
273-         await  optimizelyMock . onReady ( ) ; 
274- 
275289        await  waitFor ( ( )  => 
276290          expect ( screen . getByTestId ( 'variation-key' ) ) . toHaveTextContent ( 'default & non matching variation' ) 
277291        ) ; 
@@ -297,8 +311,6 @@ describe('<OptimizelyExperiment>', () => {
297311        // Simulate client becoming ready 
298312        resolver . resolve ( {  success : true  } ) ; 
299313
300-         await  optimizelyMock . onReady ( ) ; 
301- 
302314        await  waitFor ( ( )  =>  expect ( screen . getByTestId ( 'variation-key' ) ) . toHaveTextContent ( 'matching variation' ) ) ; 
303315      } ) ; 
304316    } ) ; 
@@ -329,8 +341,6 @@ describe('<OptimizelyExperiment>', () => {
329341      // Simulate client becoming ready 
330342      resolver . resolve ( {  success : true  } ) ; 
331343
332-       await  optimizelyMock . onReady ( ) ; 
333- 
334344      await  waitFor ( ( )  =>  expect ( screen . getByTestId ( 'variation-key' ) ) . toHaveTextContent ( 'non-matching variation 3' ) ) ; 
335345    } ) ; 
336346
@@ -354,8 +364,6 @@ describe('<OptimizelyExperiment>', () => {
354364      // Simulate client becoming ready 
355365      resolver . resolve ( {  success : true  } ) ; 
356366
357-       await  optimizelyMock . onReady ( ) ; 
358- 
359367      expect ( container . innerHTML ) . toBe ( '' ) ; 
360368    } ) ; 
361369
@@ -367,7 +375,7 @@ describe('<OptimizelyExperiment>', () => {
367375            overrideUserId = "james123" 
368376            overrideAttributes = { {  betaUser : true  } } 
369377          > 
370-             { ( variation : string )  =>  < span  data-testid = "variation-key" > { variation } </ span > } 
378+             { ( variation : string   |   null )  =>  < span  data-testid = "variation-key" > { variation } </ span > } 
371379          </ OptimizelyExperiment > 
372380        </ OptimizelyProvider > 
373381      ) ; 
@@ -380,18 +388,17 @@ describe('<OptimizelyExperiment>', () => {
380388      // Simulate client becoming ready 
381389      resolver . resolve ( {  success : true  } ) ; 
382390
383-       await  optimizelyMock . onReady ( ) ; 
384- 
385-       expect ( optimizelyMock . activate ) . toHaveBeenCalledWith ( 'experiment1' ,  'james123' ,  {  betaUser : true  } ) ; 
386- 
387-       await  waitFor ( ( )  =>  expect ( screen . getByTestId ( 'variation-key' ) ) . toHaveTextContent ( 'matchingVariation' ) ) ; 
391+       await  waitFor ( ( )  =>  { 
392+         expect ( optimizelyMock . activate ) . toHaveBeenCalledWith ( 'experiment1' ,  'james123' ,  {  betaUser : true  } ) ; 
393+         expect ( screen . getByTestId ( 'variation-key' ) ) . toHaveTextContent ( 'matchingVariation' ) ; 
394+       } ) ; 
388395    } ) ; 
389396
390397    it ( 'should pass the values for clientReady and didTimeout' ,  async  ( )  =>  { 
391398      const  {  container }  =  render ( 
392399        < OptimizelyProvider  optimizely = { optimizelyMock }  timeout = { 100 } > 
393400          < OptimizelyExperiment  experiment = "experiment1" > 
394-             { ( variation : string ,  clientReady : boolean ,  didTimeout : boolean )  =>  ( 
401+             { ( variation : string   |   null ,  clientReady ? : boolean ,  didTimeout ? : boolean )  =>  ( 
395402              < span  data-testid = "variation-key" > { `${ variation } ${ clientReady } ${ didTimeout }  } </ span > 
396403            ) } 
397404          </ OptimizelyExperiment > 
@@ -404,12 +411,10 @@ describe('<OptimizelyExperiment>', () => {
404411      // Simulate client becoming ready 
405412      resolver . resolve ( {  success : true  } ) ; 
406413
407-       await  optimizelyMock . onReady ( ) ; 
408- 
409-       expect ( optimizelyMock . activate ) . toHaveBeenCalledWith ( 'experiment1' ,  undefined ,  undefined ) ; 
410-       await  waitFor ( ( )  => 
411-         expect ( screen . getByTestId ( 'variation-key' ) ) . toHaveTextContent ( 'matchingVariation|true|false' ) 
412-       ) ; 
414+       await  waitFor ( ( )  =>  { 
415+         expect ( optimizelyMock . activate ) . toHaveBeenCalledWith ( 'experiment1' ,  undefined ,  undefined ) ; 
416+         expect ( screen . getByTestId ( 'variation-key' ) ) . toHaveTextContent ( 'matchingVariation|true|false' ) ; 
417+       } ) ; 
413418    } ) ; 
414419
415420    describe ( 'when the onReady() promise return { success: false }' ,  ( )  =>  { 
@@ -431,9 +436,8 @@ describe('<OptimizelyExperiment>', () => {
431436        expect ( container . innerHTML ) . toBe ( '' ) ; 
432437
433438        resolver . resolve ( {  success : false ,  reason : 'fail'  } ) ; 
434-         await  optimizelyMock . onReady ( ) ; 
435439
436-         expect ( container . innerHTML ) . toBe ( '' ) ; 
440+         await   waitFor ( ( )   =>   expect ( container . innerHTML ) . toBe ( '' ) ) ; 
437441      } ) ; 
438442    } ) ; 
439443  } ) ; 
@@ -443,9 +447,7 @@ describe('<OptimizelyExperiment>', () => {
443447      const  {  container }  =  render ( 
444448        < OptimizelyProvider  optimizely = { optimizelyMock }  timeout = { 100 } > 
445449          < OptimizelyExperiment  experiment = "experiment1"  autoUpdate = { true } > 
446-             { ( variation : string ,  clientReady : boolean ,  didTimeout : boolean )  =>  ( 
447-               < span  data-testid = "variation-key" > { variation } </ span > 
448-             ) } 
450+             { ( variation : string  |  null )  =>  < span  data-testid = "variation-key" > { variation } </ span > } 
449451          </ OptimizelyExperiment > 
450452        </ OptimizelyProvider > 
451453      ) ; 
@@ -457,11 +459,11 @@ describe('<OptimizelyExperiment>', () => {
457459      // Simulate client becoming ready 
458460      resolver . resolve ( {  success : true  } ) ; 
459461      isReady  =  true ; 
460-       await  act ( async  ( )  =>  await  optimizelyMock . onReady ( ) ) ; 
461- 
462-       expect ( optimizelyMock . activate ) . toHaveBeenCalledWith ( 'experiment1' ,  undefined ,  undefined ) ; 
463462
464-       await  waitFor ( ( )  =>  expect ( screen . getByTestId ( 'variation-key' ) ) . toHaveTextContent ( 'matchingVariation' ) ) ; 
463+       await  waitFor ( ( )  =>  { 
464+         expect ( optimizelyMock . activate ) . toHaveBeenCalledWith ( 'experiment1' ,  undefined ,  undefined ) ; 
465+         expect ( screen . getByTestId ( 'variation-key' ) ) . toHaveTextContent ( 'matchingVariation' ) ; 
466+       } ) ; 
465467
466468      // capture the OPTIMIZELY_CONFIG_UPDATE function 
467469      // change the return value of activate 
@@ -473,16 +475,14 @@ describe('<OptimizelyExperiment>', () => {
473475
474476      expect ( optimizelyMock . activate ) . toHaveBeenCalledWith ( 'experiment1' ,  undefined ,  undefined ) ; 
475477      await  waitFor ( ( )  =>  expect ( screen . getByTestId ( 'variation-key' ) ) . toHaveTextContent ( 'newVariation' ) ) ; 
476-       expect ( optimizelyMock . activate ) . toBeCalledTimes ( 2 ) ; 
478+       expect ( optimizelyMock . activate ) . toHaveBeenCalledTimes ( 2 ) ; 
477479    } ) ; 
478480
479481    it ( 'should re-render when the user changes' ,  async  ( )  =>  { 
480482      const  {  container }  =  render ( 
481483        < OptimizelyProvider  optimizely = { optimizelyMock }  timeout = { 100 } > 
482484          < OptimizelyExperiment  experiment = "experiment1"  autoUpdate = { true } > 
483-             { ( variation : string ,  clientReady : boolean ,  didTimeout : boolean )  =>  ( 
484-               < span  data-testid = "variation-key" > { variation } </ span > 
485-             ) } 
485+             { ( variation : string  |  null )  =>  < span  data-testid = "variation-key" > { variation } </ span > } 
486486          </ OptimizelyExperiment > 
487487        </ OptimizelyProvider > 
488488      ) ; 
@@ -493,10 +493,11 @@ describe('<OptimizelyExperiment>', () => {
493493      // Simulate client becoming ready 
494494      resolver . resolve ( {  success : true  } ) ; 
495495      isReady  =  true ; 
496-       await  act ( async  ( )  =>  await  optimizelyMock . onReady ( ) ) ; 
497-       expect ( optimizelyMock . activate ) . toHaveBeenCalledWith ( 'experiment1' ,  undefined ,  undefined ) ; 
498496
499-       await  waitFor ( ( )  =>  expect ( screen . getByTestId ( 'variation-key' ) ) . toHaveTextContent ( 'matchingVariation' ) ) ; 
497+       await  waitFor ( ( )  =>  { 
498+         expect ( optimizelyMock . activate ) . toHaveBeenCalledWith ( 'experiment1' ,  undefined ,  undefined ) ; 
499+         expect ( screen . getByTestId ( 'variation-key' ) ) . toHaveTextContent ( 'matchingVariation' ) ; 
500+       } ) ; 
500501
501502      // capture the onUserUpdate function 
502503      const  updateFn  =  ( optimizelyMock . onUserUpdate  as  jest . Mock ) . mock . calls [ 0 ] [ 0 ] ; 
@@ -506,7 +507,7 @@ describe('<OptimizelyExperiment>', () => {
506507
507508      expect ( optimizelyMock . activate ) . toHaveBeenCalledWith ( 'experiment1' ,  undefined ,  undefined ) ; 
508509      await  waitFor ( ( )  =>  expect ( screen . getByTestId ( 'variation-key' ) ) . toHaveTextContent ( 'newVariation' ) ) ; 
509-       expect ( optimizelyMock . activate ) . toBeCalledTimes ( 2 ) ; 
510+       expect ( optimizelyMock . activate ) . toHaveBeenCalledTimes ( 2 ) ; 
510511    } ) ; 
511512  } ) ; 
512513
@@ -515,9 +516,7 @@ describe('<OptimizelyExperiment>', () => {
515516      render ( 
516517        < OptimizelyProvider  optimizely = { optimizelyMock }  timeout = { 100 }  isServerSide = { true } > 
517518          < OptimizelyExperiment  experiment = "experiment1" > 
518-             { ( variation : string ,  clientReady : boolean ,  didTimeout : boolean )  =>  ( 
519-               < span  data-testid = "variation-key" > { variation } </ span > 
520-             ) } 
519+             { ( variation : string  |  null )  =>  < span  data-testid = "variation-key" > { variation } </ span > } 
521520          </ OptimizelyExperiment > 
522521        </ OptimizelyProvider > 
523522      ) ; 
@@ -541,6 +540,7 @@ describe('<OptimizelyExperiment>', () => {
541540          </ OptimizelyExperiment > 
542541        </ OptimizelyProvider > 
543542      ) ; 
543+ 
544544      await  waitFor ( ( )  =>  expect ( screen . getByTestId ( 'variation-key' ) ) . toHaveTextContent ( 'correct variation' ) ) ; 
545545    } ) ; 
546546  } ) ; 
0 commit comments