Skip to content

Commit d74fdd2

Browse files
add cache break token test
1 parent f367161 commit d74fdd2

File tree

5 files changed

+123
-10
lines changed

5 files changed

+123
-10
lines changed

src/requestTracing/utils.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ function applyRequestTracing<T extends OperationOptions>(requestTracingOptions:
9595
actualOptions.requestOptions = {
9696
...actualOptions.requestOptions,
9797
customHeaders: {
98+
...actualOptions.requestOptions?.customHeaders,
9899
[CORRELATION_CONTEXT_HEADER_NAME]: createCorrelationContextHeader(requestTracingOptions)
99100
}
100101
};

test/exportedApi.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22
// Licensed under the MIT license.
33

44
export { load, loadFromAzureFrontDoor } from "../src";
5+
export { CDN_TOKEN_LOOKUP_HEADER } from "../src/azureFrontDoor/cdnRequestPipelinePolicy.js";

test/load.test.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import * as chai from "chai";
55
import * as chaiAsPromised from "chai-as-promised";
66
chai.use(chaiAsPromised);
77
const expect = chai.expect;
8-
import { load, loadFromAzureFrontDoor } from "./exportedApi.js";
8+
import { load } from "./exportedApi.js";
99
import { MAX_TIME_OUT, mockAppConfigurationClientListConfigurationSettings, mockAppConfigurationClientGetSnapshot, mockAppConfigurationClientListConfigurationSettingsForSnapshot, restoreMocks, createMockedConnectionString, createMockedEndpoint, createMockedTokenCredential, createMockedKeyValue } from "./utils/testHelper.js";
1010

1111
const mockedKVs = [{
@@ -113,14 +113,6 @@ describe("load", function () {
113113
expect(settings.get("app.settings.fontSize")).eq("40");
114114
});
115115

116-
it("should load data from Azure Front Door", async () => {
117-
const endpoint = createMockedEndpoint();
118-
const settings = await loadFromAzureFrontDoor(endpoint);
119-
expect(settings).not.undefined;
120-
expect(settings.get("app.settings.fontColor")).eq("red");
121-
expect(settings.get("app.settings.fontSize")).eq("40");
122-
});
123-
124116
it("should throw error given invalid connection string", async () => {
125117
return expect(load("invalid-connection-string")).eventually.rejectedWith("Invalid connection string");
126118
});
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT license.
3+
4+
import * as chai from "chai";
5+
import * as chaiAsPromised from "chai-as-promised";
6+
chai.use(chaiAsPromised);
7+
const expect = chai.expect;
8+
import { CDN_TOKEN_LOOKUP_HEADER, loadFromAzureFrontDoor } from "./exportedApi.js";
9+
import { MAX_TIME_OUT, mockAppConfigurationClientListConfigurationSettings, mockAppConfigurationClientGetConfigurationSetting, restoreMocks, createMockedEndpoint, createMockedKeyValue, sleepInMs } from "./utils/testHelper.js";
10+
import * as uuid from "uuid";
11+
import { ListConfigurationSettingsOptions, GetConfigurationSettingOptions } from "@azure/app-configuration";
12+
13+
let mockedKVs: any[] = [];
14+
15+
function updateSetting(key: string, value: any) {
16+
const setting = mockedKVs.find(elem => elem.key === key);
17+
if (setting) {
18+
setting.value = value;
19+
setting.etag = uuid.v4();
20+
}
21+
}
22+
23+
describe("load from Azure Front Door", function () {
24+
this.timeout(MAX_TIME_OUT);
25+
26+
before(() => {
27+
mockedKVs = [
28+
{ value: "red", key: "app.settings.fontColor" },
29+
{ value: "40", key: "app.settings.fontSize" }
30+
].map(createMockedKeyValue);
31+
mockAppConfigurationClientListConfigurationSettings([mockedKVs]);
32+
});
33+
34+
after(() => {
35+
restoreMocks();
36+
});
37+
38+
it("should load data from Azure Front Door", async () => {
39+
const endpoint = createMockedEndpoint();
40+
const settings = await loadFromAzureFrontDoor(endpoint);
41+
expect(settings).not.undefined;
42+
expect(settings.get("app.settings.fontColor")).eq("red");
43+
expect(settings.get("app.settings.fontSize")).eq("40");
44+
});
45+
46+
it("should throw error when replica discovery is enabled", async () => {
47+
const endpoint = createMockedEndpoint();
48+
return expect(loadFromAzureFrontDoor(endpoint, {
49+
replicaDiscoveryEnabled: true
50+
})).eventually.rejectedWith("Replica discovery is not supported when loading from Azure Front Door.");
51+
});
52+
53+
it("should throw error when load balancing is enabled", async () => {
54+
const endpoint = createMockedEndpoint();
55+
return expect(loadFromAzureFrontDoor(endpoint, {
56+
loadBalancingEnabled: true
57+
})).eventually.rejectedWith("Load balancing is not supported when loading from Azure Front Door.");
58+
});
59+
});
60+
61+
let cdnTokenLookup;
62+
const listKvFromAfdCallback = (options: ListConfigurationSettingsOptions) => {
63+
cdnTokenLookup = options.requestOptions?.customHeaders?.[CDN_TOKEN_LOOKUP_HEADER];
64+
};
65+
const getKvFromAfdCallback = (options: GetConfigurationSettingOptions) => {
66+
cdnTokenLookup = options.requestOptions?.customHeaders?.[CDN_TOKEN_LOOKUP_HEADER];
67+
};
68+
describe("dynamic refresh when loading from Azure Front Door", function () {
69+
this.timeout(MAX_TIME_OUT);
70+
71+
beforeEach(() => {
72+
mockedKVs = [
73+
{ value: "red", key: "app.settings.fontColor" },
74+
{ value: "40", key: "app.settings.fontSize" }
75+
].map(createMockedKeyValue);
76+
mockAppConfigurationClientListConfigurationSettings([mockedKVs], listKvFromAfdCallback);
77+
mockAppConfigurationClientGetConfigurationSetting(mockedKVs, getKvFromAfdCallback);
78+
});
79+
80+
afterEach(() => {
81+
restoreMocks();
82+
});
83+
84+
it("should append cdn token to the watch request", async () => {
85+
const endpoint = createMockedEndpoint();
86+
const settings = await loadFromAzureFrontDoor(endpoint, {
87+
refreshOptions: {
88+
enabled: true,
89+
refreshIntervalInMs: 2_000,
90+
watchedSettings: [
91+
{ key: "app.settings.fontColor" }
92+
]
93+
}
94+
});
95+
expect(settings).not.undefined;
96+
expect(settings.get("app.settings.fontColor")).eq("red");
97+
expect(settings.get("app.settings.fontSize")).eq("40");
98+
99+
updateSetting("app.settings.fontColor", "blue");
100+
101+
await settings.refresh();
102+
expect(settings.get("app.settings.fontColor")).eq("red");
103+
expect(cdnTokenLookup).is.undefined;
104+
105+
await sleepInMs(2 * 1000 + 1);
106+
await settings.refresh();
107+
expect(settings.get("app.settings.fontColor")).eq("blue");
108+
expect(cdnTokenLookup).is.not.undefined;
109+
const previousCdnToken = cdnTokenLookup;
110+
111+
updateSetting("app.settings.fontColor", "green");
112+
113+
await sleepInMs(2 * 1000 + 1);
114+
await settings.refresh();
115+
expect(settings.get("app.settings.fontColor")).eq("green");
116+
expect(cdnTokenLookup).is.not.undefined;
117+
expect(cdnTokenLookup).to.not.eq(previousCdnToken);
118+
});
119+
});

test/refresh.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ describe("dynamic refresh", function () {
438438
});
439439

440440
describe("dynamic refresh feature flags", function () {
441-
this.timeout(10000);
441+
this.timeout(MAX_TIME_OUT);
442442

443443
beforeEach(() => {
444444
});

0 commit comments

Comments
 (0)