Skip to content

Commit d867805

Browse files
MaryanneNjeriMaryanne Gichohi
andauthored
Remove trailing forward slash from store endpoint (#21475)
* Remove trailing forward slash from store endpoint * Update title --------- Co-authored-by: Maryanne Gichohi <mgichohi@microsoft.com>
1 parent 391cb3d commit d867805

File tree

15 files changed

+124
-11
lines changed

15 files changed

+124
-11
lines changed

Tasks/AzureAppConfigurationExportV10/Tests/L0.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import * as assert from 'assert';
22
import path = require('path');
33
import { MockTestRunner } from 'azure-pipelines-task-lib/mock-test';
44

5-
describe("Pull configuration settings test", function(){
5+
describe("Export task configuration settings test", function(){
66
this.timeout(30000);
77

88
before(async ()=> {
@@ -248,4 +248,18 @@ describe("Pull configuration settings test", function(){
248248
assert.strictEqual(tr.errorIssues[0], "loc_mock_InvalidSecretUrl");
249249
},tr);
250250
});
251+
252+
it("Trim any trailing forward slash in a store endpoint", async()=> {
253+
const taskPath = path.join(__dirname, "downloadKVWithInvalidStoreEndpoint.js");
254+
const tr = new MockTestRunner(taskPath);
255+
256+
await tr.runAsync();
257+
258+
runValidations(()=>{
259+
assert.strictEqual(tr.succeeded, true, "should have succeeded");
260+
assert.strictEqual(tr.warningIssues.length, 0, "should have no warnings");
261+
assert.strictEqual(tr.errorIssues.length, 0, "should have no errors");
262+
assert.ok(tr.stdout.indexOf("loc_mock_AppConfigurationEndpointTitle https://Test.azconfig.io") >= 0, "App Configuration Endpoint: https://Test.azconfig.io");
263+
},tr);
264+
});
251265
})
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { TaskMockRunner } from "azure-pipelines-task-lib/mock-run";
2+
import * as path from "path";
3+
4+
let taskPath = path.join(__dirname, "..", "index.js");
5+
let taskRunner:TaskMockRunner = new TaskMockRunner(taskPath);
6+
7+
taskRunner.setInput("AppConfigurationEndpoint", "https://Test.azconfig.io/");
8+
taskRunner.setInput("selectionMode", "Default");
9+
taskRunner.setInput("keyFilter", "*");
10+
taskRunner.setInput("ConnectedServiceName","AzureRMSpn");
11+
12+
taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', require('azure-pipelines-task-lib/mock-toolrunner'));
13+
taskRunner.registerMock('@azure/app-configuration', require('./mock_node_modules/app-configuration/appConfigurationClient'));
14+
taskRunner.registerMock('@azure/keyvault-secrets', require('./mock_node_modules/keyvault-secrets/secretClient'));
15+
16+
taskRunner.run();

Tasks/AzureAppConfigurationExportV10/task.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"author": "Microsoft Corporation",
1010
"version": {
1111
"Major": 10,
12-
"Minor": 264,
12+
"Minor": 266,
1313
"Patch": 0
1414
},
1515
"instanceNameFormat": "Azure App Configuration",

Tasks/AzureAppConfigurationExportV10/task.loc.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"author": "Microsoft Corporation",
1010
"version": {
1111
"Major": 10,
12-
"Minor": 264,
12+
"Minor": 266,
1313
"Patch": 0
1414
},
1515
"instanceNameFormat": "ms-resource:loc.instanceNameFormat",

Tasks/AzureAppConfigurationExportV10/taskParameter.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export class TaskParameters {
3535

3636
taskParameters.selectionMode = selectionMode == Default ? SelectionMode.Default : SelectionMode.Snapshot;
3737
try {
38-
taskParameters.configStoreUrl = tl.getInput("AppConfigurationEndpoint", true);
38+
taskParameters.configStoreUrl = this.trimTrailingSlash(tl.getInput("AppConfigurationEndpoint", true));
3939
taskParameters.keyFilter = tl.getInput("KeyFilter", taskParameters.selectionMode == SelectionMode.Default);
4040
taskParameters.snapshotName = tl.getInput("SnapshotName", taskParameters.selectionMode == SelectionMode.Snapshot);
4141
}
@@ -75,4 +75,11 @@ export class TaskParameters {
7575

7676
return taskParameters;
7777
}
78+
79+
private static trimTrailingSlash(endpoint: string): string {
80+
if (endpoint.endsWith("/")) {
81+
return endpoint.slice(0,-1);
82+
}
83+
return endpoint;
84+
}
7885
}

Tasks/AzureAppConfigurationImportV10/Tests/L0.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import * as assert from 'assert';
22
import * as path from "path";
33
import { MockTestRunner } from 'azure-pipelines-task-lib/mock-test';
44

5-
describe("Push task test", function () {
5+
describe("Import task test", function () {
66
this.timeout(30000);
77

88
before(async () => {
@@ -191,4 +191,18 @@ describe("Push task test", function () {
191191
assert.strictEqual(testRunner.errorIssues[0], "loc_mock_InvalidTypeInTags");
192192
}, testRunner);
193193
});
194+
195+
it("Trim any trailing forward slash in store endpoint", async ()=> {
196+
const taskPath = path.join(__dirname, "setKeyValueWithInvalidEndpoint.js");
197+
const testRunner = new MockTestRunner(taskPath);
198+
199+
await testRunner.runAsync();
200+
201+
runValidations(() => {
202+
assert.strictEqual(testRunner.succeeded, true, "should have succeeded");
203+
assert.strictEqual(testRunner.errorIssues.length, 0, "should have no errors");
204+
assert.strictEqual(testRunner.warningIssues.length, 0, "should have no warnings");
205+
assert.ok(testRunner.stdout.indexOf("loc_mock_AppConfigurationEndpointTitle https://Test.azconfig.io") > 0, "should successfully trim any trailing forward slash");
206+
}, testRunner);
207+
})
194208
});
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import * as path from "path";
2+
import { TaskMockRunner } from "azure-pipelines-task-lib/mock-run";
3+
4+
const taskPath = path.join(__dirname, "..", "index.js");
5+
const taskRunner:TaskMockRunner = new TaskMockRunner(taskPath);
6+
7+
const configurationFile: string = path.join(__dirname, 'sourceFiles/validConfigFile.json');
8+
9+
taskRunner.setInput("AppConfigurationEndpoint", "https://Test.azconfig.io/");
10+
taskRunner.setInput("ConfigurationFile", `${configurationFile}`);
11+
taskRunner.setInput("UseFilePathExtension", "true");
12+
taskRunner.setInput("Strict", "false");
13+
taskRunner.setInput("Separator", ":");
14+
taskRunner.setInput("ConnectedServiceName","AzureRMSpn");
15+
16+
taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', require('azure-pipelines-task-lib/mock-toolrunner'));
17+
taskRunner.registerMock('@azure/app-configuration', require('./mock_node_modules/app-configuration/appConfigurationClient'));
18+
19+
taskRunner.run();

Tasks/AzureAppConfigurationImportV10/task.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"author": "Microsoft Corporation",
1010
"version": {
1111
"Major": 10,
12-
"Minor": 265,
12+
"Minor": 266,
1313
"Patch": 0
1414
},
1515
"instanceNameFormat": "Azure App Configuration",

Tasks/AzureAppConfigurationImportV10/task.loc.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"author": "Microsoft Corporation",
1010
"version": {
1111
"Major": 10,
12-
"Minor": 265,
12+
"Minor": 266,
1313
"Patch": 0
1414
},
1515
"instanceNameFormat": "ms-resource:loc.instanceNameFormat",

Tasks/AzureAppConfigurationImportV10/taskParameters.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export class TaskParameters {
4343
taskParameters.profile = profile;
4444
taskParameters.useFilePathExtension = tl.getBoolInput("UseFilePathExtension", false);
4545
try {
46-
taskParameters.configStoreUrl = tl.getInput("AppConfigurationEndpoint", true);
46+
taskParameters.configStoreUrl = this.trimTrailingSlash(tl.getInput("AppConfigurationEndpoint", true));
4747
taskParameters.strict = tl.getBoolInput("Strict", true);
4848
connectedService = tl.getInput("ConnectedServiceName", true);
4949
taskParameters.filePath = tl.getPathInput("ConfigurationFile", true);
@@ -116,4 +116,11 @@ export class TaskParameters {
116116

117117
return taskParameters;
118118
}
119+
120+
private static trimTrailingSlash(endpoint: string): string {
121+
if (endpoint.endsWith("/")) {
122+
return endpoint.slice(0,-1)
123+
}
124+
return endpoint;
125+
}
119126
}

0 commit comments

Comments
 (0)