Skip to content

Commit be4c02b

Browse files
committed
updates
1 parent 4cf8c77 commit be4c02b

5 files changed

Lines changed: 260 additions & 276 deletions

File tree

lib/core/decision_service/index.spec.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2934,7 +2934,7 @@ describe('DecisionService', () => {
29342934
trafficAllocation: [{ entityId: 'global_holdout_var_id', endOfRange: 10000 }]
29352935
}
29362936
];
2937-
const config = createProjectConfig(datafile);
2937+
const config = createProjectConfig(JSON.stringify(datafile));
29382938
const { decisionService } = getDecisionService();
29392939

29402940
// bucket returns the global holdout variation for the holdout, nothing for experiments
@@ -2956,7 +2956,7 @@ describe('DecisionService', () => {
29562956

29572957
it('local holdout hit branch: user bucketed into local holdout for experiment rule returns holdout variation; audience and traffic not evaluated for that rule', async () => {
29582958
// exp_1 has id '2001'
2959-
const config = createProjectConfig(makeLocalHoldoutDatafile('2001'));
2959+
const config = createProjectConfig(JSON.stringify(makeLocalHoldoutDatafile('2001')));
29602960
const { decisionService } = getDecisionService();
29612961

29622962
// bucket returns holdout variation when evaluating the local holdout
@@ -2979,7 +2979,7 @@ describe('DecisionService', () => {
29792979

29802980
it('local holdout miss branch: user not bucketed into local holdout falls through to regular rule evaluation', async () => {
29812981
// exp_1 has id '2001' and audience 4001 (age <= 22)
2982-
const config = createProjectConfig(makeLocalHoldoutDatafile('2001'));
2982+
const config = createProjectConfig(JSON.stringify(makeLocalHoldoutDatafile('2001')));
29832983
const { decisionService } = getDecisionService();
29842984

29852985
// bucket returns null for the local holdout, then succeeds for the experiment
@@ -3009,7 +3009,7 @@ describe('DecisionService', () => {
30093009
it('rule specificity: local holdout targeting experiment rule X does not affect experiment rule Y', async () => {
30103010
// exp_1 = '2001', exp_2 = '2002'. Local holdout targets only '2002' (exp_2).
30113011
// Audience for exp_1: 4001 (age <= 22). User satisfies exp_1 audience but not exp_2.
3012-
const config = createProjectConfig(makeLocalHoldoutDatafile('2002'));
3012+
const config = createProjectConfig(JSON.stringify(makeLocalHoldoutDatafile('2002')));
30133013
const { decisionService } = getDecisionService();
30143014

30153015
// bucket returns holdout variation only for the local holdout when evaluating for '2002',
@@ -3040,7 +3040,7 @@ describe('DecisionService', () => {
30403040

30413041
it('local holdout applies to delivery rules (rollouts) as well as experiment rules', async () => {
30423042
// delivery_1 has id '3001'
3043-
const config = createProjectConfig(makeLocalHoldoutDatafile('3001'));
3043+
const config = createProjectConfig(JSON.stringify(makeLocalHoldoutDatafile('3001')));
30443044
const { decisionService } = getDecisionService();
30453045

30463046
// bucket returns null for all experiments and the local holdout variation for delivery rule
@@ -3070,7 +3070,7 @@ describe('DecisionService', () => {
30703070
// Local holdout targets '2001' with 100% traffic allocation.
30713071
// User also has a forced decision set for exp_1.
30723072
// Expected: forced decision wins; decisionSource is FEATURE_TEST, not HOLDOUT.
3073-
const config = createProjectConfig(makeLocalHoldoutDatafile('2001'));
3073+
const config = createProjectConfig(JSON.stringify(makeLocalHoldoutDatafile('2001')));
30743074
const { decisionService } = getDecisionService();
30753075

30763076
// bucket should NOT be called for local_holdout_id because forced decision short-circuits first

lib/project_config/project_config.spec.ts

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -454,27 +454,27 @@ describe('createProjectConfig - local holdouts (FSSDK-12369, FSSDK-12760)', () =
454454
};
455455

456456
it('should set isGlobal=true for entries in the holdouts section (backward compat with old datafiles)', () => {
457-
const config = projectConfig.createProjectConfig(cloneDeep(makeHoldoutsDatafile()) as any);
457+
const config = projectConfig.createProjectConfig(JSON.stringify(makeHoldoutsDatafile()));
458458
const holdout = config.holdoutIdMap!['global_holdout_id'];
459459
expect(holdout.isGlobal).toBe(true);
460460
});
461461

462462
it('should set isGlobal=false for entries in the localHoldouts section', () => {
463-
const config = projectConfig.createProjectConfig(cloneDeep(makeHoldoutsDatafile()) as any);
463+
const config = projectConfig.createProjectConfig(JSON.stringify(makeHoldoutsDatafile()));
464464
const holdout = config.holdoutIdMap!['local_holdout_rule_a_id'];
465465
expect(holdout.isGlobal).toBe(false);
466466
});
467467

468468
it('getGlobalHoldouts should return only entries from the holdouts section', () => {
469-
const config = projectConfig.createProjectConfig(cloneDeep(makeHoldoutsDatafile()) as any);
469+
const config = projectConfig.createProjectConfig(JSON.stringify(makeHoldoutsDatafile()));
470470
const globals = getGlobalHoldouts(config);
471471
const globalIds = globals.map(h => h.id);
472472
expect(globalIds).toContain('global_holdout_id');
473473
expect(globalIds).not.toContain('local_holdout_rule_a_id');
474474
});
475475

476476
it('getHoldoutsForRule should return local holdouts targeting the given rule ID', () => {
477-
const config = projectConfig.createProjectConfig(cloneDeep(makeHoldoutsDatafile()) as any);
477+
const config = projectConfig.createProjectConfig(JSON.stringify(makeHoldoutsDatafile()));
478478
const forRuleA = getHoldoutsForRule(config, 'rule_a');
479479
expect(forRuleA).toHaveLength(1);
480480
expect(forRuleA[0].id).toBe('local_holdout_rule_a_id');
@@ -524,7 +524,7 @@ describe('createProjectConfig - local holdouts (FSSDK-12369, FSSDK-12760)', () =
524524
trafficAllocation: [{ entityId: 'var_both', endOfRange: 5000 }],
525525
},
526526
];
527-
const config = projectConfig.createProjectConfig(datafile as any);
527+
const config = projectConfig.createProjectConfig(JSON.stringify(datafile));
528528

529529
const forRuleX = getHoldoutsForRule(config, 'rule_x');
530530
const forRuleXIds = forRuleX.map(h => h.id).sort();
@@ -555,7 +555,7 @@ describe('createProjectConfig - local holdouts (FSSDK-12369, FSSDK-12760)', () =
555555
trafficAllocation: [{ entityId: 'var_local', endOfRange: 5000 }],
556556
},
557557
];
558-
const config = projectConfig.createProjectConfig(datafile as any);
558+
const config = projectConfig.createProjectConfig(JSON.stringify(datafile));
559559

560560
const forRuleZ = getHoldoutsForRule(config, 'rule_z');
561561
expect(forRuleZ).toHaveLength(1);
@@ -566,7 +566,7 @@ describe('createProjectConfig - local holdouts (FSSDK-12369, FSSDK-12760)', () =
566566
});
567567

568568
it('getHoldoutsForRule should return empty array for an unknown rule ID', () => {
569-
const config = projectConfig.createProjectConfig(cloneDeep(makeHoldoutsDatafile()) as any);
569+
const config = projectConfig.createProjectConfig(JSON.stringify(makeHoldoutsDatafile()));
570570
const forUnknown = getHoldoutsForRule(config, 'nonexistent_rule');
571571
expect(forUnknown).toHaveLength(0);
572572
});
@@ -588,19 +588,19 @@ describe('createProjectConfig - local holdouts (FSSDK-12369, FSSDK-12760)', () =
588588
trafficAllocation: [{ entityId: 'only_local_var_id', endOfRange: 5000 }],
589589
},
590590
];
591-
const config = projectConfig.createProjectConfig(datafile as any);
591+
const config = projectConfig.createProjectConfig(JSON.stringify(datafile));
592592
expect(getGlobalHoldouts(config)).toHaveLength(0);
593593
});
594594

595595
it('should handle datafile with no holdouts gracefully', () => {
596596
const datafile = testDatafile.getTestProjectConfig();
597-
const config = projectConfig.createProjectConfig(datafile as any);
597+
const config = projectConfig.createProjectConfig(JSON.stringify(datafile));
598598
expect(getGlobalHoldouts(config)).toHaveLength(0);
599599
expect(getHoldoutsForRule(config, 'any_rule')).toHaveLength(0);
600600
});
601601

602602
it('a single local holdout targeting multiple rules should appear for each targeted rule', () => {
603-
const config = projectConfig.createProjectConfig(cloneDeep(makeHoldoutsDatafile()) as any);
603+
const config = projectConfig.createProjectConfig(JSON.stringify(makeHoldoutsDatafile()));
604604
const forRuleA = getHoldoutsForRule(config, 'rule_a');
605605
const forRuleB = getHoldoutsForRule(config, 'rule_b');
606606
// Both rule_a and rule_b point to the same holdout
@@ -645,7 +645,7 @@ describe('createProjectConfig - localHoldouts section (FSSDK-12760)', () => {
645645
const datafile = cloneDeep(makeBaseDatafile()) as any;
646646
datafile.holdouts = [];
647647
datafile.localHoldouts = [makeLocal('l1', 'local_h', ['rule_x'])];
648-
const config = projectConfig.createProjectConfig(datafile);
648+
const config = projectConfig.createProjectConfig(JSON.stringify(datafile));
649649
expect(Array.isArray(config.localHoldouts)).toBe(true);
650650
expect(config.localHoldouts).toHaveLength(1);
651651
expect(config.localHoldouts[0].id).toBe('l1');
@@ -655,7 +655,7 @@ describe('createProjectConfig - localHoldouts section (FSSDK-12760)', () => {
655655
const datafile = cloneDeep(makeBaseDatafile()) as any;
656656
datafile.holdouts = [makeGlobal('g1', 'global_h')];
657657
// No localHoldouts key at all
658-
const config = projectConfig.createProjectConfig(datafile);
658+
const config = projectConfig.createProjectConfig(JSON.stringify(datafile));
659659
expect(config.localHoldouts).toEqual([]);
660660
expect(getGlobalHoldouts(config).map(h => h.id)).toContain('g1');
661661
expect(getHoldoutsForRule(config, 'any_rule')).toEqual([]);
@@ -669,7 +669,7 @@ describe('createProjectConfig - localHoldouts section (FSSDK-12760)', () => {
669669
makeGlobal('stray', 'stray_global', { includedRules: ['rule_should_be_ignored'] }),
670670
];
671671
datafile.localHoldouts = [];
672-
const config = projectConfig.createProjectConfig(datafile);
672+
const config = projectConfig.createProjectConfig(JSON.stringify(datafile));
673673

674674
const stray = config.holdoutIdMap!['stray'];
675675
// includedRules must be stripped at parse time
@@ -688,7 +688,7 @@ describe('createProjectConfig - localHoldouts section (FSSDK-12760)', () => {
688688
datafile.holdouts = [
689689
makeGlobal('stray', 'stray_global', { includedRules: ['rule_x'] }),
690690
];
691-
projectConfig.createProjectConfig(datafile);
691+
projectConfig.createProjectConfig(JSON.stringify(datafile));
692692
// Original datafile still has includedRules on the entry
693693
expect(datafile.holdouts[0].includedRules).toEqual(['rule_x']);
694694
});
@@ -700,7 +700,7 @@ describe('createProjectConfig - localHoldouts section (FSSDK-12760)', () => {
700700
makeLocal('l1', 'l1', ['rule_a']),
701701
makeLocal('l2', 'l2', ['rule_b']),
702702
];
703-
const config = projectConfig.createProjectConfig(datafile);
703+
const config = projectConfig.createProjectConfig(JSON.stringify(datafile));
704704

705705
expect(getGlobalHoldouts(config).map(h => h.id).sort()).toEqual(['g1', 'g2']);
706706
expect(getHoldoutsForRule(config, 'rule_a').map(h => h.id)).toEqual(['l1']);
@@ -718,7 +718,7 @@ describe('createProjectConfig - localHoldouts section (FSSDK-12760)', () => {
718718
delete invalid.includedRules;
719719
datafile.localHoldouts = [invalid];
720720

721-
const config = projectConfig.createProjectConfig(datafile, null, logger);
721+
const config = projectConfig.createProjectConfig(JSON.stringify(datafile), { logger });
722722

723723
expect(getGlobalHoldouts(config)).toEqual([]);
724724
expect(getHoldoutsForRule(config, 'any_rule')).toEqual([]);
@@ -733,7 +733,7 @@ describe('createProjectConfig - localHoldouts section (FSSDK-12760)', () => {
733733
datafile.holdouts = [];
734734
datafile.localHoldouts = [makeLocal('bad_null', 'null_local', null)];
735735

736-
const config = projectConfig.createProjectConfig(datafile, null, logger);
736+
const config = projectConfig.createProjectConfig(JSON.stringify(datafile), { logger });
737737

738738
expect(getHoldoutsForRule(config, 'any_rule')).toEqual([]);
739739
expect(config.holdoutIdMap!['bad_null']).toBeUndefined();
@@ -747,7 +747,7 @@ describe('createProjectConfig - localHoldouts section (FSSDK-12760)', () => {
747747
datafile.holdouts = [];
748748
datafile.localHoldouts = [makeLocal('bad_empty', 'empty_local', [])];
749749

750-
const config = projectConfig.createProjectConfig(datafile, null, logger);
750+
const config = projectConfig.createProjectConfig(JSON.stringify(datafile), { logger });
751751

752752
expect(getHoldoutsForRule(config, 'any_rule')).toEqual([]);
753753
expect(config.holdoutIdMap!['bad_empty']).toBeUndefined();
@@ -760,7 +760,7 @@ describe('createProjectConfig - localHoldouts section (FSSDK-12760)', () => {
760760
const datafile = cloneDeep(makeBaseDatafile()) as any;
761761
datafile.holdouts = [makeGlobal('g1', 'g')];
762762
datafile.localHoldouts = [makeLocal('l1', 'l', ['rule_x'])];
763-
const config = projectConfig.createProjectConfig(datafile);
763+
const config = projectConfig.createProjectConfig(JSON.stringify(datafile));
764764
expect(config.variationIdMap['g1_var']).toBeDefined();
765765
expect(config.variationIdMap['l1_var']).toBeDefined();
766766
});

0 commit comments

Comments
 (0)