From 34a065954788a44ed015237f17a29371171312d0 Mon Sep 17 00:00:00 2001 From: Ryan Lamb <4955475+kinyoklion@users.noreply.github.com> Date: Wed, 5 Jul 2023 09:22:02 -0700 Subject: [PATCH 1/2] fix: Fix an issue where fallthrough variations were not preserved when updating a flag with test data. --- .../__tests__/LDClient.evaluation.test.ts | 27 +++++++++++++++++++ .../integrations/test_data/TestData.test.ts | 12 ++++++++- .../test_data/TestDataFlagBuilder.ts | 2 +- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/packages/shared/sdk-server/__tests__/LDClient.evaluation.test.ts b/packages/shared/sdk-server/__tests__/LDClient.evaluation.test.ts index 6fa1f77b0c..9a851cac3d 100644 --- a/packages/shared/sdk-server/__tests__/LDClient.evaluation.test.ts +++ b/packages/shared/sdk-server/__tests__/LDClient.evaluation.test.ts @@ -34,6 +34,33 @@ describe('given an LDClient with test data', () => { client.close(); }); + it('evaluates a flag which has a fallthrough and a rule', async () => { + const testId = 'abcd'.repeat(8); + const flagKey = 'testFlag'; + await td.update(td.flag(flagKey).booleanFlag().variationForAll(true)); + await td.update(td.flag(flagKey).ifMatch('user', 'testId', testId).thenReturn(false)); + + // Evaluate with no testId + const flagsState = await client.allFlagsState({ + kind: 'user', + key: 'Global', + testId: undefined, + }); + + const features = flagsState.allValues(); + + expect(features[flagKey]).toBeTruthy(); + + const flagsStateWithTenant = await client.allFlagsState({ + kind: 'user', + key: testId, + testId, + }); + + const featuresWithTenant = flagsStateWithTenant.allValues(); + expect(featuresWithTenant[flagKey]).toBeFalsy(); + }); + it('evaluates an existing flag', async () => { td.update(td.flag('flagkey').on(true).variations('a', 'b').fallthroughVariation(1)); expect(await client.variation('flagkey', defaultUser, 'c')).toBe('b'); diff --git a/packages/shared/sdk-server/__tests__/integrations/test_data/TestData.test.ts b/packages/shared/sdk-server/__tests__/integrations/test_data/TestData.test.ts index 5e5e88a155..36eae45713 100644 --- a/packages/shared/sdk-server/__tests__/integrations/test_data/TestData.test.ts +++ b/packages/shared/sdk-server/__tests__/integrations/test_data/TestData.test.ts @@ -167,6 +167,9 @@ describe('given a TestData instance', () => { it('can clone a complex flag configuration', () => { const flag = td .flag('test-flag') + .offVariation(true) + .variationForAll(false) + .variationForUser('billy', true) .ifMatch('user', 'name', 'ben', 'christian') .andNotMatch('user', 'country', 'fr') .thenReturn(true); @@ -199,7 +202,14 @@ describe('given a TestData instance', () => { }, ]; - expect(flagCopy.build(1).rules).toEqual(flagRules); + const builtFlag = flagCopy.build(1); + expect(builtFlag.fallthrough).toEqual({ variation: 1 }); + expect(builtFlag.offVariation).toEqual(0); + expect(builtFlag.variations).toEqual([true, false]); + expect(builtFlag.contextTargets).toEqual([ + { contextKind: 'user', values: ['billy'], variation: 0 }, + ]); + expect(builtFlag.rules).toEqual(flagRules); }); it('defaults a new flag to on', () => { diff --git a/packages/shared/sdk-server/src/integrations/test_data/TestDataFlagBuilder.ts b/packages/shared/sdk-server/src/integrations/test_data/TestDataFlagBuilder.ts index c4bd5b0168..b07600b293 100644 --- a/packages/shared/sdk-server/src/integrations/test_data/TestDataFlagBuilder.ts +++ b/packages/shared/sdk-server/src/integrations/test_data/TestDataFlagBuilder.ts @@ -42,7 +42,7 @@ export default class TestDataFlagBuilder { this.data.offVariation = data.offVariation; } if (data.fallthroughVariation !== undefined) { - this.data.offVariation = data.offVariation; + this.data.fallthroughVariation = data.fallthroughVariation; } if (data.targetsByVariation) { this.data.targetsByVariation = JSON.parse(JSON.stringify(data.targetsByVariation)); From 8457837aefc0658e0775799b1bd50639ab07d7cc Mon Sep 17 00:00:00 2001 From: Ryan Lamb <4955475+kinyoklion@users.noreply.github.com> Date: Wed, 5 Jul 2023 09:24:21 -0700 Subject: [PATCH 2/2] Use different id. --- .../shared/sdk-server/__tests__/LDClient.evaluation.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/shared/sdk-server/__tests__/LDClient.evaluation.test.ts b/packages/shared/sdk-server/__tests__/LDClient.evaluation.test.ts index 9a851cac3d..936d457622 100644 --- a/packages/shared/sdk-server/__tests__/LDClient.evaluation.test.ts +++ b/packages/shared/sdk-server/__tests__/LDClient.evaluation.test.ts @@ -43,7 +43,7 @@ describe('given an LDClient with test data', () => { // Evaluate with no testId const flagsState = await client.allFlagsState({ kind: 'user', - key: 'Global', + key: 'fake', testId: undefined, });