@@ -4,12 +4,12 @@ import * as td from 'testdouble';
44
55import {
66 ASSIGNMENT_TEST_DATA_DIR ,
7+ getTestAssignments ,
78 IAssignmentTestCase ,
89 MOCK_UFC_RESPONSE_FILE ,
910 OBFUSCATED_MOCK_UFC_RESPONSE_FILE ,
10- SubjectTestCase ,
11- getTestAssignments ,
1211 readMockUFCResponse ,
12+ SubjectTestCase ,
1313 testCasesByFileName ,
1414 validateTestAssignments ,
1515} from '../../test/testHelpers' ;
@@ -22,13 +22,13 @@ import {
2222} from '../configuration' ;
2323import { IConfigurationStore } from '../configuration-store/configuration-store' ;
2424import { 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' ;
2626import { decodePrecomputedFlag } from '../decoding' ;
27- import { Flag , ObfuscatedFlag , Variation , VariationType } from '../interfaces' ;
27+ import { Flag , ObfuscatedFlag , VariationType , FormatEnum , Variation } from '../interfaces' ;
2828import { getMD5Hash } from '../obfuscation' ;
2929import { AttributeType } from '../types' ;
3030
31- import EppoClient , { FlagConfigurationRequestParameters , checkTypeMatch } from './eppo-client' ;
31+ import EppoClient , { checkTypeMatch , FlagConfigurationRequestParameters } from './eppo-client' ;
3232import { initConfiguration } from './test-utils' ;
3333
3434// Use a known salt to produce deterministic hashes
@@ -46,6 +46,18 @@ describe('EppoClient E2E test', () => {
4646 } ) as jest . Mock ;
4747 const storage = new MemoryOnlyConfigurationStore < Flag | ObfuscatedFlag > ( ) ;
4848
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+
4961 beforeAll ( async ( ) => {
5062 await initConfiguration ( storage ) ;
5163 } ) ;
@@ -88,8 +100,8 @@ describe('EppoClient E2E test', () => {
88100 describe ( 'error encountered' , ( ) => {
89101 let client : EppoClient ;
90102
91- beforeAll ( ( ) => {
92- storage . setEntries ( { [ flagKey ] : mockFlag } ) ;
103+ beforeAll ( async ( ) => {
104+ await setUnobfuscatedFlagEntries ( { [ flagKey ] : mockFlag } ) ;
93105 client = new EppoClient ( { flagConfigurationStore : storage } ) ;
94106
95107 td . replace ( EppoClient . prototype , 'getAssignmentDetail' , function ( ) {
@@ -144,8 +156,8 @@ describe('EppoClient E2E test', () => {
144156 } ) ;
145157
146158 describe ( 'setLogger' , ( ) => {
147- beforeAll ( ( ) => {
148- storage . setEntries ( { [ flagKey ] : mockFlag } ) ;
159+ beforeAll ( async ( ) => {
160+ await setUnobfuscatedFlagEntries ( { [ flagKey ] : mockFlag } ) ;
149161 } ) ;
150162
151163 it ( 'Invokes logger for queued events' , ( ) => {
@@ -192,8 +204,8 @@ describe('EppoClient E2E test', () => {
192204 } ) ;
193205
194206 describe ( 'precomputed flags' , ( ) => {
195- beforeAll ( ( ) => {
196- storage . setEntries ( {
207+ beforeAll ( async ( ) => {
208+ await setUnobfuscatedFlagEntries ( {
197209 [ flagKey ] : mockFlag ,
198210 disabledFlag : { ...mockFlag , enabled : false } ,
199211 anotherFlag : {
@@ -425,10 +437,10 @@ describe('EppoClient E2E test', () => {
425437 ) ;
426438 } ) ;
427439
428- it ( 'logs variation assignment and experiment key' , ( ) => {
440+ it ( 'logs variation assignment and experiment key' , async ( ) => {
429441 const mockLogger = td . object < IAssignmentLogger > ( ) ;
430442
431- storage . setEntries ( { [ flagKey ] : mockFlag } ) ;
443+ await setUnobfuscatedFlagEntries ( { [ flagKey ] : mockFlag } ) ;
432444 const client = new EppoClient ( { flagConfigurationStore : storage } ) ;
433445 client . setAssignmentLogger ( mockLogger ) ;
434446
@@ -450,11 +462,11 @@ describe('EppoClient E2E test', () => {
450462 expect ( loggedAssignmentEvent . allocation ) . toEqual ( mockFlag . allocations [ 0 ] . key ) ;
451463 } ) ;
452464
453- it ( 'handles logging exception' , ( ) => {
465+ it ( 'handles logging exception' , async ( ) => {
454466 const mockLogger = td . object < IAssignmentLogger > ( ) ;
455467 td . when ( mockLogger . logAssignment ( td . matchers . anything ( ) ) ) . thenThrow ( new Error ( 'logging error' ) ) ;
456468
457- storage . setEntries ( { [ flagKey ] : mockFlag } ) ;
469+ await setUnobfuscatedFlagEntries ( { [ flagKey ] : mockFlag } ) ;
458470 const client = new EppoClient ( { flagConfigurationStore : storage } ) ;
459471 client . setAssignmentLogger ( mockLogger ) ;
460472
@@ -469,8 +481,8 @@ describe('EppoClient E2E test', () => {
469481 expect ( assignment ) . toEqual ( 'variation-a' ) ;
470482 } ) ;
471483
472- it ( 'exports flag configuration' , ( ) => {
473- storage . setEntries ( { [ flagKey ] : mockFlag } ) ;
484+ it ( 'exports flag configuration' , async ( ) => {
485+ await setUnobfuscatedFlagEntries ( { [ flagKey ] : mockFlag } ) ;
474486 const client = new EppoClient ( { flagConfigurationStore : storage } ) ;
475487 expect ( client . getFlagConfigurations ( ) ) . toEqual ( { [ flagKey ] : mockFlag } ) ;
476488 } ) ;
@@ -479,10 +491,10 @@ describe('EppoClient E2E test', () => {
479491 let client : EppoClient ;
480492 let mockLogger : IAssignmentLogger ;
481493
482- beforeEach ( ( ) => {
494+ beforeEach ( async ( ) => {
483495 mockLogger = td . object < IAssignmentLogger > ( ) ;
484496
485- storage . setEntries ( { [ flagKey ] : mockFlag } ) ;
497+ await setUnobfuscatedFlagEntries ( { [ flagKey ] : mockFlag } ) ;
486498 client = new EppoClient ( { flagConfigurationStore : storage } ) ;
487499 client . setAssignmentLogger ( mockLogger ) ;
488500 } ) ;
@@ -537,7 +549,7 @@ describe('EppoClient E2E test', () => {
537549 } ) ;
538550
539551 it ( 'logs for each unique flag' , async ( ) => {
540- await storage . setEntries ( {
552+ await setUnobfuscatedFlagEntries ( {
541553 [ flagKey ] : mockFlag ,
542554 'flag-2' : {
543555 ...mockFlag ,
@@ -564,10 +576,10 @@ describe('EppoClient E2E test', () => {
564576 expect ( td . explain ( mockLogger . logAssignment ) . callCount ) . toEqual ( 3 ) ;
565577 } ) ;
566578
567- it ( 'logs twice for the same flag when allocations change' , ( ) => {
579+ it ( 'logs twice for the same flag when allocations change' , async ( ) => {
568580 client . useNonExpiringInMemoryAssignmentCache ( ) ;
569581
570- storage . setEntries ( {
582+ await setUnobfuscatedFlagEntries ( {
571583 [ flagKey ] : {
572584 ...mockFlag ,
573585
@@ -588,7 +600,7 @@ describe('EppoClient E2E test', () => {
588600 } ) ;
589601 client . getStringAssignment ( flagKey , 'subject-10' , { } , 'default' ) ;
590602
591- storage . setEntries ( {
603+ await setUnobfuscatedFlagEntries ( {
592604 [ flagKey ] : {
593605 ...mockFlag ,
594606 allocations : [
@@ -610,17 +622,17 @@ describe('EppoClient E2E test', () => {
610622 expect ( td . explain ( mockLogger . logAssignment ) . callCount ) . toEqual ( 2 ) ;
611623 } ) ;
612624
613- it ( 'logs the same subject/flag/variation after two changes' , ( ) => {
625+ it ( 'logs the same subject/flag/variation after two changes' , async ( ) => {
614626 client . useNonExpiringInMemoryAssignmentCache ( ) ;
615627
616628 // original configuration version
617- storage . setEntries ( { [ flagKey ] : mockFlag } ) ;
629+ await setUnobfuscatedFlagEntries ( { [ flagKey ] : mockFlag } ) ;
618630
619631 client . getStringAssignment ( flagKey , 'subject-10' , { } , 'default' ) ; // log this assignment
620632 client . getStringAssignment ( flagKey , 'subject-10' , { } , 'default' ) ; // cache hit, don't log
621633
622634 // change the variation
623- storage . setEntries ( {
635+ await setUnobfuscatedFlagEntries ( {
624636 [ flagKey ] : {
625637 ...mockFlag ,
626638 allocations : [
@@ -643,13 +655,13 @@ describe('EppoClient E2E test', () => {
643655 client . getStringAssignment ( flagKey , 'subject-10' , { } , 'default' ) ; // cache hit, don't log
644656
645657 // change the flag again, back to the original
646- storage . setEntries ( { [ flagKey ] : mockFlag } ) ;
658+ await setUnobfuscatedFlagEntries ( { [ flagKey ] : mockFlag } ) ;
647659
648660 client . getStringAssignment ( flagKey , 'subject-10' , { } , 'default' ) ; // important: log this assignment
649661 client . getStringAssignment ( flagKey , 'subject-10' , { } , 'default' ) ; // cache hit, don't log
650662
651663 // change the allocation
652- storage . setEntries ( {
664+ await setUnobfuscatedFlagEntries ( {
653665 [ flagKey ] : {
654666 ...mockFlag ,
655667 allocations : [
0 commit comments