Skip to content

Commit 6df1970

Browse files
add testcases
1 parent 638338a commit 6df1970

File tree

2 files changed

+111
-2
lines changed

2 files changed

+111
-2
lines changed

src/AzureAppConfigurationImpl.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
ETAG_KEY_NAME,
2020
FEATURE_FLAG_ID_KEY_NAME,
2121
FEATURE_FLAG_REFERENCE_KEY_NAME,
22+
ALLOCATION_ID_KEY_NAME,
2223
ALLOCATION_KEY_NAME,
2324
DEFAULT_WHEN_ENABLED_KEY_NAME,
2425
PERCENTILE_KEY_NAME,
@@ -565,11 +566,12 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
565566

566567
if (featureFlag[TELEMETRY_KEY_NAME] && featureFlag[TELEMETRY_KEY_NAME][ENABLED_KEY_NAME] === true) {
567568
const metadata = featureFlag[TELEMETRY_KEY_NAME][METADATA_KEY_NAME];
569+
const allocationId = await this.#generateAllocationId(featureFlag);
568570
featureFlag[TELEMETRY_KEY_NAME][METADATA_KEY_NAME] = {
569571
[ETAG_KEY_NAME]: setting.etag,
570572
[FEATURE_FLAG_ID_KEY_NAME]: await this.#calculateFeatureFlagId(setting),
571573
[FEATURE_FLAG_REFERENCE_KEY_NAME]: this.#createFeatureFlagReference(setting),
572-
[ALLOCATION_KEY_NAME]: await this.#generateAllocationId(featureFlag),
574+
...(allocationId !== "" && { [ALLOCATION_ID_KEY_NAME]: allocationId }),
573575
...(metadata || {})
574576
};
575577
}

test/featureFlag.test.ts

Lines changed: 108 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,62 @@ const mockedKVs = [{
5555
createMockedFeatureFlag("Alpha_1", { enabled: true }),
5656
createMockedFeatureFlag("Alpha_2", { enabled: false }),
5757
createMockedFeatureFlag("Telemetry_1", { enabled: true, telemetry: { enabled: true } }, { etag: "ETag"}),
58-
createMockedFeatureFlag("Telemetry_2", { enabled: true, telemetry: { enabled: true } }, { etag: "ETag", label: "Test"})
58+
createMockedFeatureFlag("Telemetry_2", { enabled: true, telemetry: { enabled: true } }, { etag: "ETag", label: "Test"}),
59+
createMockedFeatureFlag("NoPercentileAndSeed", {
60+
enabled: true,
61+
telemetry: { enabled: true },
62+
variants: [ { name: "Control" }, { name: "Test" } ],
63+
allocation: {
64+
default_when_disabled: "Control",
65+
user: [ {users: ["Jeff"], variant: "Test"} ]
66+
}
67+
}),
68+
createMockedFeatureFlag("SeedOnly", {
69+
enabled: true,
70+
telemetry: { enabled: true },
71+
variants: [ { name: "Control" }, { name: "Test" } ],
72+
allocation: {
73+
default_when_disabled: "Control",
74+
user: [ {users: ["Jeff"], variant: "Test"} ],
75+
seed: "123"
76+
}
77+
}),
78+
createMockedFeatureFlag("DefaultWhenEnabledOnly", {
79+
enabled: true,
80+
telemetry: { enabled: true },
81+
variants: [ { name: "Control" }, { name: "Test" } ],
82+
allocation: {
83+
default_when_enabled: "Control"
84+
}
85+
}),
86+
createMockedFeatureFlag("PercentileOnly", {
87+
enabled: true,
88+
telemetry: { enabled: true },
89+
variants: [ ],
90+
allocation: {
91+
percentile: [ { from: 0, to: 50, variant: "Control" }, { from: 50, to: 100, variant: "Test" } ]
92+
}
93+
}),
94+
createMockedFeatureFlag("SimpleConfigurationValue", {
95+
enabled: true,
96+
telemetry: { enabled: true },
97+
variants: [ { name: "Control", configuration_value: "standard" }, { name: "Test", configuration_value: "special" } ],
98+
allocation: {
99+
default_when_enabled: "Control",
100+
percentile: [ { from: 0, to: 50, variant: "Control" }, { from: 50, to: 100, variant: "Test" } ],
101+
seed: "123"
102+
}
103+
}),
104+
createMockedFeatureFlag("ComplexConfigurationValue", {
105+
enabled: true,
106+
telemetry: { enabled: true },
107+
variants: [ { name: "Control", configuration_value: { title: { size: 100, color: "red" }, options: [ 1, 2, 3 ]} }, { name: "Test", configuration_value: { title: { size: 200, color: "blue" }, options: [ "1", "2", "3" ]} } ],
108+
allocation: {
109+
default_when_enabled: "Control",
110+
percentile: [ { from: 0, to: 50, variant: "Control" }, { from: 50, to: 100, variant: "Test" } ],
111+
seed: "123"
112+
}
113+
}),
59114
]);
60115

61116
describe("feature flags", function () {
@@ -200,4 +255,56 @@ describe("feature flags", function () {
200255
expect(featureFlag.telemetry.metadata.FeatureFlagId).equals("Rc8Am7HIGDT7HC5Ovs3wKN_aGaaK_Uz1mH2e11gaK0o");
201256
expect(featureFlag.telemetry.metadata.FeatureFlagReference).equals(`${createMockedEndpoint()}/kv/.appconfig.featureflag/Telemetry_2?label=Test`);
202257
});
258+
259+
it("should not populate allocation id", async () => {
260+
const connectionString = createMockedConnectionString();
261+
const settings = await load(connectionString, {
262+
featureFlagOptions: {
263+
enabled: true,
264+
selectors: [ { keyFilter: "*" } ]
265+
}
266+
});
267+
expect(settings).not.undefined;
268+
expect(settings.get("feature_management")).not.undefined;
269+
const featureFlags = settings.get<any>("feature_management").feature_flags;
270+
expect(featureFlags).not.undefined;
271+
272+
const NoPercentileAndSeed = (featureFlags as any[]).find(item => item.id === "NoPercentileAndSeed");
273+
expect(NoPercentileAndSeed).not.undefined;
274+
expect(NoPercentileAndSeed?.telemetry.metadata.AllocationId).to.be.undefined;
275+
});
276+
277+
it("should populate allocation id", async () => {
278+
const connectionString = createMockedConnectionString();
279+
const settings = await load(connectionString, {
280+
featureFlagOptions: {
281+
enabled: true,
282+
selectors: [ { keyFilter: "*" } ]
283+
}
284+
});
285+
expect(settings).not.undefined;
286+
expect(settings.get("feature_management")).not.undefined;
287+
const featureFlags = settings.get<any>("feature_management").feature_flags;
288+
expect(featureFlags).not.undefined;
289+
290+
const SeedOnly = (featureFlags as any[]).find(item => item.id === "SeedOnly");
291+
expect(SeedOnly).not.undefined;
292+
expect(SeedOnly?.telemetry.metadata.AllocationId).equals("qZApcKdfXscxpgn_8CMf");
293+
294+
const DefaultWhenEnabledOnly = (featureFlags as any[]).find(item => item.id === "DefaultWhenEnabledOnly");
295+
expect(DefaultWhenEnabledOnly).not.undefined;
296+
expect(DefaultWhenEnabledOnly?.telemetry.metadata.AllocationId).equals("k486zJjud_HkKaL1C4qB");
297+
298+
const PercentileOnly = (featureFlags as any[]).find(item => item.id === "PercentileOnly");
299+
expect(PercentileOnly).not.undefined;
300+
expect(PercentileOnly?.telemetry.metadata.AllocationId).equals("5YUbmP0P5s47zagO_LvI");
301+
302+
const SimpleConfigurationValue = (featureFlags as any[]).find(item => item.id === "SimpleConfigurationValue");
303+
expect(SimpleConfigurationValue).not.undefined;
304+
expect(SimpleConfigurationValue?.telemetry.metadata.AllocationId).equals("QIOEOTQJr2AXo4dkFFqy");
305+
306+
const ComplexConfigurationValue = (featureFlags as any[]).find(item => item.id === "ComplexConfigurationValue");
307+
expect(ComplexConfigurationValue).not.undefined;
308+
expect(ComplexConfigurationValue?.telemetry.metadata.AllocationId).equals("72A0b4sZ5HSAtaQxFe73");
309+
});
203310
});

0 commit comments

Comments
 (0)