@@ -205,6 +205,11 @@ describe('EppoClient E2E test', () => {
205
205
expect ( stringAssignments ) . toEqual ( expectedAssignments ) ;
206
206
break ;
207
207
}
208
+ case ValueTestType . JSONType : {
209
+ const jsonStringAssignments = assignments . map ( ( a ) => a ?. stringValue ?? null ) ;
210
+ expect ( jsonStringAssignments ) . toEqual ( expectedAssignments ) ;
211
+ break ;
212
+ }
208
213
}
209
214
} ,
210
215
) ;
@@ -217,37 +222,51 @@ describe('EppoClient E2E test', () => {
217
222
} ) ;
218
223
219
224
it ( 'returns subject from overrides when enabled is true' , ( ) => {
220
- window . localStorage . setItem (
221
- flagKey ,
222
- JSON . stringify ( {
223
- ...mockExperimentConfig ,
224
- typedOverrides : {
225
- '1b50f33aef8f681a13f623963da967ed' : 'control' ,
226
- } ,
227
- } ) ,
228
- ) ;
225
+ const entry = {
226
+ ...mockExperimentConfig ,
227
+ enabled : false ,
228
+ overrides : {
229
+ '1b50f33aef8f681a13f623963da967ed' : 'override' ,
230
+ } ,
231
+ typedOverrides : {
232
+ '1b50f33aef8f681a13f623963da967ed' : 'override' ,
233
+ } ,
234
+ } ;
235
+
236
+ storage . setEntries ( { [ flagKey ] : entry } ) ;
237
+
229
238
const client = new EppoClient ( storage ) ;
239
+ const mockLogger = td . object < IAssignmentLogger > ( ) ;
240
+ client . setLogger ( mockLogger ) ;
241
+
230
242
const assignment = client . getAssignment ( 'subject-10' , flagKey ) ;
231
- expect ( assignment ) . toEqual ( 'control' ) ;
243
+ expect ( assignment ) . toEqual ( 'override' ) ;
244
+ expect ( td . explain ( mockLogger . logAssignment ) . callCount ) . toEqual ( 0 ) ;
232
245
} ) ;
233
246
234
247
it ( 'returns subject from overrides when enabled is false' , ( ) => {
235
248
const entry = {
236
249
...mockExperimentConfig ,
237
250
enabled : false ,
251
+ overrides : {
252
+ '1b50f33aef8f681a13f623963da967ed' : 'override' ,
253
+ } ,
238
254
typedOverrides : {
239
- '1b50f33aef8f681a13f623963da967ed' : 'control ' ,
255
+ '1b50f33aef8f681a13f623963da967ed' : 'override ' ,
240
256
} ,
241
257
} ;
242
258
243
259
storage . setEntries ( { [ flagKey ] : entry } ) ;
244
260
245
261
const client = new EppoClient ( storage ) ;
262
+ const mockLogger = td . object < IAssignmentLogger > ( ) ;
263
+ client . setLogger ( mockLogger ) ;
246
264
const assignment = client . getAssignment ( 'subject-10' , flagKey ) ;
247
- expect ( assignment ) . toEqual ( 'control' ) ;
265
+ expect ( assignment ) . toEqual ( 'override' ) ;
266
+ expect ( td . explain ( mockLogger . logAssignment ) . callCount ) . toEqual ( 0 ) ;
248
267
} ) ;
249
268
250
- it ( 'logs variation assignment' , ( ) => {
269
+ it ( 'logs variation assignment and experiment key ' , ( ) => {
251
270
const mockLogger = td . object < IAssignmentLogger > ( ) ;
252
271
253
272
storage . setEntries ( { [ flagKey ] : mockExperimentConfig } ) ;
@@ -260,6 +279,13 @@ describe('EppoClient E2E test', () => {
260
279
expect ( assignment ) . toEqual ( 'control' ) ;
261
280
expect ( td . explain ( mockLogger . logAssignment ) . callCount ) . toEqual ( 1 ) ;
262
281
expect ( td . explain ( mockLogger . logAssignment ) . calls [ 0 ] . args [ 0 ] . subject ) . toEqual ( 'subject-10' ) ;
282
+ expect ( td . explain ( mockLogger . logAssignment ) . calls [ 0 ] . args [ 0 ] . featureFlag ) . toEqual ( flagKey ) ;
283
+ expect ( td . explain ( mockLogger . logAssignment ) . calls [ 0 ] . args [ 0 ] . experiment ) . toEqual (
284
+ `${ flagKey } -${ mockExperimentConfig . rules [ 0 ] . allocationKey } ` ,
285
+ ) ;
286
+ expect ( td . explain ( mockLogger . logAssignment ) . calls [ 0 ] . args [ 0 ] . allocation ) . toEqual (
287
+ `${ mockExperimentConfig . rules [ 0 ] . allocationKey } ` ,
288
+ ) ;
263
289
} ) ;
264
290
265
291
it ( 'handles logging exception' , ( ) => {
@@ -326,6 +352,12 @@ describe('EppoClient E2E test', () => {
326
352
if ( sa === null ) return null ;
327
353
return EppoValue . String ( sa ) ;
328
354
}
355
+ case ValueTestType . JSONType : {
356
+ const sa = globalClient . getJSONStringAssignment ( subjectKey , experiment ) ;
357
+ const oa = globalClient . getParsedJSONAssignment ( subjectKey , experiment ) ;
358
+ if ( oa == null || sa === null ) return null ;
359
+ return EppoValue . JSON ( sa , oa ) ;
360
+ }
329
361
}
330
362
} ) ;
331
363
}
@@ -368,6 +400,20 @@ describe('EppoClient E2E test', () => {
368
400
if ( sa === null ) return null ;
369
401
return EppoValue . String ( sa ) ;
370
402
}
403
+ case ValueTestType . JSONType : {
404
+ const sa = globalClient . getJSONStringAssignment (
405
+ subject . subjectKey ,
406
+ experiment ,
407
+ subject . subjectAttributes ,
408
+ ) ;
409
+ const oa = globalClient . getParsedJSONAssignment (
410
+ subject . subjectKey ,
411
+ experiment ,
412
+ subject . subjectAttributes ,
413
+ ) ;
414
+ if ( oa == null || sa === null ) return null ;
415
+ return EppoValue . JSON ( sa , oa ) ;
416
+ }
371
417
}
372
418
} ) ;
373
419
}
@@ -390,6 +436,9 @@ describe('EppoClient E2E test', () => {
390
436
} ) ;
391
437
392
438
it ( 'overrides returned assignment' , async ( ) => {
439
+ const mockLogger = td . object < IAssignmentLogger > ( ) ;
440
+ client . setLogger ( mockLogger ) ;
441
+ td . reset ( ) ;
393
442
const variation = await client . getAssignment (
394
443
'subject-identifer' ,
395
444
flagKey ,
@@ -412,9 +461,13 @@ describe('EppoClient E2E test', () => {
412
461
) ;
413
462
414
463
expect ( variation ) . toEqual ( 'my-overridden-variation' ) ;
464
+ expect ( td . explain ( mockLogger . logAssignment ) . callCount ) . toEqual ( 0 ) ;
415
465
} ) ;
416
466
417
467
it ( 'uses regular assignment logic if onPreAssignment returns null' , async ( ) => {
468
+ const mockLogger = td . object < IAssignmentLogger > ( ) ;
469
+ client . setLogger ( mockLogger ) ;
470
+ td . reset ( ) ;
418
471
const variation = await client . getAssignment (
419
472
'subject-identifer' ,
420
473
flagKey ,
@@ -436,6 +489,7 @@ describe('EppoClient E2E test', () => {
436
489
) ;
437
490
438
491
expect ( variation ) . not . toEqual ( null ) ;
492
+ expect ( td . explain ( mockLogger . logAssignment ) . callCount ) . toEqual ( 1 ) ;
439
493
} ) ;
440
494
} ) ;
441
495
0 commit comments