@@ -4,12 +4,12 @@ import * as td from 'testdouble';
4
4
5
5
import {
6
6
ASSIGNMENT_TEST_DATA_DIR ,
7
+ getTestAssignments ,
7
8
IAssignmentTestCase ,
8
9
MOCK_UFC_RESPONSE_FILE ,
9
10
OBFUSCATED_MOCK_UFC_RESPONSE_FILE ,
10
- SubjectTestCase ,
11
- getTestAssignments ,
12
11
readMockUFCResponse ,
12
+ SubjectTestCase ,
13
13
testCasesByFileName ,
14
14
validateTestAssignments ,
15
15
} from '../../test/testHelpers' ;
@@ -22,13 +22,13 @@ import {
22
22
} from '../configuration' ;
23
23
import { IConfigurationStore } from '../configuration-store/configuration-store' ;
24
24
import { MemoryOnlyConfigurationStore } from '../configuration-store/memory.store' ;
25
- import { MAX_EVENT_QUEUE_SIZE , DEFAULT_POLL_INTERVAL_MS , POLL_JITTER_PCT } from '../constants' ;
25
+ import { DEFAULT_POLL_INTERVAL_MS , MAX_EVENT_QUEUE_SIZE , POLL_JITTER_PCT } from '../constants' ;
26
26
import { decodePrecomputedFlag } from '../decoding' ;
27
- import { Flag , ObfuscatedFlag , Variation , VariationType } from '../interfaces' ;
27
+ import { Flag , ObfuscatedFlag , VariationType , FormatEnum , Variation } from '../interfaces' ;
28
28
import { getMD5Hash } from '../obfuscation' ;
29
29
import { AttributeType } from '../types' ;
30
30
31
- import EppoClient , { FlagConfigurationRequestParameters , checkTypeMatch } from './eppo-client' ;
31
+ import EppoClient , { checkTypeMatch , FlagConfigurationRequestParameters } from './eppo-client' ;
32
32
import { initConfiguration } from './test-utils' ;
33
33
34
34
// Use a known salt to produce deterministic hashes
@@ -46,6 +46,18 @@ describe('EppoClient E2E test', () => {
46
46
} ) as jest . Mock ;
47
47
const storage = new MemoryOnlyConfigurationStore < Flag | ObfuscatedFlag > ( ) ;
48
48
49
+ /**
50
+ * Use this helper instead of directly setting entries on the `storage` ConfigurationStore.
51
+ * This method ensures the format field is set as it is required for parsing.
52
+ * @param entries
53
+ */
54
+ function setUnobfuscatedFlagEntries (
55
+ entries : Record < string , Flag | ObfuscatedFlag > ,
56
+ ) : Promise < boolean > {
57
+ storage . setFormat ( FormatEnum . SERVER ) ;
58
+ return storage . setEntries ( entries ) ;
59
+ }
60
+
49
61
beforeAll ( async ( ) => {
50
62
await initConfiguration ( storage ) ;
51
63
} ) ;
@@ -88,8 +100,8 @@ describe('EppoClient E2E test', () => {
88
100
describe ( 'error encountered' , ( ) => {
89
101
let client : EppoClient ;
90
102
91
- beforeAll ( ( ) => {
92
- storage . setEntries ( { [ flagKey ] : mockFlag } ) ;
103
+ beforeAll ( async ( ) => {
104
+ await setUnobfuscatedFlagEntries ( { [ flagKey ] : mockFlag } ) ;
93
105
client = new EppoClient ( { flagConfigurationStore : storage } ) ;
94
106
95
107
td . replace ( EppoClient . prototype , 'getAssignmentDetail' , function ( ) {
@@ -144,8 +156,8 @@ describe('EppoClient E2E test', () => {
144
156
} ) ;
145
157
146
158
describe ( 'setLogger' , ( ) => {
147
- beforeAll ( ( ) => {
148
- storage . setEntries ( { [ flagKey ] : mockFlag } ) ;
159
+ beforeAll ( async ( ) => {
160
+ await setUnobfuscatedFlagEntries ( { [ flagKey ] : mockFlag } ) ;
149
161
} ) ;
150
162
151
163
it ( 'Invokes logger for queued events' , ( ) => {
@@ -192,8 +204,8 @@ describe('EppoClient E2E test', () => {
192
204
} ) ;
193
205
194
206
describe ( 'precomputed flags' , ( ) => {
195
- beforeAll ( ( ) => {
196
- storage . setEntries ( {
207
+ beforeAll ( async ( ) => {
208
+ await setUnobfuscatedFlagEntries ( {
197
209
[ flagKey ] : mockFlag ,
198
210
disabledFlag : { ...mockFlag , enabled : false } ,
199
211
anotherFlag : {
@@ -425,10 +437,10 @@ describe('EppoClient E2E test', () => {
425
437
) ;
426
438
} ) ;
427
439
428
- it ( 'logs variation assignment and experiment key' , ( ) => {
440
+ it ( 'logs variation assignment and experiment key' , async ( ) => {
429
441
const mockLogger = td . object < IAssignmentLogger > ( ) ;
430
442
431
- storage . setEntries ( { [ flagKey ] : mockFlag } ) ;
443
+ await setUnobfuscatedFlagEntries ( { [ flagKey ] : mockFlag } ) ;
432
444
const client = new EppoClient ( { flagConfigurationStore : storage } ) ;
433
445
client . setAssignmentLogger ( mockLogger ) ;
434
446
@@ -450,11 +462,11 @@ describe('EppoClient E2E test', () => {
450
462
expect ( loggedAssignmentEvent . allocation ) . toEqual ( mockFlag . allocations [ 0 ] . key ) ;
451
463
} ) ;
452
464
453
- it ( 'handles logging exception' , ( ) => {
465
+ it ( 'handles logging exception' , async ( ) => {
454
466
const mockLogger = td . object < IAssignmentLogger > ( ) ;
455
467
td . when ( mockLogger . logAssignment ( td . matchers . anything ( ) ) ) . thenThrow ( new Error ( 'logging error' ) ) ;
456
468
457
- storage . setEntries ( { [ flagKey ] : mockFlag } ) ;
469
+ await setUnobfuscatedFlagEntries ( { [ flagKey ] : mockFlag } ) ;
458
470
const client = new EppoClient ( { flagConfigurationStore : storage } ) ;
459
471
client . setAssignmentLogger ( mockLogger ) ;
460
472
@@ -469,8 +481,8 @@ describe('EppoClient E2E test', () => {
469
481
expect ( assignment ) . toEqual ( 'variation-a' ) ;
470
482
} ) ;
471
483
472
- it ( 'exports flag configuration' , ( ) => {
473
- storage . setEntries ( { [ flagKey ] : mockFlag } ) ;
484
+ it ( 'exports flag configuration' , async ( ) => {
485
+ await setUnobfuscatedFlagEntries ( { [ flagKey ] : mockFlag } ) ;
474
486
const client = new EppoClient ( { flagConfigurationStore : storage } ) ;
475
487
expect ( client . getFlagConfigurations ( ) ) . toEqual ( { [ flagKey ] : mockFlag } ) ;
476
488
} ) ;
@@ -479,10 +491,10 @@ describe('EppoClient E2E test', () => {
479
491
let client : EppoClient ;
480
492
let mockLogger : IAssignmentLogger ;
481
493
482
- beforeEach ( ( ) => {
494
+ beforeEach ( async ( ) => {
483
495
mockLogger = td . object < IAssignmentLogger > ( ) ;
484
496
485
- storage . setEntries ( { [ flagKey ] : mockFlag } ) ;
497
+ await setUnobfuscatedFlagEntries ( { [ flagKey ] : mockFlag } ) ;
486
498
client = new EppoClient ( { flagConfigurationStore : storage } ) ;
487
499
client . setAssignmentLogger ( mockLogger ) ;
488
500
} ) ;
@@ -537,7 +549,7 @@ describe('EppoClient E2E test', () => {
537
549
} ) ;
538
550
539
551
it ( 'logs for each unique flag' , async ( ) => {
540
- await storage . setEntries ( {
552
+ await setUnobfuscatedFlagEntries ( {
541
553
[ flagKey ] : mockFlag ,
542
554
'flag-2' : {
543
555
...mockFlag ,
@@ -564,10 +576,10 @@ describe('EppoClient E2E test', () => {
564
576
expect ( td . explain ( mockLogger . logAssignment ) . callCount ) . toEqual ( 3 ) ;
565
577
} ) ;
566
578
567
- it ( 'logs twice for the same flag when allocations change' , ( ) => {
579
+ it ( 'logs twice for the same flag when allocations change' , async ( ) => {
568
580
client . useNonExpiringInMemoryAssignmentCache ( ) ;
569
581
570
- storage . setEntries ( {
582
+ await setUnobfuscatedFlagEntries ( {
571
583
[ flagKey ] : {
572
584
...mockFlag ,
573
585
@@ -588,7 +600,7 @@ describe('EppoClient E2E test', () => {
588
600
} ) ;
589
601
client . getStringAssignment ( flagKey , 'subject-10' , { } , 'default' ) ;
590
602
591
- storage . setEntries ( {
603
+ await setUnobfuscatedFlagEntries ( {
592
604
[ flagKey ] : {
593
605
...mockFlag ,
594
606
allocations : [
@@ -610,17 +622,17 @@ describe('EppoClient E2E test', () => {
610
622
expect ( td . explain ( mockLogger . logAssignment ) . callCount ) . toEqual ( 2 ) ;
611
623
} ) ;
612
624
613
- it ( 'logs the same subject/flag/variation after two changes' , ( ) => {
625
+ it ( 'logs the same subject/flag/variation after two changes' , async ( ) => {
614
626
client . useNonExpiringInMemoryAssignmentCache ( ) ;
615
627
616
628
// original configuration version
617
- storage . setEntries ( { [ flagKey ] : mockFlag } ) ;
629
+ await setUnobfuscatedFlagEntries ( { [ flagKey ] : mockFlag } ) ;
618
630
619
631
client . getStringAssignment ( flagKey , 'subject-10' , { } , 'default' ) ; // log this assignment
620
632
client . getStringAssignment ( flagKey , 'subject-10' , { } , 'default' ) ; // cache hit, don't log
621
633
622
634
// change the variation
623
- storage . setEntries ( {
635
+ await setUnobfuscatedFlagEntries ( {
624
636
[ flagKey ] : {
625
637
...mockFlag ,
626
638
allocations : [
@@ -643,13 +655,13 @@ describe('EppoClient E2E test', () => {
643
655
client . getStringAssignment ( flagKey , 'subject-10' , { } , 'default' ) ; // cache hit, don't log
644
656
645
657
// change the flag again, back to the original
646
- storage . setEntries ( { [ flagKey ] : mockFlag } ) ;
658
+ await setUnobfuscatedFlagEntries ( { [ flagKey ] : mockFlag } ) ;
647
659
648
660
client . getStringAssignment ( flagKey , 'subject-10' , { } , 'default' ) ; // important: log this assignment
649
661
client . getStringAssignment ( flagKey , 'subject-10' , { } , 'default' ) ; // cache hit, don't log
650
662
651
663
// change the allocation
652
- storage . setEntries ( {
664
+ await setUnobfuscatedFlagEntries ( {
653
665
[ flagKey ] : {
654
666
...mockFlag ,
655
667
allocations : [
0 commit comments