Skip to content

Commit 9eb9c4b

Browse files
Add basic telemetry test (#25)
* add basic telemetry test * update
1 parent dd813ce commit 9eb9c4b

5 files changed

Lines changed: 96 additions & 20 deletions

File tree

libraryValidations/JavaScript/featureEvaluationValidation.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33

44
import * as fs from "node:fs/promises";
55
import { FeatureManager, ConfigurationObjectFeatureFlagProvider } from "@microsoft/feature-management";
6-
import {FILE_PATH, SAMPLE_JSON_KEY, TESTS_JSON_KEY, validateFeatureEvaluation, FeatureFlagTest } from "./utils.js";
6+
import { FILE_PATH, SAMPLE_JSON_KEY, TESTS_JSON_KEY, validateFeatureEvaluation, FeatureFlagTest } from "./utils.js";
77

88
async function runTest(testName: string) {
99
const config = JSON.parse(await fs.readFile(FILE_PATH + testName + SAMPLE_JSON_KEY, "utf8"));
1010
const testcases: FeatureFlagTest[] = JSON.parse(await fs.readFile(FILE_PATH + testName + TESTS_JSON_KEY, "utf8"));
1111
const ffProvider = new ConfigurationObjectFeatureFlagProvider(config);
1212
const fm = new FeatureManager(ffProvider);
1313

14-
for (const testcase of testcases){
14+
for (const testcase of testcases) {
1515
validateFeatureEvaluation(testcase, fm);
1616
}
1717
}

libraryValidations/JavaScript/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@
1717
"sinon": "^15.2.0",
1818
"tslib": "^2.6.2",
1919
"typescript": "^5.3.3",
20-
"@microsoft/feature-management": "2.0.0-preview.3",
21-
"@microsoft/feature-management-applicationinsights-browser": "2.0.0-preview.3",
22-
"@microsoft/feature-management-applicationinsights-node": "2.0.0-preview.3",
23-
"@azure/app-configuration-provider": "2.0.0-preview.1",
20+
"@microsoft/feature-management": "latest",
21+
"@microsoft/feature-management-applicationinsights-browser": "latest",
22+
"@microsoft/feature-management-applicationinsights-node": "latest",
23+
"@azure/app-configuration-provider": "latest",
2424
"@microsoft/applicationinsights-web": "^3.3.4",
2525
"applicationinsights": "^2.9.6"
2626
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT license.
3+
4+
import * as sinon from "sinon";
5+
import * as fs from "node:fs/promises";
6+
import { FeatureManager, ConfigurationObjectFeatureFlagProvider } from "@microsoft/feature-management";
7+
import { createTelemetryPublisher as createNodeTelemetryPublisher } from "@microsoft/feature-management-applicationinsights-node";
8+
import { createTelemetryPublisher as createBrowserTelemetryPublisher } from "@microsoft/feature-management-applicationinsights-browser";
9+
import { FILE_PATH, SAMPLE_JSON_KEY, TESTS_JSON_KEY, validateFeatureEvaluation, validateTelemetry, FeatureFlagTest } from "./utils.js";
10+
import { ApplicationInsights } from "@microsoft/applicationinsights-web";
11+
import applicationInsights from "applicationinsights";
12+
13+
// For telemetry validation
14+
let eventNameToValidate;
15+
let eventPropertiesToValidate;
16+
17+
applicationInsights.setup("DUMMY-CONNECTION-STRING").start();
18+
sinon.stub(applicationInsights.defaultClient, "trackEvent").callsFake((event) => {
19+
eventNameToValidate = event.name;
20+
eventPropertiesToValidate = event.properties;
21+
});
22+
23+
const appInsights = new ApplicationInsights({ config: { connectionString: "DUMMY-CONNECTION-STRING" }});
24+
sinon.stub(appInsights, "trackEvent").callsFake((event, customProperties) => {
25+
eventNameToValidate = event.name;
26+
eventPropertiesToValidate = customProperties;
27+
});
28+
29+
async function runTestWithNodePackage(testName: string) {
30+
const config = JSON.parse(await fs.readFile(FILE_PATH + testName + SAMPLE_JSON_KEY, "utf8"));
31+
const testcases: FeatureFlagTest[] = JSON.parse(await fs.readFile(FILE_PATH + testName + TESTS_JSON_KEY, "utf8"));
32+
const ffProvider = new ConfigurationObjectFeatureFlagProvider(config);
33+
const fm = new FeatureManager(ffProvider, { onFeatureEvaluated: createNodeTelemetryPublisher(applicationInsights.defaultClient) });
34+
35+
for (const testcase of testcases) {
36+
const featureFlagName = testcase.FeatureFlagName;
37+
const context = { userId: testcase.Inputs?.User, groups: testcase.Inputs?.Groups };
38+
await fm.getVariant(featureFlagName, context);
39+
validateTelemetry(testcase, undefined, eventNameToValidate, eventPropertiesToValidate);
40+
validateFeatureEvaluation(testcase, fm);
41+
}
42+
}
43+
44+
async function runTestWithBrowserPackage(testName: string) {
45+
const config = JSON.parse(await fs.readFile(FILE_PATH + testName + SAMPLE_JSON_KEY, "utf8"));
46+
const testcases: FeatureFlagTest[] = JSON.parse(await fs.readFile(FILE_PATH + testName + TESTS_JSON_KEY, "utf8"));
47+
const ffProvider = new ConfigurationObjectFeatureFlagProvider(config);
48+
const fm = new FeatureManager(ffProvider, { onFeatureEvaluated: createBrowserTelemetryPublisher(appInsights) });
49+
50+
for (const testcase of testcases) {
51+
const featureFlagName = testcase.FeatureFlagName;
52+
const context = { userId: testcase.Inputs?.User, groups: testcase.Inputs?.Groups };
53+
await fm.getVariant(featureFlagName, context);
54+
validateTelemetry(testcase, undefined, eventNameToValidate, eventPropertiesToValidate);
55+
validateFeatureEvaluation(testcase, fm);
56+
}
57+
}
58+
59+
describe("telemetry with provider and node package", function () {
60+
it("should pass BasicTelemetry test", async () => {
61+
await runTestWithNodePackage("BasicTelemetry");
62+
});
63+
});
64+
65+
describe("telemetry with provider and browser package", function () {
66+
it("should pass BasicTelemetry test", async () => {
67+
await runTestWithBrowserPackage("BasicTelemetry");
68+
});
69+
});

libraryValidations/JavaScript/telemetryWithProviderValidation.test.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { load } from "@azure/app-configuration-provider";
77
import { FeatureManager, ConfigurationMapFeatureFlagProvider } from "@microsoft/feature-management";
88
import { createTelemetryPublisher as createNodeTelemetryPublisher } from "@microsoft/feature-management-applicationinsights-node";
99
import { createTelemetryPublisher as createBrowserTelemetryPublisher } from "@microsoft/feature-management-applicationinsights-browser";
10-
import {FILE_PATH, TESTS_JSON_KEY, FeatureFlagTest, validateFeatureEvaluation, validateTelemetryWithProvider } from "./utils.js";
10+
import { FILE_PATH, TESTS_JSON_KEY, FeatureFlagTest, validateFeatureEvaluation, validateTelemetry } from "./utils.js";
1111
import { ApplicationInsights } from "@microsoft/applicationinsights-web";
1212
import applicationInsights from "applicationinsights";
1313

@@ -48,11 +48,12 @@ async function runTestWithProviderAndNodePackage(testName: string) {
4848
const testcases: FeatureFlagTest[] = JSON.parse(await fs.readFile(FILE_PATH + testName + TESTS_JSON_KEY, "utf8"));
4949
const ffProvider = new ConfigurationMapFeatureFlagProvider(config);
5050
const fm = new FeatureManager(ffProvider, { onFeatureEvaluated: createNodeTelemetryPublisher(applicationInsights.defaultClient) });
51-
for (const testcase of testcases){
51+
for (const testcase of testcases) {
5252
const featureFlagName = testcase.FeatureFlagName;
5353
const context = { userId: testcase.Inputs?.User, groups: testcase.Inputs?.Groups };
5454
await fm.getVariant(featureFlagName, context);
55-
validateTelemetryWithProvider(testcase, connectionString, eventNameToValidate, eventPropertiesToValidate);
55+
validateTelemetry(testcase, connectionString, eventNameToValidate, eventPropertiesToValidate);
56+
validateFeatureEvaluation(testcase, fm);
5657
}
5758
}
5859

@@ -77,11 +78,12 @@ async function runTestWithProviderAndBrowserPackage(testName: string) {
7778
const testcases: FeatureFlagTest[] = JSON.parse(await fs.readFile(FILE_PATH + testName + TESTS_JSON_KEY, "utf8"));
7879
const ffProvider = new ConfigurationMapFeatureFlagProvider(config);
7980
const fm = new FeatureManager(ffProvider, { onFeatureEvaluated: createBrowserTelemetryPublisher(appInsights) });
80-
for (const testcase of testcases){
81+
for (const testcase of testcases) {
8182
const featureFlagName = testcase.FeatureFlagName;
8283
const context = { userId: testcase.Inputs?.User, groups: testcase.Inputs?.Groups };
8384
await fm.getVariant(featureFlagName, context);
84-
validateTelemetryWithProvider(testcase, connectionString, eventNameToValidate, eventPropertiesToValidate);
85+
validateTelemetry(testcase, connectionString, eventNameToValidate, eventPropertiesToValidate);
86+
validateFeatureEvaluation(testcase, fm);
8587
}
8688
}
8789

libraryValidations/JavaScript/utils.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,10 @@ export async function validateFeatureEvaluation(testcase: FeatureFlagTest, featu
108108
}
109109
}
110110

111-
export function validateTelemetryWithProvider(testcase: FeatureFlagTest, connectionString: string, eventNameToValidate: string, eventPropertiesToValidate: any) {
112-
// if (testcase.Telemetry?.EventName) {
113-
// expect(eventNameToValidate).to.eq(testcase.Telemetry.EventName);
114-
// }
111+
export function validateTelemetry(testcase: FeatureFlagTest, connectionString: string | undefined, eventNameToValidate: string, eventPropertiesToValidate: any) {
112+
if (testcase.Telemetry?.EventName) {
113+
expect(eventNameToValidate).to.eq(testcase.Telemetry.EventName);
114+
}
115115

116116
const eventProperties = testcase.Telemetry?.EventProperties;
117117
if (eventProperties) {
@@ -143,16 +143,21 @@ export function validateTelemetryWithProvider(testcase: FeatureFlagTest, connect
143143
expect(eventPropertiesToValidate["FeatureFlagId"]).to.eq(eventProperties.FeatureFlagId);
144144
}
145145
if (eventProperties.FeatureFlagReference) {
146-
const endpointMatch = connectionString.match(/Endpoint=([^;]+)/);
147-
if (endpointMatch) {
148-
expect(eventPropertiesToValidate["FeatureFlagReference"]).to.eq(endpointMatch[1] + eventProperties.FeatureFlagReference);
146+
if (connectionString === undefined) {
147+
expect(eventPropertiesToValidate["FeatureFlagReference"]).to.eq(eventProperties.FeatureFlagReference);
149148
}
150149
else {
151-
expect.fail("Connection string does not contain endpoint.");
150+
const endpointMatch = connectionString.match(/Endpoint=([^;]+)/);
151+
if (endpointMatch) {
152+
expect(eventPropertiesToValidate["FeatureFlagReference"]).to.eq(endpointMatch[1] + eventProperties.FeatureFlagReference);
153+
}
154+
else {
155+
expect.fail("Connection string does not contain endpoint.");
156+
}
152157
}
153158
}
154159
if (eventProperties.TargetingId) {
155160
expect(eventPropertiesToValidate["TargetingId"]).to.eq(eventProperties.TargetingId);
156161
}
157162
}
158-
}
163+
}

0 commit comments

Comments
 (0)