@azure/microsoft-playwright-testing 1.0.0-alpha.20250716.1 → 1.0.0-alpha.20250721.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/common/constants.js +100 -100
- package/dist/browser/common/constants.js.map +1 -1
- package/dist/browser/common/customerConfig.js +3 -0
- package/dist/browser/common/customerConfig.js.map +1 -1
- package/dist/browser/common/entraIdAccessToken.js +46 -43
- package/dist/browser/common/entraIdAccessToken.js.map +1 -1
- package/dist/browser/common/environmentVariables.js +8 -0
- package/dist/browser/common/environmentVariables.js.map +1 -1
- package/dist/browser/common/executor.js +1 -2
- package/dist/browser/common/executor.js.map +1 -1
- package/dist/browser/common/multimap.js +1 -0
- package/dist/browser/common/multimap.js.map +1 -1
- package/dist/browser/common/playwrightServiceConfig.js +34 -28
- package/dist/browser/common/playwrightServiceConfig.js.map +1 -1
- package/dist/browser/core/playwrightService.js +13 -8
- package/dist/browser/core/playwrightService.js.map +1 -1
- package/dist/browser/core/playwrightServiceEntra.js +36 -33
- package/dist/browser/core/playwrightServiceEntra.js.map +1 -1
- package/dist/browser/model/entraTokenDetails.js +4 -0
- package/dist/browser/model/entraTokenDetails.js.map +1 -1
- package/dist/browser/model/mptTokenDetails.js +8 -0
- package/dist/browser/model/mptTokenDetails.js.map +1 -1
- package/dist/browser/model/shard.js +10 -0
- package/dist/browser/model/shard.js.map +1 -1
- package/dist/browser/model/storageUri.js +4 -0
- package/dist/browser/model/storageUri.js.map +1 -1
- package/dist/browser/model/testResult.js +18 -0
- package/dist/browser/model/testResult.js.map +1 -1
- package/dist/browser/model/testRun.js +8 -3
- package/dist/browser/model/testRun.js.map +1 -1
- package/dist/browser/reporter/mptReporter.js +53 -47
- package/dist/browser/reporter/mptReporter.js.map +1 -1
- package/dist/browser/utils/cIInfoProvider.js +8 -9
- package/dist/browser/utils/cIInfoProvider.js.map +1 -1
- package/dist/browser/utils/packageManager.js +21 -27
- package/dist/browser/utils/packageManager.js.map +1 -1
- package/dist/browser/utils/reporterUtils.js +34 -31
- package/dist/browser/utils/reporterUtils.js.map +1 -1
- package/dist/browser/utils/serviceClient.js +7 -2
- package/dist/browser/utils/serviceClient.js.map +1 -1
- package/dist/browser/utils/utils.js +1 -1
- package/dist/browser/utils/utils.js.map +1 -1
- package/dist/commonjs/common/constants.js +101 -101
- package/dist/commonjs/common/constants.js.map +1 -1
- package/dist/commonjs/common/customerConfig.js +3 -0
- package/dist/commonjs/common/customerConfig.js.map +1 -1
- package/dist/commonjs/common/entraIdAccessToken.js +46 -43
- package/dist/commonjs/common/entraIdAccessToken.js.map +1 -1
- package/dist/commonjs/common/environmentVariables.js +8 -0
- package/dist/commonjs/common/environmentVariables.js.map +1 -1
- package/dist/commonjs/common/executor.js +1 -2
- package/dist/commonjs/common/executor.js.map +1 -1
- package/dist/commonjs/common/multimap.js +1 -0
- package/dist/commonjs/common/multimap.js.map +1 -1
- package/dist/commonjs/common/playwrightServiceConfig.js +34 -28
- package/dist/commonjs/common/playwrightServiceConfig.js.map +1 -1
- package/dist/commonjs/core/playwrightService.js +13 -8
- package/dist/commonjs/core/playwrightService.js.map +1 -1
- package/dist/commonjs/core/playwrightServiceEntra.js +36 -33
- package/dist/commonjs/core/playwrightServiceEntra.js.map +1 -1
- package/dist/commonjs/model/entraTokenDetails.js +4 -0
- package/dist/commonjs/model/entraTokenDetails.js.map +1 -1
- package/dist/commonjs/model/mptTokenDetails.js +8 -0
- package/dist/commonjs/model/mptTokenDetails.js.map +1 -1
- package/dist/commonjs/model/shard.js +10 -0
- package/dist/commonjs/model/shard.js.map +1 -1
- package/dist/commonjs/model/storageUri.js +4 -0
- package/dist/commonjs/model/storageUri.js.map +1 -1
- package/dist/commonjs/model/testResult.js +18 -0
- package/dist/commonjs/model/testResult.js.map +1 -1
- package/dist/commonjs/model/testRun.js +8 -3
- package/dist/commonjs/model/testRun.js.map +1 -1
- package/dist/commonjs/reporter/mptReporter.js +53 -47
- package/dist/commonjs/reporter/mptReporter.js.map +1 -1
- package/dist/commonjs/tsdoc-metadata.json +11 -11
- package/dist/commonjs/utils/cIInfoProvider.js +8 -9
- package/dist/commonjs/utils/cIInfoProvider.js.map +1 -1
- package/dist/commonjs/utils/packageManager.js +21 -27
- package/dist/commonjs/utils/packageManager.js.map +1 -1
- package/dist/commonjs/utils/reporterUtils.js +34 -31
- package/dist/commonjs/utils/reporterUtils.js.map +1 -1
- package/dist/commonjs/utils/serviceClient.js +7 -2
- package/dist/commonjs/utils/serviceClient.js.map +1 -1
- package/dist/commonjs/utils/utils.js +1 -1
- package/dist/commonjs/utils/utils.js.map +1 -1
- package/dist/esm/common/constants.js +100 -100
- package/dist/esm/common/constants.js.map +1 -1
- package/dist/esm/common/customerConfig.js +3 -0
- package/dist/esm/common/customerConfig.js.map +1 -1
- package/dist/esm/common/entraIdAccessToken.js +46 -43
- package/dist/esm/common/entraIdAccessToken.js.map +1 -1
- package/dist/esm/common/environmentVariables.js +8 -0
- package/dist/esm/common/environmentVariables.js.map +1 -1
- package/dist/esm/common/executor.js +1 -2
- package/dist/esm/common/executor.js.map +1 -1
- package/dist/esm/common/multimap.js +1 -0
- package/dist/esm/common/multimap.js.map +1 -1
- package/dist/esm/common/playwrightServiceConfig.js +34 -28
- package/dist/esm/common/playwrightServiceConfig.js.map +1 -1
- package/dist/esm/core/playwrightService.js +13 -8
- package/dist/esm/core/playwrightService.js.map +1 -1
- package/dist/esm/core/playwrightServiceEntra.js +36 -33
- package/dist/esm/core/playwrightServiceEntra.js.map +1 -1
- package/dist/esm/model/entraTokenDetails.js +4 -0
- package/dist/esm/model/entraTokenDetails.js.map +1 -1
- package/dist/esm/model/mptTokenDetails.js +8 -0
- package/dist/esm/model/mptTokenDetails.js.map +1 -1
- package/dist/esm/model/shard.js +10 -0
- package/dist/esm/model/shard.js.map +1 -1
- package/dist/esm/model/storageUri.js +4 -0
- package/dist/esm/model/storageUri.js.map +1 -1
- package/dist/esm/model/testResult.js +18 -0
- package/dist/esm/model/testResult.js.map +1 -1
- package/dist/esm/model/testRun.js +8 -3
- package/dist/esm/model/testRun.js.map +1 -1
- package/dist/esm/reporter/mptReporter.js +53 -47
- package/dist/esm/reporter/mptReporter.js.map +1 -1
- package/dist/esm/utils/cIInfoProvider.js +8 -9
- package/dist/esm/utils/cIInfoProvider.js.map +1 -1
- package/dist/esm/utils/packageManager.js +21 -27
- package/dist/esm/utils/packageManager.js.map +1 -1
- package/dist/esm/utils/reporterUtils.js +34 -31
- package/dist/esm/utils/reporterUtils.js.map +1 -1
- package/dist/esm/utils/serviceClient.js +7 -2
- package/dist/esm/utils/serviceClient.js.map +1 -1
- package/dist/esm/utils/utils.js +1 -1
- package/dist/esm/utils/utils.js.map +1 -1
- package/dist/react-native/common/constants.js +100 -100
- package/dist/react-native/common/constants.js.map +1 -1
- package/dist/react-native/common/customerConfig.js +3 -0
- package/dist/react-native/common/customerConfig.js.map +1 -1
- package/dist/react-native/common/entraIdAccessToken.js +46 -43
- package/dist/react-native/common/entraIdAccessToken.js.map +1 -1
- package/dist/react-native/common/environmentVariables.js +8 -0
- package/dist/react-native/common/environmentVariables.js.map +1 -1
- package/dist/react-native/common/executor.js +1 -2
- package/dist/react-native/common/executor.js.map +1 -1
- package/dist/react-native/common/multimap.js +1 -0
- package/dist/react-native/common/multimap.js.map +1 -1
- package/dist/react-native/common/playwrightServiceConfig.js +34 -28
- package/dist/react-native/common/playwrightServiceConfig.js.map +1 -1
- package/dist/react-native/core/playwrightService.js +13 -8
- package/dist/react-native/core/playwrightService.js.map +1 -1
- package/dist/react-native/core/playwrightServiceEntra.js +36 -33
- package/dist/react-native/core/playwrightServiceEntra.js.map +1 -1
- package/dist/react-native/model/entraTokenDetails.js +4 -0
- package/dist/react-native/model/entraTokenDetails.js.map +1 -1
- package/dist/react-native/model/mptTokenDetails.js +8 -0
- package/dist/react-native/model/mptTokenDetails.js.map +1 -1
- package/dist/react-native/model/shard.js +10 -0
- package/dist/react-native/model/shard.js.map +1 -1
- package/dist/react-native/model/storageUri.js +4 -0
- package/dist/react-native/model/storageUri.js.map +1 -1
- package/dist/react-native/model/testResult.js +18 -0
- package/dist/react-native/model/testResult.js.map +1 -1
- package/dist/react-native/model/testRun.js +8 -3
- package/dist/react-native/model/testRun.js.map +1 -1
- package/dist/react-native/reporter/mptReporter.js +53 -47
- package/dist/react-native/reporter/mptReporter.js.map +1 -1
- package/dist/react-native/utils/cIInfoProvider.js +8 -9
- package/dist/react-native/utils/cIInfoProvider.js.map +1 -1
- package/dist/react-native/utils/packageManager.js +21 -27
- package/dist/react-native/utils/packageManager.js.map +1 -1
- package/dist/react-native/utils/reporterUtils.js +34 -31
- package/dist/react-native/utils/reporterUtils.js.map +1 -1
- package/dist/react-native/utils/serviceClient.js +7 -2
- package/dist/react-native/utils/serviceClient.js.map +1 -1
- package/dist/react-native/utils/utils.js +1 -1
- package/dist/react-native/utils/utils.js.map +1 -1
- package/package.json +2 -2
|
@@ -17,6 +17,14 @@ const cIInfoProvider_js_1 = require("./cIInfoProvider.js");
|
|
|
17
17
|
const cIInfoProvider_js_2 = require("./cIInfoProvider.js");
|
|
18
18
|
const utils_js_1 = require("./utils.js");
|
|
19
19
|
class ReporterUtils {
|
|
20
|
+
envVariables;
|
|
21
|
+
config;
|
|
22
|
+
totalTests;
|
|
23
|
+
failedTests;
|
|
24
|
+
skippedTests;
|
|
25
|
+
passedTests;
|
|
26
|
+
flakyTests;
|
|
27
|
+
startTime;
|
|
20
28
|
// eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters
|
|
21
29
|
constructor(envVariables, config, _) {
|
|
22
30
|
this.config = config;
|
|
@@ -65,8 +73,7 @@ class ReporterUtils {
|
|
|
65
73
|
getTestRunShardEndObject(result,
|
|
66
74
|
// eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters
|
|
67
75
|
shard, errorMessages, attachmentMetadata, workers) {
|
|
68
|
-
|
|
69
|
-
shard.shardId = (_a = this.envVariables.shardId) !== null && _a !== void 0 ? _a : "1";
|
|
76
|
+
shard.shardId = this.envVariables.shardId ?? "1";
|
|
70
77
|
shard.summary.totalTime = result.duration;
|
|
71
78
|
shard.summary.endTime = ReporterUtils.timestampToRFC3339(Date.now());
|
|
72
79
|
shard.summary.status = shard_js_1.TestRunStatus.CLIENT_COMPLETE;
|
|
@@ -77,13 +84,12 @@ class ReporterUtils {
|
|
|
77
84
|
return shard;
|
|
78
85
|
}
|
|
79
86
|
getOSName(result, data) {
|
|
80
|
-
var _a, _b;
|
|
81
87
|
try {
|
|
82
88
|
for (const attachment of result.attachments) {
|
|
83
89
|
if (attachment.name === data) {
|
|
84
|
-
const match =
|
|
90
|
+
const match = attachment?.contentType?.match(/charset=(.*)/);
|
|
85
91
|
const charset = match && match.length > 1 ? match[1] : "utf-8";
|
|
86
|
-
return
|
|
92
|
+
return attachment.body?.toString(charset || "utf-8").toUpperCase() || "";
|
|
87
93
|
}
|
|
88
94
|
}
|
|
89
95
|
}
|
|
@@ -93,7 +99,6 @@ class ReporterUtils {
|
|
|
93
99
|
return "";
|
|
94
100
|
}
|
|
95
101
|
getTestResultObject(test, result, jobName) {
|
|
96
|
-
var _a, _b, _c, _d;
|
|
97
102
|
switch (test.outcome()) {
|
|
98
103
|
case "skipped":
|
|
99
104
|
this.skippedTests++;
|
|
@@ -130,9 +135,9 @@ class ReporterUtils {
|
|
|
130
135
|
testResult.status = this.getTestStatus(test, result);
|
|
131
136
|
testResult.lineNumber = test.location.line;
|
|
132
137
|
testResult.retry = result.retry ? result.retry : 0;
|
|
133
|
-
let browserName =
|
|
138
|
+
let browserName = test.parent.project()?.use.browserName?.toLowerCase();
|
|
134
139
|
if (!browserName) {
|
|
135
|
-
browserName =
|
|
140
|
+
browserName = test.parent.project()?.use.defaultBrowserType?.toLowerCase();
|
|
136
141
|
}
|
|
137
142
|
testResult.webTestConfig = {
|
|
138
143
|
jobName: jobName,
|
|
@@ -149,7 +154,7 @@ class ReporterUtils {
|
|
|
149
154
|
attachmentsMetadata: this.getAttachmentStatus(result),
|
|
150
155
|
};
|
|
151
156
|
testResult.artifactsPath = result.attachments
|
|
152
|
-
.filter((attachment) =>
|
|
157
|
+
.filter((attachment) => attachment?.path !== null && attachment?.path !== undefined) // Filter attachments with defined and non-null path property
|
|
153
158
|
.map((attachment) => `${testResult.testExecutionId}/${ReporterUtils.getFileRelativePath(attachment.path)}`);
|
|
154
159
|
return testResult;
|
|
155
160
|
}
|
|
@@ -263,6 +268,19 @@ class ReporterUtils {
|
|
|
263
268
|
}
|
|
264
269
|
return filePath;
|
|
265
270
|
}
|
|
271
|
+
static getReporterBackOffOptions = {
|
|
272
|
+
numOfAttempts: 3,
|
|
273
|
+
jitter: "full",
|
|
274
|
+
retry: (error) => {
|
|
275
|
+
if (error.response) {
|
|
276
|
+
const status = error.response.status;
|
|
277
|
+
if (constants_js_1.Constants.NON_RETRYABLE_STATUS_CODES.includes(status)) {
|
|
278
|
+
return false;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return true;
|
|
282
|
+
},
|
|
283
|
+
};
|
|
266
284
|
// eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters
|
|
267
285
|
static isTimeGreaterThanCurrentPlus10Minutes(sasUri) {
|
|
268
286
|
try {
|
|
@@ -426,20 +444,19 @@ class ReporterUtils {
|
|
|
426
444
|
return attachmentStatus;
|
|
427
445
|
}
|
|
428
446
|
dedupeSteps(steps) {
|
|
429
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
430
447
|
const result = [];
|
|
431
448
|
let lastResult = undefined;
|
|
432
449
|
for (const step of steps) {
|
|
433
|
-
const canDedupe = !step.error && step.duration >= 0 &&
|
|
434
|
-
const lastStep = lastResult
|
|
450
|
+
const canDedupe = !step.error && step.duration >= 0 && step.location?.file && !step.steps.length;
|
|
451
|
+
const lastStep = lastResult?.step;
|
|
435
452
|
if (canDedupe &&
|
|
436
453
|
lastResult &&
|
|
437
454
|
lastStep &&
|
|
438
455
|
step.category === lastStep.category &&
|
|
439
456
|
step.title === lastStep.title &&
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
457
|
+
step.location?.file === lastStep.location?.file &&
|
|
458
|
+
step.location?.line === lastStep.location?.line &&
|
|
459
|
+
step.location?.column === lastStep.location?.column) {
|
|
443
460
|
++lastResult.count;
|
|
444
461
|
lastResult.duration += step.duration;
|
|
445
462
|
continue;
|
|
@@ -488,7 +505,7 @@ class ReporterUtils {
|
|
|
488
505
|
let depthCount = 0;
|
|
489
506
|
let suiteTitle = currentSuite.title;
|
|
490
507
|
const projectName = currentSuite.project().name;
|
|
491
|
-
while (
|
|
508
|
+
while (currentSuite?.parent && !ReporterUtils.isNullOrEmpty(currentSuite.parent.title)) {
|
|
492
509
|
if (depthCount > 10 || currentSuite.parent.title === projectName) {
|
|
493
510
|
break;
|
|
494
511
|
}
|
|
@@ -499,10 +516,9 @@ class ReporterUtils {
|
|
|
499
516
|
return suiteTitle;
|
|
500
517
|
}
|
|
501
518
|
async getRunName(ciInfo) {
|
|
502
|
-
var _a;
|
|
503
519
|
if (ciInfo.provider === cIInfoProvider_js_1.CI_PROVIDERS.GITHUB &&
|
|
504
520
|
process.env["GITHUB_EVENT_NAME"] === "pull_request") {
|
|
505
|
-
const prNumber = `${
|
|
521
|
+
const prNumber = `${process.env["GITHUB_REF_NAME"]?.split("/")[0]}`;
|
|
506
522
|
const prLink = `${process.env["GITHUB_REPOSITORY"]}/pull/${prNumber}`;
|
|
507
523
|
return `PR# ${prNumber} on Repo: ${process.env["GITHUB_REPOSITORY"]} (${prLink})`;
|
|
508
524
|
}
|
|
@@ -571,18 +587,5 @@ class ReporterUtils {
|
|
|
571
587
|
return this.config.workers;
|
|
572
588
|
}
|
|
573
589
|
}
|
|
574
|
-
ReporterUtils.getReporterBackOffOptions = {
|
|
575
|
-
numOfAttempts: 3,
|
|
576
|
-
jitter: "full",
|
|
577
|
-
retry: (error) => {
|
|
578
|
-
if (error.response) {
|
|
579
|
-
const status = error.response.status;
|
|
580
|
-
if (constants_js_1.Constants.NON_RETRYABLE_STATUS_CODES.includes(status)) {
|
|
581
|
-
return false;
|
|
582
|
-
}
|
|
583
|
-
}
|
|
584
|
-
return true;
|
|
585
|
-
},
|
|
586
|
-
};
|
|
587
590
|
exports.default = ReporterUtils;
|
|
588
591
|
//# sourceMappingURL=reporterUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporterUtils.js","sourceRoot":"","sources":["../../../src/utils/reporterUtils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n FullResult,\n Location,\n TestCase,\n TestResult,\n TestStep,\n FullConfig,\n Suite,\n} from \"@playwright/test/reporter\";\nimport { exec } from \"node:child_process\";\nimport { reporterLogger } from \"../common/logger.js\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport type { IBackOffOptions } from \"../common/types.js\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { Constants } from \"../common/constants.js\";\nimport type { EnvironmentVariables } from \"../common/environmentVariables.js\";\nimport type { DedupedStep, RawTestStep } from \"../common/types.js\";\nimport { TokenType } from \"../model/mptTokenDetails.js\";\nimport type { UploadMetadata } from \"../model/shard.js\";\nimport { Shard, TestRunStatus } from \"../model/shard.js\";\nimport type { RawTestResult } from \"../model/testResult.js\";\nimport { TestResult as MPTTestResult } from \"../model/testResult.js\";\nimport type { TestRunConfig } from \"../model/testRun.js\";\nimport { TestRun } from \"../model/testRun.js\";\nimport type { CIInfo } from \"./cIInfoProvider.js\";\nimport { CI_PROVIDERS } from \"./cIInfoProvider.js\";\nimport { CIInfoProvider } from \"./cIInfoProvider.js\";\nimport type { StorageUri } from \"../model/storageUri.js\";\nimport { getPackageVersion } from \"./utils.js\";\nclass ReporterUtils {\n private envVariables: EnvironmentVariables;\n\n private config: FullConfig;\n totalTests: number;\n failedTests: number;\n skippedTests: number;\n passedTests: number;\n flakyTests: number;\n startTime: number;\n\n // eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters\n constructor(envVariables: EnvironmentVariables, config: FullConfig, _: Suite) {\n this.config = config;\n this.envVariables = envVariables;\n this.startTime = Date.now();\n\n this.totalTests = 0;\n this.failedTests = 0;\n this.skippedTests = 0;\n this.passedTests = 0;\n this.flakyTests = 0;\n }\n\n public async getTestRunObject(ciInfo: CIInfo): Promise<TestRun> {\n const testRun = new TestRun();\n const runName = this.envVariables.runName || (await this.getRunName(ciInfo));\n testRun.testRunId = this.envVariables.runId;\n testRun.displayName = ReporterUtils.isNullOrEmpty(runName) ? this.envVariables.runId : runName;\n testRun.creatorName = this.envVariables.userName;\n testRun.creatorId = this.envVariables.userId!;\n testRun.startTime = ReporterUtils.timestampToRFC3339(this.startTime);\n testRun.ciConfig = {\n ciProviderName: ciInfo.provider!,\n branch: ciInfo.branch!,\n author: ciInfo.author!,\n commitId: ciInfo.commitId!,\n revisionUrl: ciInfo.revisionUrl!,\n };\n testRun.testRunConfig = this.getTestRunConfig();\n testRun.cloudReportingEnabled = \"true\";\n return testRun;\n }\n\n public getTestRunShardStartObject(): Shard {\n const shard = new Shard();\n if (this.config.shard !== null && this.config.shard !== undefined) {\n this.envVariables.shardId = this.config.shard.current.toString();\n } else {\n this.envVariables.shardId = \"1\";\n }\n shard.shardId = this.envVariables.shardId;\n shard.summary = {\n startTime: ReporterUtils.timestampToRFC3339(this.startTime),\n };\n shard.uploadCompleted = false;\n return shard;\n }\n\n public getTestRunShardEndObject(\n result: FullResult,\n // eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters\n shard: Shard,\n errorMessages: string[],\n attachmentMetadata: UploadMetadata,\n workers: number,\n ): Shard {\n shard.shardId = this.envVariables.shardId ?? \"1\";\n shard.summary.totalTime = result.duration;\n shard.summary.endTime = ReporterUtils.timestampToRFC3339(Date.now());\n shard.summary.status = TestRunStatus.CLIENT_COMPLETE;\n shard.summary.errorMessages = errorMessages;\n shard.summary.uploadMetadata = attachmentMetadata;\n shard.uploadCompleted = true;\n shard.workers = workers;\n return shard;\n }\n\n public getOSName(result: TestResult, data: string): string {\n try {\n for (const attachment of result.attachments) {\n if (attachment.name === data) {\n const match = attachment?.contentType?.match(/charset=(.*)/);\n const charset = match && match.length > 1 ? match[1] : \"utf-8\";\n return attachment.body?.toString((charset as any) || \"utf-8\").toUpperCase() || \"\";\n }\n }\n } catch (error) {\n reporterLogger.error(`Error in fetching OS - ${error}`);\n }\n return \"\";\n }\n\n public getTestResultObject(test: TestCase, result: TestResult, jobName: string): MPTTestResult {\n switch (test.outcome()) {\n case \"skipped\":\n this.skippedTests++;\n this.totalTests++;\n break;\n case \"expected\":\n this.passedTests++;\n this.totalTests++;\n break;\n case \"unexpected\":\n if (result.retry === test.retries) {\n this.failedTests++;\n this.totalTests++;\n }\n break;\n case \"flaky\":\n this.totalTests++;\n this.flakyTests++;\n break;\n default:\n break;\n }\n\n const testResult = new MPTTestResult();\n testResult.runId = this.envVariables.runId;\n testResult.shardId = this.envVariables.runId + \"_\" + this.envVariables.shardId;\n testResult.accountId = this.envVariables.accountId!;\n testResult.suiteId = ReporterUtils.calculateSha1(`${test.parent.title}-${test.location.file}`);\n testResult.testId = testResult.suiteId.concat(`-${ReporterUtils.calculateSha1(test.title)}`);\n testResult.testCombinationId = test.id;\n testResult.testExecutionId = randomUUID();\n testResult.testTitle = test.title;\n testResult.suiteTitle = this.extractRootParentTitle(test.parent)!;\n testResult.fileName = test.location.file;\n testResult.status = this.getTestStatus(test, result);\n testResult.lineNumber = test.location.line;\n testResult.retry = result.retry ? result.retry : 0;\n let browserName = test.parent.project()?.use.browserName?.toLowerCase();\n if (!browserName) {\n browserName = test.parent.project()?.use.defaultBrowserType?.toLowerCase();\n }\n testResult.webTestConfig = {\n jobName: jobName,\n projectName: test.parent.project()!.name,\n browserType: browserName ? browserName.toUpperCase() : \"\",\n os: this.getOSName(result, Constants.OS),\n };\n testResult.annotations = this.extractTestAnnotations(test.annotations);\n testResult.tags = this.extractTestTags(test);\n testResult.resultsSummary = {\n status: result.status.toUpperCase(),\n duration: result.duration,\n startTime: result.startTime.toISOString().replace(/\\.\\d+Z$/, \"Z\"),\n attachmentsMetadata: this.getAttachmentStatus(result),\n };\n testResult.artifactsPath = result.attachments\n .filter((attachment) => attachment?.path !== null && attachment?.path !== undefined) // Filter attachments with defined and non-null path property\n .map(\n (attachment) =>\n `${testResult.testExecutionId}/${ReporterUtils.getFileRelativePath(attachment.path!)}`,\n );\n return testResult;\n }\n\n public generateMarkdownSummary(testRunUrl: string): void {\n try {\n if (CIInfoProvider.getCIProvider() === CI_PROVIDERS.GITHUB) {\n const markdownContent = `\n#### Microsoft Playwright Testing run summary\n\n#### Results:\n \n **Passed:** ${this.passedTests}\n \n **Failed:** ${this.failedTests}\n \n **Flaky:** ${this.flakyTests}\n \n **Skipped:** ${this.skippedTests}\n \n#### For more details, visit the [service dashboard](${testRunUrl}).\n `;\n fs.writeFileSync(process.env[\"GITHUB_STEP_SUMMARY\"]!, markdownContent);\n }\n } catch (err) {\n reporterLogger.error(`\\nCould not generate markdown summary - ${err}`);\n }\n }\n\n public getRawTestResultObject(result: TestResult): RawTestResult {\n const rawTestResult: RawTestResult = {\n steps: this.dedupeSteps(result.steps).map((step) => this.serializeTestStep(step)),\n errors: this.getTestError(result),\n stdErr: result.stderr ? JSON.stringify(result.stderr, null, 2) : \"\",\n stdOut: result.stdout ? JSON.stringify(result.stdout, null, 2) : \"\",\n };\n return rawTestResult;\n }\n\n public static getRunId(cIInfo: CIInfo): string {\n if (cIInfo === null || cIInfo.provider === CI_PROVIDERS.DEFAULT) {\n return randomUUID();\n }\n\n const concatString = `${cIInfo.provider}-${cIInfo.repo}-${cIInfo.runId}-${cIInfo.runAttempt}`;\n const runId = ReporterUtils.calculateSha1(concatString);\n return runId;\n }\n\n public static calculateSha1(buffer: Buffer | string): string {\n const hash = createHash(\"sha256\");\n hash.update(buffer);\n return hash.digest(\"hex\");\n }\n\n /*\n public static getTokenDetails(accessToken: string) {\n let tokenDetails = new MPTTokenDetails();\n try {\n const token = accessToken.split('.')[1];\n const _token = Buffer.from(token, 'base64');\n tokenDetails = JSON.parse(_token.toString());\n } catch (err) {\n throw err;\n }\n return tokenDetails;\n }\n */\n\n public static getTokenDetails<T>(accessToken: string, tokenType: TokenType): T {\n const token = accessToken.split(\".\")[1]!;\n const _token = Buffer.from(token, \"base64\");\n const tokenDetails = JSON.parse(_token.toString());\n\n switch (tokenType) {\n case TokenType.MPT:\n return tokenDetails as T;\n case TokenType.ENTRA:\n return tokenDetails as T;\n default:\n throw new Error(\"Unsupported token type\");\n }\n }\n\n public static hasAudienceClaim(token: string): boolean {\n try {\n // Split the token into its three parts\n const parts = token.split(\".\");\n if (parts.length !== 3) {\n throw new Error(\"Invalid token format\");\n }\n\n // Base64 decode the payload\n const payload = parts[1]!;\n const decodedPayload = Buffer.from(payload, \"base64\");\n\n // Parse the decoded payload as JSON\n const payloadObject = JSON.parse(decodedPayload.toString());\n\n // Check if the payload has an 'aud' claim\n return \"aud\" in payloadObject;\n } catch (error) {\n return false;\n }\n }\n\n public static timestampToRFC3339(timestamp: number): string {\n const date = new Date(timestamp);\n const dateString = date.toISOString().replace(/\\.\\d+Z$/, \"Z\");\n return dateString;\n }\n\n public static getFileRelativePath(filePath: string): string {\n if (filePath) {\n let parts = filePath.split(\"/\");\n\n if (parts.length > 1) {\n return parts[parts.length - 1]!;\n }\n\n parts = filePath.split(\"\\\\\");\n\n if (parts.length > 1) {\n return parts[parts.length - 1]!;\n }\n }\n\n return filePath;\n }\n\n public static getReporterBackOffOptions: Partial<IBackOffOptions> = {\n numOfAttempts: 3,\n jitter: \"full\",\n retry: (error) => {\n if (error.response) {\n const status = error.response.status;\n if (Constants.NON_RETRYABLE_STATUS_CODES.includes(status)) {\n return false;\n }\n }\n return true;\n },\n };\n\n // eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters\n public static isTimeGreaterThanCurrentPlus10Minutes(sasUri: StorageUri): boolean {\n try {\n const url = new URL(sasUri.uri);\n const params = new URLSearchParams(url.search);\n const expiryTime = params.get(\"se\"); // 'se' is the query parameter for the expiry time\n if (expiryTime) {\n const timestampFromIsoString = new Date(expiryTime).getTime();\n const currentTimestampPlus10Minutes = Date.now() + 10 * 60 * 1000;\n const isSasValidityGreaterThanCurrentTimePlus10Minutes =\n timestampFromIsoString > currentTimestampPlus10Minutes;\n if (!isSasValidityGreaterThanCurrentTimePlus10Minutes) {\n reporterLogger.info(\n `Sas rotation required because close to expiry, SasUriValidTillTime: ${timestampFromIsoString}, CurrentTime: ${currentTimestampPlus10Minutes}`,\n );\n }\n return isSasValidityGreaterThanCurrentTimePlus10Minutes;\n }\n reporterLogger.error(`Sas rotation required because expiry param not found.`);\n return false;\n } catch (error) {\n reporterLogger.error(`Sas rotation required because of ${error}.`);\n return false;\n }\n }\n\n public static getFileSize(attachmentPath: string): number {\n try {\n const stats = fs.statSync(attachmentPath);\n return stats.size;\n } catch (error) {\n return 0;\n }\n }\n\n public static getBufferSize(attachmentBody: Buffer): number {\n try {\n const fileSizeInBytes = attachmentBody.length;\n return fileSizeInBytes;\n } catch (error) {\n return 0;\n }\n }\n\n public redactAccessToken(info: string | undefined): string {\n if (!info || ReporterUtils.isNullOrEmpty(this.envVariables.accessToken)) {\n return \"\";\n }\n const accessTokenRegex = new RegExp(this.envVariables.accessToken, \"g\");\n return info.replace(accessTokenRegex, Constants.DEFAULT_REDACTED_MESSAGE);\n }\n public static getRegionFromAccountID(accountId: string): string | undefined {\n if (accountId.includes(\"_\")) {\n return accountId.split(\"_\")[0]!;\n } else {\n return;\n } // Handling for older workspaces without region in id\n }\n\n public progressBar(current: number, total: number): void {\n const width = 40;\n const percent = current / total;\n const completed = Math.round(width * percent);\n const remaining = width - completed;\n\n if (current % Math.round(total / 5) === 0 || current === total) {\n process.stdout.write(\"\\r\");\n process.stdout.write(\n `[${\"=\".repeat(completed)}${\" \".repeat(remaining)}] ${Math.round(percent * 100)}%`,\n );\n }\n }\n\n private getTestRunConfig(): TestRunConfig {\n const testRunConfig: TestRunConfig = {\n workers: this.getWorkers(),\n pwVersion: this.config.version,\n timeout: this.config.globalTimeout,\n repeatEach: this.config.projects[0].repeatEach,\n retries: this.config.projects[0].retries,\n shards: this.config.shard ? this.config.shard : { total: 1 },\n testFramework: {\n name: Constants.TEST_FRAMEWORK_NAME,\n version: this.config.version,\n runnerName: Constants.TEST_FRAMEWORK_RUNNERNAME,\n },\n testType: Constants.TEST_TYPE,\n testSdkLanguage: Constants.TEST_SDK_LANGUAGE,\n reporterPackageVersion: getPackageVersion(),\n };\n return testRunConfig;\n }\n\n private relativeLocation(location: Location | undefined): Location | undefined {\n if (!location) {\n return undefined;\n }\n const file = this.toPosixPath(path.relative(this.config.rootDir, location.file));\n return {\n file,\n line: location.line,\n column: location.column,\n };\n }\n\n private extractTestTags(input: TestCase): string[] {\n let tags: string[] = [];\n if (\"tags\" in input && Array.isArray(input.tags) && input.tags.length > 0) {\n tags = input.tags.map((tag) => tag.slice(1));\n return tags;\n }\n\n // Check if the input string contains tags directly\n const regex = /@(\\w+)/g;\n const matches = input.title.match(regex);\n if (matches) {\n tags = tags.concat(matches.map((match) => match.slice(1)));\n }\n\n // Try parsing the input string as a JavaScript object\n try {\n const obj = JSON.parse(`{${input}}`);\n if (obj.tag && Array.isArray(obj.tag)) {\n tags = tags.concat(obj.tag);\n }\n } catch (error) {\n // Ignore parsing errors\n }\n return tags;\n }\n\n private extractTestAnnotations(annotations: TestCase[\"annotations\"]): string[] {\n const result = annotations.map((annotation) => {\n if (annotation.type && annotation.description) {\n return `${annotation.type}: ${annotation.description}`;\n }\n return annotation.type;\n });\n return result;\n }\n\n private toPosixPath(aPath: string): string {\n return aPath.split(path.sep).join(path.posix.sep);\n }\n\n private getAttachmentStatus(testResult: TestResult): string {\n let attachmentStatus: string = \"\";\n for (const attachment of testResult.attachments) {\n if (attachment.contentType.includes(\"image\")) {\n if (attachmentStatus !== \"\") {\n attachmentStatus += \",\";\n }\n attachmentStatus += \"image\";\n } else if (attachment.contentType.includes(\"video\")) {\n if (attachmentStatus !== \"\") {\n attachmentStatus += \",\";\n }\n attachmentStatus += \"video\";\n } else if (attachment.contentType === \"application/zip\") {\n if (attachmentStatus !== \"\") {\n attachmentStatus += \",\";\n }\n attachmentStatus += \"trace\";\n } else if (attachment.contentType === \"text/plain\") {\n if (attachmentStatus !== \"\") {\n attachmentStatus += \",\";\n }\n attachmentStatus += \"txt\";\n }\n }\n return attachmentStatus;\n }\n\n private dedupeSteps(steps: TestStep[]): DedupedStep[] {\n const result: DedupedStep[] = [];\n let lastResult = undefined;\n for (const step of steps) {\n const canDedupe =\n !step.error && step.duration >= 0 && step.location?.file && !step.steps.length;\n const lastStep = lastResult?.step;\n if (\n canDedupe &&\n lastResult &&\n lastStep &&\n step.category === lastStep.category &&\n step.title === lastStep.title &&\n step.location?.file === lastStep.location?.file &&\n step.location?.line === lastStep.location?.line &&\n step.location?.column === lastStep.location?.column\n ) {\n ++lastResult.count;\n lastResult.duration += step.duration;\n continue;\n }\n lastResult = { step, count: 1, duration: step.duration };\n result.push(lastResult);\n if (!canDedupe) {\n lastResult = undefined;\n }\n }\n return result;\n }\n\n private serializeTestStep(dedupedStep: DedupedStep): RawTestStep {\n const { step, duration, count } = dedupedStep;\n const result: RawTestStep = {\n title: step.title,\n category: step.category,\n startTime: step.startTime.toISOString(),\n duration,\n error: step.error ? step.error.message : undefined,\n location: this.relativeLocation(step.location),\n steps: this.dedupeSteps(step.steps).map((subStep) => this.serializeTestStep(subStep)),\n count: count,\n };\n return result;\n }\n\n private getTestStatus(test: TestCase, result: TestResult): string {\n if (test.expectedStatus === result.status) {\n if (result.status === \"skipped\") {\n return \"SKIPPED\";\n } else {\n return \"PASSED\";\n }\n } else if (result.status === \"interrupted\") {\n return \"SKIPPED\";\n } else {\n return \"FAILED\";\n }\n }\n\n private extractRootParentTitle(suite: Suite): string | undefined {\n // Traverse through the parent properties until reaching the root parent\n let currentSuite: Suite | undefined = suite;\n let depthCount: number = 0;\n let suiteTitle: string = currentSuite.title;\n const projectName = currentSuite.project()!.name;\n while (currentSuite?.parent && !ReporterUtils.isNullOrEmpty(currentSuite.parent.title)) {\n if (depthCount > 10 || currentSuite.parent.title === projectName) {\n break;\n }\n suiteTitle = suiteTitle + \" > \" + currentSuite.parent.title;\n currentSuite = currentSuite.parent;\n depthCount++;\n }\n return suiteTitle;\n }\n\n private async getRunName(ciInfo: CIInfo): Promise<string> {\n if (\n ciInfo.provider === CI_PROVIDERS.GITHUB &&\n process.env[\"GITHUB_EVENT_NAME\"] === \"pull_request\"\n ) {\n const prNumber: string = `${process.env[\"GITHUB_REF_NAME\"]?.split(\"/\")[0]}`;\n const prLink: string = `${process.env[\"GITHUB_REPOSITORY\"]}/pull/${prNumber}`;\n return `PR# ${prNumber} on Repo: ${process.env[\"GITHUB_REPOSITORY\"]} (${prLink})`;\n }\n\n let gitCommitMessage: string | null = null;\n try {\n const gitVersion = await this.runCommand(Constants.GIT_VERSION_COMMAND);\n if (ReporterUtils.isNullOrEmpty(gitVersion)) {\n throw new Error(\"Git is not installed on the machine\");\n }\n const isInsideWorkTree = await this.runCommand(Constants.GIT_REV_PARSE);\n if (isInsideWorkTree !== \"true\") {\n throw new Error(\"Not inside a git repository\");\n }\n gitCommitMessage = await this.runCommand(Constants.GIT_COMMIT_MESSAGE_COMMAND);\n return gitCommitMessage;\n } catch (err) {\n reporterLogger.error(`\\nError in getting git commit message: ${err}.`);\n return \"\";\n }\n }\n\n private async runCommand(command: string): Promise<string> {\n return new Promise((resolve, reject) => {\n exec(command, (error, stdout, stderr) => {\n if (error) {\n reject(error);\n return;\n }\n if (stderr) {\n reject(new Error(stderr));\n return;\n }\n resolve(stdout.trim());\n });\n });\n }\n\n public static isNullOrEmpty(str: string | null | undefined): boolean {\n return !str || str.trim() === \"\";\n }\n\n private getTestError(result: TestResult): string {\n if (!result.errors || result.errors.length === 0) return \"\";\n const errorMessages: { message: string }[] = [];\n result.errors.forEach((error) => {\n if (error.message) errorMessages.push({ message: error.message });\n if (error.snippet && error.location) {\n errorMessages.push({\n message: error.snippet + \"\\n\\n\" + this.getReadableLineLocation(error.location),\n });\n } else if (error.snippet) errorMessages.push({ message: error.snippet });\n });\n return JSON.stringify(errorMessages, null, 2);\n }\n\n private getReadableLineLocation(location: Location): string {\n return `at ${location.file}:${location.line}:${location.column}`;\n }\n\n private getWorkers(): number {\n if (\n this.config.metadata &&\n \"actualWorkers\" in this.config.metadata &&\n typeof this.config.metadata.actualWorkers === \"number\"\n ) {\n return this.config.metadata.actualWorkers;\n }\n return this.config.workers;\n }\n}\n\nexport default ReporterUtils;\n"]}
|
|
1
|
+
{"version":3,"file":"reporterUtils.js","sourceRoot":"","sources":["../../../src/utils/reporterUtils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n FullResult,\n Location,\n TestCase,\n TestResult,\n TestStep,\n FullConfig,\n Suite,\n} from \"@playwright/test/reporter\";\nimport { exec } from \"node:child_process\";\nimport { reporterLogger } from \"../common/logger.js\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport type { IBackOffOptions } from \"../common/types.js\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { Constants } from \"../common/constants.js\";\nimport type { EnvironmentVariables } from \"../common/environmentVariables.js\";\nimport type { DedupedStep, RawTestStep } from \"../common/types.js\";\nimport { TokenType } from \"../model/mptTokenDetails.js\";\nimport type { UploadMetadata } from \"../model/shard.js\";\nimport { Shard, TestRunStatus } from \"../model/shard.js\";\nimport type { RawTestResult } from \"../model/testResult.js\";\nimport { TestResult as MPTTestResult } from \"../model/testResult.js\";\nimport type { TestRunConfig } from \"../model/testRun.js\";\nimport { TestRun } from \"../model/testRun.js\";\nimport type { CIInfo } from \"./cIInfoProvider.js\";\nimport { CI_PROVIDERS } from \"./cIInfoProvider.js\";\nimport { CIInfoProvider } from \"./cIInfoProvider.js\";\nimport type { StorageUri } from \"../model/storageUri.js\";\nimport { getPackageVersion } from \"./utils.js\";\nclass ReporterUtils {\n private envVariables: EnvironmentVariables;\n\n private config: FullConfig;\n totalTests: number;\n failedTests: number;\n skippedTests: number;\n passedTests: number;\n flakyTests: number;\n startTime: number;\n\n // eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters\n constructor(envVariables: EnvironmentVariables, config: FullConfig, _: Suite) {\n this.config = config;\n this.envVariables = envVariables;\n this.startTime = Date.now();\n\n this.totalTests = 0;\n this.failedTests = 0;\n this.skippedTests = 0;\n this.passedTests = 0;\n this.flakyTests = 0;\n }\n\n public async getTestRunObject(ciInfo: CIInfo): Promise<TestRun> {\n const testRun = new TestRun();\n const runName = this.envVariables.runName || (await this.getRunName(ciInfo));\n testRun.testRunId = this.envVariables.runId;\n testRun.displayName = ReporterUtils.isNullOrEmpty(runName) ? this.envVariables.runId : runName;\n testRun.creatorName = this.envVariables.userName;\n testRun.creatorId = this.envVariables.userId!;\n testRun.startTime = ReporterUtils.timestampToRFC3339(this.startTime);\n testRun.ciConfig = {\n ciProviderName: ciInfo.provider!,\n branch: ciInfo.branch!,\n author: ciInfo.author!,\n commitId: ciInfo.commitId!,\n revisionUrl: ciInfo.revisionUrl!,\n };\n testRun.testRunConfig = this.getTestRunConfig();\n testRun.cloudReportingEnabled = \"true\";\n return testRun;\n }\n\n public getTestRunShardStartObject(): Shard {\n const shard = new Shard();\n if (this.config.shard !== null && this.config.shard !== undefined) {\n this.envVariables.shardId = this.config.shard.current.toString();\n } else {\n this.envVariables.shardId = \"1\";\n }\n shard.shardId = this.envVariables.shardId;\n shard.summary = {\n startTime: ReporterUtils.timestampToRFC3339(this.startTime),\n };\n shard.uploadCompleted = false;\n return shard;\n }\n\n public getTestRunShardEndObject(\n result: FullResult,\n // eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters\n shard: Shard,\n errorMessages: string[],\n attachmentMetadata: UploadMetadata,\n workers: number,\n ): Shard {\n shard.shardId = this.envVariables.shardId ?? \"1\";\n shard.summary.totalTime = result.duration;\n shard.summary.endTime = ReporterUtils.timestampToRFC3339(Date.now());\n shard.summary.status = TestRunStatus.CLIENT_COMPLETE;\n shard.summary.errorMessages = errorMessages;\n shard.summary.uploadMetadata = attachmentMetadata;\n shard.uploadCompleted = true;\n shard.workers = workers;\n return shard;\n }\n\n public getOSName(result: TestResult, data: string): string {\n try {\n for (const attachment of result.attachments) {\n if (attachment.name === data) {\n const match = attachment?.contentType?.match(/charset=(.*)/);\n const charset = match && match.length > 1 ? match[1] : \"utf-8\";\n return attachment.body?.toString((charset as any) || \"utf-8\").toUpperCase() || \"\";\n }\n }\n } catch (error) {\n reporterLogger.error(`Error in fetching OS - ${error}`);\n }\n return \"\";\n }\n\n public getTestResultObject(test: TestCase, result: TestResult, jobName: string): MPTTestResult {\n switch (test.outcome()) {\n case \"skipped\":\n this.skippedTests++;\n this.totalTests++;\n break;\n case \"expected\":\n this.passedTests++;\n this.totalTests++;\n break;\n case \"unexpected\":\n if (result.retry === test.retries) {\n this.failedTests++;\n this.totalTests++;\n }\n break;\n case \"flaky\":\n this.totalTests++;\n this.flakyTests++;\n break;\n default:\n break;\n }\n\n const testResult = new MPTTestResult();\n testResult.runId = this.envVariables.runId;\n testResult.shardId = this.envVariables.runId + \"_\" + this.envVariables.shardId;\n testResult.accountId = this.envVariables.accountId!;\n testResult.suiteId = ReporterUtils.calculateSha1(`${test.parent.title}-${test.location.file}`);\n testResult.testId = testResult.suiteId.concat(`-${ReporterUtils.calculateSha1(test.title)}`);\n testResult.testCombinationId = test.id;\n testResult.testExecutionId = randomUUID();\n testResult.testTitle = test.title;\n testResult.suiteTitle = this.extractRootParentTitle(test.parent)!;\n testResult.fileName = test.location.file;\n testResult.status = this.getTestStatus(test, result);\n testResult.lineNumber = test.location.line;\n testResult.retry = result.retry ? result.retry : 0;\n let browserName = test.parent.project()?.use.browserName?.toLowerCase();\n if (!browserName) {\n browserName = test.parent.project()?.use.defaultBrowserType?.toLowerCase();\n }\n testResult.webTestConfig = {\n jobName: jobName,\n projectName: test.parent.project()!.name,\n browserType: browserName ? browserName.toUpperCase() : \"\",\n os: this.getOSName(result, Constants.OS),\n };\n testResult.annotations = this.extractTestAnnotations(test.annotations);\n testResult.tags = this.extractTestTags(test);\n testResult.resultsSummary = {\n status: result.status.toUpperCase(),\n duration: result.duration,\n startTime: result.startTime.toISOString().replace(/\\.\\d+Z$/, \"Z\"),\n attachmentsMetadata: this.getAttachmentStatus(result),\n };\n testResult.artifactsPath = result.attachments\n .filter((attachment) => attachment?.path !== null && attachment?.path !== undefined) // Filter attachments with defined and non-null path property\n .map(\n (attachment) =>\n `${testResult.testExecutionId}/${ReporterUtils.getFileRelativePath(attachment.path!)}`,\n );\n return testResult;\n }\n\n public generateMarkdownSummary(testRunUrl: string): void {\n try {\n if (CIInfoProvider.getCIProvider() === CI_PROVIDERS.GITHUB) {\n const markdownContent = `\n#### Microsoft Playwright Testing run summary\n\n#### Results:\n \n **Passed:** ${this.passedTests}\n \n **Failed:** ${this.failedTests}\n \n **Flaky:** ${this.flakyTests}\n \n **Skipped:** ${this.skippedTests}\n \n#### For more details, visit the [service dashboard](${testRunUrl}).\n `;\n fs.writeFileSync(process.env[\"GITHUB_STEP_SUMMARY\"]!, markdownContent);\n }\n } catch (err) {\n reporterLogger.error(`\\nCould not generate markdown summary - ${err}`);\n }\n }\n\n public getRawTestResultObject(result: TestResult): RawTestResult {\n const rawTestResult: RawTestResult = {\n steps: this.dedupeSteps(result.steps).map((step) => this.serializeTestStep(step)),\n errors: this.getTestError(result),\n stdErr: result.stderr ? JSON.stringify(result.stderr, null, 2) : \"\",\n stdOut: result.stdout ? JSON.stringify(result.stdout, null, 2) : \"\",\n };\n return rawTestResult;\n }\n\n public static getRunId(cIInfo: CIInfo): string {\n if (cIInfo === null || cIInfo.provider === CI_PROVIDERS.DEFAULT) {\n return randomUUID();\n }\n\n const concatString = `${cIInfo.provider}-${cIInfo.repo}-${cIInfo.runId}-${cIInfo.runAttempt}`;\n const runId = ReporterUtils.calculateSha1(concatString);\n return runId;\n }\n\n public static calculateSha1(buffer: Buffer | string): string {\n const hash = createHash(\"sha256\");\n hash.update(buffer);\n return hash.digest(\"hex\");\n }\n\n /*\n public static getTokenDetails(accessToken: string) {\n let tokenDetails = new MPTTokenDetails();\n try {\n const token = accessToken.split('.')[1];\n const _token = Buffer.from(token, 'base64');\n tokenDetails = JSON.parse(_token.toString());\n } catch (err) {\n throw err;\n }\n return tokenDetails;\n }\n */\n\n public static getTokenDetails<T>(accessToken: string, tokenType: TokenType): T {\n const token = accessToken.split(\".\")[1]!;\n const _token = Buffer.from(token, \"base64\");\n const tokenDetails = JSON.parse(_token.toString());\n\n switch (tokenType) {\n case TokenType.MPT:\n return tokenDetails as T;\n case TokenType.ENTRA:\n return tokenDetails as T;\n default:\n throw new Error(\"Unsupported token type\");\n }\n }\n\n public static hasAudienceClaim(token: string): boolean {\n try {\n // Split the token into its three parts\n const parts = token.split(\".\");\n if (parts.length !== 3) {\n throw new Error(\"Invalid token format\");\n }\n\n // Base64 decode the payload\n const payload = parts[1]!;\n const decodedPayload = Buffer.from(payload, \"base64\");\n\n // Parse the decoded payload as JSON\n const payloadObject = JSON.parse(decodedPayload.toString());\n\n // Check if the payload has an 'aud' claim\n return \"aud\" in payloadObject;\n } catch (error) {\n return false;\n }\n }\n\n public static timestampToRFC3339(timestamp: number): string {\n const date = new Date(timestamp);\n const dateString = date.toISOString().replace(/\\.\\d+Z$/, \"Z\");\n return dateString;\n }\n\n public static getFileRelativePath(filePath: string): string {\n if (filePath) {\n let parts = filePath.split(\"/\");\n\n if (parts.length > 1) {\n return parts[parts.length - 1]!;\n }\n\n parts = filePath.split(\"\\\\\");\n\n if (parts.length > 1) {\n return parts[parts.length - 1]!;\n }\n }\n\n return filePath;\n }\n\n public static getReporterBackOffOptions: Partial<IBackOffOptions> = {\n numOfAttempts: 3,\n jitter: \"full\",\n retry: (error) => {\n if (error.response) {\n const status = error.response.status;\n if (Constants.NON_RETRYABLE_STATUS_CODES.includes(status)) {\n return false;\n }\n }\n return true;\n },\n };\n\n // eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters\n public static isTimeGreaterThanCurrentPlus10Minutes(sasUri: StorageUri): boolean {\n try {\n const url = new URL(sasUri.uri);\n const params = new URLSearchParams(url.search);\n const expiryTime = params.get(\"se\"); // 'se' is the query parameter for the expiry time\n if (expiryTime) {\n const timestampFromIsoString = new Date(expiryTime).getTime();\n const currentTimestampPlus10Minutes = Date.now() + 10 * 60 * 1000;\n const isSasValidityGreaterThanCurrentTimePlus10Minutes =\n timestampFromIsoString > currentTimestampPlus10Minutes;\n if (!isSasValidityGreaterThanCurrentTimePlus10Minutes) {\n reporterLogger.info(\n `Sas rotation required because close to expiry, SasUriValidTillTime: ${timestampFromIsoString}, CurrentTime: ${currentTimestampPlus10Minutes}`,\n );\n }\n return isSasValidityGreaterThanCurrentTimePlus10Minutes;\n }\n reporterLogger.error(`Sas rotation required because expiry param not found.`);\n return false;\n } catch (error) {\n reporterLogger.error(`Sas rotation required because of ${error}.`);\n return false;\n }\n }\n\n public static getFileSize(attachmentPath: string): number {\n try {\n const stats = fs.statSync(attachmentPath);\n return stats.size;\n } catch (error) {\n return 0;\n }\n }\n\n public static getBufferSize(attachmentBody: Buffer): number {\n try {\n const fileSizeInBytes = attachmentBody.length;\n return fileSizeInBytes;\n } catch (error) {\n return 0;\n }\n }\n\n public redactAccessToken(info: string | undefined): string {\n if (!info || ReporterUtils.isNullOrEmpty(this.envVariables.accessToken)) {\n return \"\";\n }\n const accessTokenRegex = new RegExp(this.envVariables.accessToken, \"g\");\n return info.replace(accessTokenRegex, Constants.DEFAULT_REDACTED_MESSAGE);\n }\n public static getRegionFromAccountID(accountId: string): string | undefined {\n if (accountId.includes(\"_\")) {\n return accountId.split(\"_\")[0]!;\n } else {\n return;\n } // Handling for older workspaces without region in id\n }\n\n public progressBar(current: number, total: number): void {\n const width = 40;\n const percent = current / total;\n const completed = Math.round(width * percent);\n const remaining = width - completed;\n\n if (current % Math.round(total / 5) === 0 || current === total) {\n process.stdout.write(\"\\r\");\n process.stdout.write(\n `[${\"=\".repeat(completed)}${\" \".repeat(remaining)}] ${Math.round(percent * 100)}%`,\n );\n }\n }\n\n private getTestRunConfig(): TestRunConfig {\n const testRunConfig: TestRunConfig = {\n workers: this.getWorkers(),\n pwVersion: this.config.version,\n timeout: this.config.globalTimeout,\n repeatEach: this.config.projects[0].repeatEach,\n retries: this.config.projects[0].retries,\n shards: this.config.shard ? this.config.shard : { total: 1 },\n testFramework: {\n name: Constants.TEST_FRAMEWORK_NAME,\n version: this.config.version,\n runnerName: Constants.TEST_FRAMEWORK_RUNNERNAME,\n },\n testType: Constants.TEST_TYPE,\n testSdkLanguage: Constants.TEST_SDK_LANGUAGE,\n reporterPackageVersion: getPackageVersion(),\n };\n return testRunConfig;\n }\n\n private relativeLocation(location: Location | undefined): Location | undefined {\n if (!location) {\n return undefined;\n }\n const file = this.toPosixPath(path.relative(this.config.rootDir, location.file));\n return {\n file,\n line: location.line,\n column: location.column,\n };\n }\n\n private extractTestTags(input: TestCase): string[] {\n let tags: string[] = [];\n if (\"tags\" in input && Array.isArray(input.tags) && input.tags.length > 0) {\n tags = input.tags.map((tag) => tag.slice(1));\n return tags;\n }\n\n // Check if the input string contains tags directly\n const regex = /@(\\w+)/g;\n const matches = input.title.match(regex);\n if (matches) {\n tags = tags.concat(matches.map((match) => match.slice(1)));\n }\n\n // Try parsing the input string as a JavaScript object\n try {\n const obj = JSON.parse(`{${input}}`);\n if (obj.tag && Array.isArray(obj.tag)) {\n tags = tags.concat(obj.tag);\n }\n } catch (error) {\n // Ignore parsing errors\n }\n return tags;\n }\n\n private extractTestAnnotations(annotations: TestCase[\"annotations\"]): string[] {\n const result = annotations.map((annotation) => {\n if (annotation.type && annotation.description) {\n return `${annotation.type}: ${annotation.description}`;\n }\n return annotation.type;\n });\n return result;\n }\n\n private toPosixPath(aPath: string): string {\n return aPath.split(path.sep).join(path.posix.sep);\n }\n\n private getAttachmentStatus(testResult: TestResult): string {\n let attachmentStatus: string = \"\";\n for (const attachment of testResult.attachments) {\n if (attachment.contentType.includes(\"image\")) {\n if (attachmentStatus !== \"\") {\n attachmentStatus += \",\";\n }\n attachmentStatus += \"image\";\n } else if (attachment.contentType.includes(\"video\")) {\n if (attachmentStatus !== \"\") {\n attachmentStatus += \",\";\n }\n attachmentStatus += \"video\";\n } else if (attachment.contentType === \"application/zip\") {\n if (attachmentStatus !== \"\") {\n attachmentStatus += \",\";\n }\n attachmentStatus += \"trace\";\n } else if (attachment.contentType === \"text/plain\") {\n if (attachmentStatus !== \"\") {\n attachmentStatus += \",\";\n }\n attachmentStatus += \"txt\";\n }\n }\n return attachmentStatus;\n }\n\n private dedupeSteps(steps: TestStep[]): DedupedStep[] {\n const result: DedupedStep[] = [];\n let lastResult = undefined;\n for (const step of steps) {\n const canDedupe =\n !step.error && step.duration >= 0 && step.location?.file && !step.steps.length;\n const lastStep = lastResult?.step;\n if (\n canDedupe &&\n lastResult &&\n lastStep &&\n step.category === lastStep.category &&\n step.title === lastStep.title &&\n step.location?.file === lastStep.location?.file &&\n step.location?.line === lastStep.location?.line &&\n step.location?.column === lastStep.location?.column\n ) {\n ++lastResult.count;\n lastResult.duration += step.duration;\n continue;\n }\n lastResult = { step, count: 1, duration: step.duration };\n result.push(lastResult);\n if (!canDedupe) {\n lastResult = undefined;\n }\n }\n return result;\n }\n\n private serializeTestStep(dedupedStep: DedupedStep): RawTestStep {\n const { step, duration, count } = dedupedStep;\n const result: RawTestStep = {\n title: step.title,\n category: step.category,\n startTime: step.startTime.toISOString(),\n duration,\n error: step.error ? step.error.message : undefined,\n location: this.relativeLocation(step.location),\n steps: this.dedupeSteps(step.steps).map((subStep) => this.serializeTestStep(subStep)),\n count: count,\n };\n return result;\n }\n\n private getTestStatus(test: TestCase, result: TestResult): string {\n if (test.expectedStatus === result.status) {\n if (result.status === \"skipped\") {\n return \"SKIPPED\";\n } else {\n return \"PASSED\";\n }\n } else if (result.status === \"interrupted\") {\n return \"SKIPPED\";\n } else {\n return \"FAILED\";\n }\n }\n\n private extractRootParentTitle(suite: Suite): string | undefined {\n // Traverse through the parent properties until reaching the root parent\n let currentSuite: Suite | undefined = suite;\n let depthCount: number = 0;\n let suiteTitle: string = currentSuite.title;\n const projectName = currentSuite.project()!.name;\n while (currentSuite?.parent && !ReporterUtils.isNullOrEmpty(currentSuite.parent.title)) {\n if (depthCount > 10 || currentSuite.parent.title === projectName) {\n break;\n }\n suiteTitle = suiteTitle + \" > \" + currentSuite.parent.title;\n currentSuite = currentSuite.parent;\n depthCount++;\n }\n return suiteTitle;\n }\n\n private async getRunName(ciInfo: CIInfo): Promise<string> {\n if (\n ciInfo.provider === CI_PROVIDERS.GITHUB &&\n process.env[\"GITHUB_EVENT_NAME\"] === \"pull_request\"\n ) {\n const prNumber: string = `${process.env[\"GITHUB_REF_NAME\"]?.split(\"/\")[0]}`;\n const prLink: string = `${process.env[\"GITHUB_REPOSITORY\"]}/pull/${prNumber}`;\n return `PR# ${prNumber} on Repo: ${process.env[\"GITHUB_REPOSITORY\"]} (${prLink})`;\n }\n\n let gitCommitMessage: string | null = null;\n try {\n const gitVersion = await this.runCommand(Constants.GIT_VERSION_COMMAND);\n if (ReporterUtils.isNullOrEmpty(gitVersion)) {\n throw new Error(\"Git is not installed on the machine\");\n }\n const isInsideWorkTree = await this.runCommand(Constants.GIT_REV_PARSE);\n if (isInsideWorkTree !== \"true\") {\n throw new Error(\"Not inside a git repository\");\n }\n gitCommitMessage = await this.runCommand(Constants.GIT_COMMIT_MESSAGE_COMMAND);\n return gitCommitMessage;\n } catch (err) {\n reporterLogger.error(`\\nError in getting git commit message: ${err}.`);\n return \"\";\n }\n }\n\n private async runCommand(command: string): Promise<string> {\n return new Promise((resolve, reject) => {\n exec(command, (error, stdout, stderr) => {\n if (error) {\n reject(error);\n return;\n }\n if (stderr) {\n reject(new Error(stderr));\n return;\n }\n resolve(stdout.trim());\n });\n });\n }\n\n public static isNullOrEmpty(str: string | null | undefined): boolean {\n return !str || str.trim() === \"\";\n }\n\n private getTestError(result: TestResult): string {\n if (!result.errors || result.errors.length === 0) return \"\";\n const errorMessages: { message: string }[] = [];\n result.errors.forEach((error) => {\n if (error.message) errorMessages.push({ message: error.message });\n if (error.snippet && error.location) {\n errorMessages.push({\n message: error.snippet + \"\\n\\n\" + this.getReadableLineLocation(error.location),\n });\n } else if (error.snippet) errorMessages.push({ message: error.snippet });\n });\n return JSON.stringify(errorMessages, null, 2);\n }\n\n private getReadableLineLocation(location: Location): string {\n return `at ${location.file}:${location.line}:${location.column}`;\n }\n\n private getWorkers(): number {\n if (\n this.config.metadata &&\n \"actualWorkers\" in this.config.metadata &&\n typeof this.config.metadata.actualWorkers === \"number\"\n ) {\n return this.config.metadata.actualWorkers;\n }\n return this.config.workers;\n }\n}\n\nexport default ReporterUtils;\n"]}
|
|
@@ -7,6 +7,12 @@ const constants_js_1 = require("../common/constants.js");
|
|
|
7
7
|
const httpService_js_1 = require("../common/httpService.js");
|
|
8
8
|
const logger_js_1 = require("../common/logger.js");
|
|
9
9
|
class ServiceClient {
|
|
10
|
+
httpService;
|
|
11
|
+
envVariables;
|
|
12
|
+
reporterUtils;
|
|
13
|
+
addInformationalMessage;
|
|
14
|
+
isInformationMessagePresent;
|
|
15
|
+
addKeyToInformationMessage;
|
|
10
16
|
constructor(
|
|
11
17
|
/* eslint-disable @azure/azure-sdk/ts-use-interface-parameters */
|
|
12
18
|
envVariables, reporterUtils,
|
|
@@ -93,9 +99,8 @@ class ServiceClient {
|
|
|
93
99
|
return process.env[constants_js_1.InternalEnvironmentVariables.MPT_SERVICE_REPORTING_URL];
|
|
94
100
|
}
|
|
95
101
|
handleErrorResponse(response, action) {
|
|
96
|
-
var _a, _b;
|
|
97
102
|
const statusCode = response.status;
|
|
98
|
-
const errorMessage =
|
|
103
|
+
const errorMessage = constants_js_1.Constants.ERROR_MESSAGE[action]?.[statusCode] ?? "Unknown error occured.";
|
|
99
104
|
if (!this.isInformationMessagePresent(statusCode.toString())) {
|
|
100
105
|
this.addKeyToInformationMessage(statusCode.toString());
|
|
101
106
|
this.addInformationalMessage(errorMessage);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serviceClient.js","sourceRoot":"","sources":["../../../src/utils/serviceClient.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { FullResult } from \"@playwright/test/reporter\";\nimport { Constants, InternalEnvironmentVariables } from \"../common/constants.js\";\nimport type { EnvironmentVariables } from \"../common/environmentVariables.js\";\nimport { HttpService } from \"../common/httpService.js\";\nimport type { Shard, UploadMetadata } from \"../model/shard.js\";\nimport type { StorageUri } from \"../model/storageUri.js\";\nimport type { TestResult } from \"../model/testResult.js\";\nimport type { TestRun } from \"../model/testRun.js\";\nimport type { CIInfo } from \"./cIInfoProvider.js\";\nimport type ReporterUtils from \"./reporterUtils.js\";\nimport type { PipelineResponse } from \"@azure/core-rest-pipeline\";\nimport { reporterLogger } from \"../common/logger.js\";\n\nexport class ServiceClient {\n private httpService: HttpService;\n private readonly envVariables: EnvironmentVariables;\n private readonly reporterUtils: ReporterUtils;\n private readonly addInformationalMessage: (errorMessage: string) => void;\n private isInformationMessagePresent: (key: string) => boolean;\n private addKeyToInformationMessage: (key: string) => void;\n constructor(\n /* eslint-disable @azure/azure-sdk/ts-use-interface-parameters */\n envVariables: EnvironmentVariables,\n reporterUtils: ReporterUtils,\n /* eslint-enable @azure/azure-sdk/ts-use-interface-parameters */\n addErrorInformation: (errorMessage: string) => void,\n isInformationMessagePresent: (key: string) => boolean,\n addKeyToInformationMessage: (key: string) => void,\n ) {\n this.httpService = new HttpService();\n this.envVariables = envVariables;\n this.reporterUtils = reporterUtils;\n this.addInformationalMessage = addErrorInformation;\n this.isInformationMessagePresent = isInformationMessagePresent;\n this.addKeyToInformationMessage = addKeyToInformationMessage;\n }\n\n async patchTestRun(ciInfo: CIInfo): Promise<TestRun> {\n const testRun = await this.reporterUtils.getTestRunObject(ciInfo);\n\n // Escape the runId to avoid issues with special characters\n const escapedRunId = encodeURIComponent(this.envVariables.runId!);\n const response: PipelineResponse = await this.httpService.callAPI(\n \"PATCH\",\n `${this.getServiceEndpoint()}/${Constants.testRunsEndpoint.replace(\"{workspaceId}\", this.envVariables.accountId!)}/${escapedRunId}?api-version=${Constants.API_VERSION}`,\n JSON.stringify(testRun),\n this.envVariables.accessToken,\n \"application/merge-patch+json\",\n this.envVariables.correlationId!,\n );\n if (response.status === 200) {\n return JSON.parse(response.bodyAsText!) as TestRun;\n } else if (response.status === 409) {\n const errorMessage = Constants.CONFLICT_409_ERROR_MESSAGE.replace(\n \"{runId}\",\n this.envVariables.runId,\n );\n this.addInformationalMessage(errorMessage);\n process.stdout.write(`\\n${errorMessage}`);\n } else if (response.status === 403) {\n const errorMessage = Constants.FORBIDDEN_403_ERROR_MESSAGE.replace(\n new RegExp(\"{workspaceId}\", \"g\"),\n this.envVariables.accountId!,\n );\n this.addInformationalMessage(errorMessage);\n process.stdout.write(`\\n${errorMessage}`);\n } else {\n this.handleErrorResponse(response, Constants.patchTestRun);\n }\n throw new Error(`Received status ${response.status} from service from PATCH TestRun call.`);\n }\n\n async postTestRunShardStart(): Promise<Shard> {\n const postTestRunShardObject = this.reporterUtils.getTestRunShardStartObject();\n const escapedRunId = encodeURIComponent(this.envVariables.runId!);\n const response: PipelineResponse = await this.httpService.callAPI(\n \"POST\",\n `${this.getServiceEndpoint()}/${Constants.testRunsShardEndpoint.replace(\"{workspaceId}\", this.envVariables.accountId!).replace(\"{testRunId}\", escapedRunId)}/?api-version=${Constants.API_VERSION}`,\n JSON.stringify(postTestRunShardObject),\n this.envVariables.accessToken,\n \"application/json\",\n this.envVariables.correlationId!,\n );\n if (response.status === 200) {\n return JSON.parse(response.bodyAsText!) as Shard;\n }\n this.handleErrorResponse(response, Constants.patchTestRunShardStart);\n\n throw new Error(\n `Received status ${response.status} from service from PATCH TestRun Shard Start call.`,\n );\n }\n\n async postTestRunShardEnd(\n result: FullResult,\n // eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters\n shard: Shard,\n errorMessages: string[],\n attachmentMetadata: UploadMetadata,\n workers: number,\n ): Promise<TestRun> {\n const postTestRunShardObject = this.reporterUtils.getTestRunShardEndObject(\n result,\n shard,\n errorMessages,\n attachmentMetadata,\n workers,\n );\n const escapedRunId = encodeURIComponent(this.envVariables.runId!);\n const response: PipelineResponse = await this.httpService.callAPI(\n \"POST\",\n `${this.getServiceEndpoint()}/${Constants.testRunsShardEndpoint.replace(\"{workspaceId}\", this.envVariables.accountId!).replace(\"{testRunId}\", escapedRunId)}/?api-version=${Constants.API_VERSION}`,\n JSON.stringify(postTestRunShardObject),\n this.envVariables.accessToken,\n \"application/json\",\n this.envVariables.correlationId!,\n );\n if (response.status === 200) {\n return JSON.parse(response.bodyAsText!) as TestRun;\n }\n this.handleErrorResponse(response, Constants.patchTestRunShardEnd);\n\n throw new Error(\n `Received status ${response.status} from service from PATCH TestRun Shard End call.`,\n );\n }\n\n // eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters\n async postTestResults(testResults: TestResult[]): Promise<void> {\n try {\n const payload: any = {\n value: testResults,\n };\n const response: PipelineResponse = await this.httpService.callAPI(\n \"POST\",\n `${this.getServiceEndpoint()}/${Constants.testResultsEndpoint.replace(\"{workspaceId}\", this.envVariables.accountId!)}?api-version=${Constants.API_VERSION}`,\n JSON.stringify(payload),\n this.envVariables.accessToken,\n \"application/json\",\n this.envVariables.correlationId!,\n );\n if (response.status === 200) {\n return;\n }\n this.handleErrorResponse(response, Constants.postTestResults);\n } catch (error) {\n reporterLogger.error(`Error occurred while posting test results: ${error}`);\n }\n }\n\n async createStorageUri(): Promise<StorageUri> {\n const escapedRunId = encodeURIComponent(this.envVariables.runId!);\n const response: PipelineResponse = await this.httpService.callAPI(\n \"POST\",\n `${this.getServiceEndpoint()}/${Constants.storageUriEndpoint.replace(\"{workspaceId}\", this.envVariables.accountId!).replace(\"{testRunId}\", escapedRunId)}?api-version=${Constants.API_VERSION}`,\n null,\n this.envVariables.accessToken,\n \"application/json\",\n this.envVariables.correlationId!,\n );\n if (response.status === 200) {\n return JSON.parse(response.bodyAsText!) as StorageUri;\n }\n this.handleErrorResponse(response, Constants.getStorageUri);\n\n throw new Error(`Received status ${response.status} from service from GET StorageUri call.`);\n }\n\n private getServiceEndpoint(): string {\n return process.env[InternalEnvironmentVariables.MPT_SERVICE_REPORTING_URL]!;\n }\n\n private handleErrorResponse(response: PipelineResponse, action: string): void {\n const statusCode = response.status;\n const errorMessage = Constants.ERROR_MESSAGE[action]?.[statusCode] ?? \"Unknown error occured.\";\n if (!this.isInformationMessagePresent(statusCode.toString())) {\n this.addKeyToInformationMessage(statusCode.toString());\n this.addInformationalMessage(errorMessage);\n }\n process.stdout.write(`${errorMessage}\\n`);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"serviceClient.js","sourceRoot":"","sources":["../../../src/utils/serviceClient.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;;AAGlC,yDAAiF;AAEjF,6DAAuD;AAQvD,mDAAqD;AAErD,MAAa,aAAa;IAChB,WAAW,CAAc;IAChB,YAAY,CAAuB;IACnC,aAAa,CAAgB;IAC7B,uBAAuB,CAAiC;IACjE,2BAA2B,CAA2B;IACtD,0BAA0B,CAAwB;IAC1D;IACE,iEAAiE;IACjE,YAAkC,EAClC,aAA4B;IAC5B,gEAAgE;IAChE,mBAAmD,EACnD,2BAAqD,EACrD,0BAAiD;QAEjD,IAAI,CAAC,WAAW,GAAG,IAAI,4BAAW,EAAE,CAAC;QACrC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,uBAAuB,GAAG,mBAAmB,CAAC;QACnD,IAAI,CAAC,2BAA2B,GAAG,2BAA2B,CAAC;QAC/D,IAAI,CAAC,0BAA0B,GAAG,0BAA0B,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc;QAC/B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAElE,2DAA2D;QAC3D,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,KAAM,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAqB,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAC/D,OAAO,EACP,GAAG,IAAI,CAAC,kBAAkB,EAAE,IAAI,wBAAS,CAAC,gBAAgB,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,SAAU,CAAC,IAAI,YAAY,gBAAgB,wBAAS,CAAC,WAAW,EAAE,EACxK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EACvB,IAAI,CAAC,YAAY,CAAC,WAAW,EAC7B,8BAA8B,EAC9B,IAAI,CAAC,YAAY,CAAC,aAAc,CACjC,CAAC;QACF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAW,CAAY,CAAC;QACrD,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACnC,MAAM,YAAY,GAAG,wBAAS,CAAC,0BAA0B,CAAC,OAAO,CAC/D,SAAS,EACT,IAAI,CAAC,YAAY,CAAC,KAAK,CACxB,CAAC;YACF,IAAI,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAC;YAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,EAAE,CAAC,CAAC;QAC5C,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACnC,MAAM,YAAY,GAAG,wBAAS,CAAC,2BAA2B,CAAC,OAAO,CAChE,IAAI,MAAM,CAAC,eAAe,EAAE,GAAG,CAAC,EAChC,IAAI,CAAC,YAAY,CAAC,SAAU,CAC7B,CAAC;YACF,IAAI,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAC;YAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,EAAE,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,wBAAS,CAAC,YAAY,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,wCAAwC,CAAC,CAAC;IAC9F,CAAC;IAED,KAAK,CAAC,qBAAqB;QACzB,MAAM,sBAAsB,GAAG,IAAI,CAAC,aAAa,CAAC,0BAA0B,EAAE,CAAC;QAC/E,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,KAAM,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAqB,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAC/D,MAAM,EACN,GAAG,IAAI,CAAC,kBAAkB,EAAE,IAAI,wBAAS,CAAC,qBAAqB,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,SAAU,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC,iBAAiB,wBAAS,CAAC,WAAW,EAAE,EACnM,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,EACtC,IAAI,CAAC,YAAY,CAAC,WAAW,EAC7B,kBAAkB,EAClB,IAAI,CAAC,YAAY,CAAC,aAAc,CACjC,CAAC;QACF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAW,CAAU,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,wBAAS,CAAC,sBAAsB,CAAC,CAAC;QAErE,MAAM,IAAI,KAAK,CACb,mBAAmB,QAAQ,CAAC,MAAM,oDAAoD,CACvF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,mBAAmB,CACvB,MAAkB;IAClB,wEAAwE;IACxE,KAAY,EACZ,aAAuB,EACvB,kBAAkC,EAClC,OAAe;QAEf,MAAM,sBAAsB,GAAG,IAAI,CAAC,aAAa,CAAC,wBAAwB,CACxE,MAAM,EACN,KAAK,EACL,aAAa,EACb,kBAAkB,EAClB,OAAO,CACR,CAAC;QACF,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,KAAM,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAqB,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAC/D,MAAM,EACN,GAAG,IAAI,CAAC,kBAAkB,EAAE,IAAI,wBAAS,CAAC,qBAAqB,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,SAAU,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC,iBAAiB,wBAAS,CAAC,WAAW,EAAE,EACnM,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,EACtC,IAAI,CAAC,YAAY,CAAC,WAAW,EAC7B,kBAAkB,EAClB,IAAI,CAAC,YAAY,CAAC,aAAc,CACjC,CAAC;QACF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAW,CAAY,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,wBAAS,CAAC,oBAAoB,CAAC,CAAC;QAEnE,MAAM,IAAI,KAAK,CACb,mBAAmB,QAAQ,CAAC,MAAM,kDAAkD,CACrF,CAAC;IACJ,CAAC;IAED,wEAAwE;IACxE,KAAK,CAAC,eAAe,CAAC,WAAyB;QAC7C,IAAI,CAAC;YACH,MAAM,OAAO,GAAQ;gBACnB,KAAK,EAAE,WAAW;aACnB,CAAC;YACF,MAAM,QAAQ,GAAqB,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAC/D,MAAM,EACN,GAAG,IAAI,CAAC,kBAAkB,EAAE,IAAI,wBAAS,CAAC,mBAAmB,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,SAAU,CAAC,gBAAgB,wBAAS,CAAC,WAAW,EAAE,EAC3J,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EACvB,IAAI,CAAC,YAAY,CAAC,WAAW,EAC7B,kBAAkB,EAClB,IAAI,CAAC,YAAY,CAAC,aAAc,CACjC,CAAC;YACF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO;YACT,CAAC;YACD,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,wBAAS,CAAC,eAAe,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0BAAc,CAAC,KAAK,CAAC,8CAA8C,KAAK,EAAE,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,KAAM,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAqB,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAC/D,MAAM,EACN,GAAG,IAAI,CAAC,kBAAkB,EAAE,IAAI,wBAAS,CAAC,kBAAkB,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,SAAU,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC,gBAAgB,wBAAS,CAAC,WAAW,EAAE,EAC/L,IAAI,EACJ,IAAI,CAAC,YAAY,CAAC,WAAW,EAC7B,kBAAkB,EAClB,IAAI,CAAC,YAAY,CAAC,aAAc,CACjC,CAAC;QACF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAW,CAAe,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,wBAAS,CAAC,aAAa,CAAC,CAAC;QAE5D,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,yCAAyC,CAAC,CAAC;IAC/F,CAAC;IAEO,kBAAkB;QACxB,OAAO,OAAO,CAAC,GAAG,CAAC,2CAA4B,CAAC,yBAAyB,CAAE,CAAC;IAC9E,CAAC;IAEO,mBAAmB,CAAC,QAA0B,EAAE,MAAc;QACpE,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;QACnC,MAAM,YAAY,GAAG,wBAAS,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,wBAAwB,CAAC;QAC/F,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;YAC7D,IAAI,CAAC,0BAA0B,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;YACvD,IAAI,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,IAAI,CAAC,CAAC;IAC5C,CAAC;CACF;AAxKD,sCAwKC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { FullResult } from \"@playwright/test/reporter\";\nimport { Constants, InternalEnvironmentVariables } from \"../common/constants.js\";\nimport type { EnvironmentVariables } from \"../common/environmentVariables.js\";\nimport { HttpService } from \"../common/httpService.js\";\nimport type { Shard, UploadMetadata } from \"../model/shard.js\";\nimport type { StorageUri } from \"../model/storageUri.js\";\nimport type { TestResult } from \"../model/testResult.js\";\nimport type { TestRun } from \"../model/testRun.js\";\nimport type { CIInfo } from \"./cIInfoProvider.js\";\nimport type ReporterUtils from \"./reporterUtils.js\";\nimport type { PipelineResponse } from \"@azure/core-rest-pipeline\";\nimport { reporterLogger } from \"../common/logger.js\";\n\nexport class ServiceClient {\n private httpService: HttpService;\n private readonly envVariables: EnvironmentVariables;\n private readonly reporterUtils: ReporterUtils;\n private readonly addInformationalMessage: (errorMessage: string) => void;\n private isInformationMessagePresent: (key: string) => boolean;\n private addKeyToInformationMessage: (key: string) => void;\n constructor(\n /* eslint-disable @azure/azure-sdk/ts-use-interface-parameters */\n envVariables: EnvironmentVariables,\n reporterUtils: ReporterUtils,\n /* eslint-enable @azure/azure-sdk/ts-use-interface-parameters */\n addErrorInformation: (errorMessage: string) => void,\n isInformationMessagePresent: (key: string) => boolean,\n addKeyToInformationMessage: (key: string) => void,\n ) {\n this.httpService = new HttpService();\n this.envVariables = envVariables;\n this.reporterUtils = reporterUtils;\n this.addInformationalMessage = addErrorInformation;\n this.isInformationMessagePresent = isInformationMessagePresent;\n this.addKeyToInformationMessage = addKeyToInformationMessage;\n }\n\n async patchTestRun(ciInfo: CIInfo): Promise<TestRun> {\n const testRun = await this.reporterUtils.getTestRunObject(ciInfo);\n\n // Escape the runId to avoid issues with special characters\n const escapedRunId = encodeURIComponent(this.envVariables.runId!);\n const response: PipelineResponse = await this.httpService.callAPI(\n \"PATCH\",\n `${this.getServiceEndpoint()}/${Constants.testRunsEndpoint.replace(\"{workspaceId}\", this.envVariables.accountId!)}/${escapedRunId}?api-version=${Constants.API_VERSION}`,\n JSON.stringify(testRun),\n this.envVariables.accessToken,\n \"application/merge-patch+json\",\n this.envVariables.correlationId!,\n );\n if (response.status === 200) {\n return JSON.parse(response.bodyAsText!) as TestRun;\n } else if (response.status === 409) {\n const errorMessage = Constants.CONFLICT_409_ERROR_MESSAGE.replace(\n \"{runId}\",\n this.envVariables.runId,\n );\n this.addInformationalMessage(errorMessage);\n process.stdout.write(`\\n${errorMessage}`);\n } else if (response.status === 403) {\n const errorMessage = Constants.FORBIDDEN_403_ERROR_MESSAGE.replace(\n new RegExp(\"{workspaceId}\", \"g\"),\n this.envVariables.accountId!,\n );\n this.addInformationalMessage(errorMessage);\n process.stdout.write(`\\n${errorMessage}`);\n } else {\n this.handleErrorResponse(response, Constants.patchTestRun);\n }\n throw new Error(`Received status ${response.status} from service from PATCH TestRun call.`);\n }\n\n async postTestRunShardStart(): Promise<Shard> {\n const postTestRunShardObject = this.reporterUtils.getTestRunShardStartObject();\n const escapedRunId = encodeURIComponent(this.envVariables.runId!);\n const response: PipelineResponse = await this.httpService.callAPI(\n \"POST\",\n `${this.getServiceEndpoint()}/${Constants.testRunsShardEndpoint.replace(\"{workspaceId}\", this.envVariables.accountId!).replace(\"{testRunId}\", escapedRunId)}/?api-version=${Constants.API_VERSION}`,\n JSON.stringify(postTestRunShardObject),\n this.envVariables.accessToken,\n \"application/json\",\n this.envVariables.correlationId!,\n );\n if (response.status === 200) {\n return JSON.parse(response.bodyAsText!) as Shard;\n }\n this.handleErrorResponse(response, Constants.patchTestRunShardStart);\n\n throw new Error(\n `Received status ${response.status} from service from PATCH TestRun Shard Start call.`,\n );\n }\n\n async postTestRunShardEnd(\n result: FullResult,\n // eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters\n shard: Shard,\n errorMessages: string[],\n attachmentMetadata: UploadMetadata,\n workers: number,\n ): Promise<TestRun> {\n const postTestRunShardObject = this.reporterUtils.getTestRunShardEndObject(\n result,\n shard,\n errorMessages,\n attachmentMetadata,\n workers,\n );\n const escapedRunId = encodeURIComponent(this.envVariables.runId!);\n const response: PipelineResponse = await this.httpService.callAPI(\n \"POST\",\n `${this.getServiceEndpoint()}/${Constants.testRunsShardEndpoint.replace(\"{workspaceId}\", this.envVariables.accountId!).replace(\"{testRunId}\", escapedRunId)}/?api-version=${Constants.API_VERSION}`,\n JSON.stringify(postTestRunShardObject),\n this.envVariables.accessToken,\n \"application/json\",\n this.envVariables.correlationId!,\n );\n if (response.status === 200) {\n return JSON.parse(response.bodyAsText!) as TestRun;\n }\n this.handleErrorResponse(response, Constants.patchTestRunShardEnd);\n\n throw new Error(\n `Received status ${response.status} from service from PATCH TestRun Shard End call.`,\n );\n }\n\n // eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters\n async postTestResults(testResults: TestResult[]): Promise<void> {\n try {\n const payload: any = {\n value: testResults,\n };\n const response: PipelineResponse = await this.httpService.callAPI(\n \"POST\",\n `${this.getServiceEndpoint()}/${Constants.testResultsEndpoint.replace(\"{workspaceId}\", this.envVariables.accountId!)}?api-version=${Constants.API_VERSION}`,\n JSON.stringify(payload),\n this.envVariables.accessToken,\n \"application/json\",\n this.envVariables.correlationId!,\n );\n if (response.status === 200) {\n return;\n }\n this.handleErrorResponse(response, Constants.postTestResults);\n } catch (error) {\n reporterLogger.error(`Error occurred while posting test results: ${error}`);\n }\n }\n\n async createStorageUri(): Promise<StorageUri> {\n const escapedRunId = encodeURIComponent(this.envVariables.runId!);\n const response: PipelineResponse = await this.httpService.callAPI(\n \"POST\",\n `${this.getServiceEndpoint()}/${Constants.storageUriEndpoint.replace(\"{workspaceId}\", this.envVariables.accountId!).replace(\"{testRunId}\", escapedRunId)}?api-version=${Constants.API_VERSION}`,\n null,\n this.envVariables.accessToken,\n \"application/json\",\n this.envVariables.correlationId!,\n );\n if (response.status === 200) {\n return JSON.parse(response.bodyAsText!) as StorageUri;\n }\n this.handleErrorResponse(response, Constants.getStorageUri);\n\n throw new Error(`Received status ${response.status} from service from GET StorageUri call.`);\n }\n\n private getServiceEndpoint(): string {\n return process.env[InternalEnvironmentVariables.MPT_SERVICE_REPORTING_URL]!;\n }\n\n private handleErrorResponse(response: PipelineResponse, action: string): void {\n const statusCode = response.status;\n const errorMessage = Constants.ERROR_MESSAGE[action]?.[statusCode] ?? \"Unknown error occured.\";\n if (!this.isInformationMessagePresent(statusCode.toString())) {\n this.addKeyToInformationMessage(statusCode.toString());\n this.addInformationalMessage(errorMessage);\n }\n process.stdout.write(`${errorMessage}\\n`);\n }\n}\n"]}
|
|
@@ -121,7 +121,7 @@ exports.fetchOrValidateAccessToken = fetchOrValidateAccessToken;
|
|
|
121
121
|
const emitReportingUrl = () => {
|
|
122
122
|
const regex = /wss:\/\/([\w-]+)\.api\.(playwright(?:-test|-int)?\.io|playwright\.microsoft\.com)\//;
|
|
123
123
|
const url = (0, exports.getServiceBaseURL)();
|
|
124
|
-
const match = url
|
|
124
|
+
const match = url?.match(regex);
|
|
125
125
|
if (match && match.length >= 3) {
|
|
126
126
|
const [, region, domain] = match;
|
|
127
127
|
node_process_1.default.env[constants_js_1.InternalEnvironmentVariables.MPT_SERVICE_REPORTING_URL] =
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { JwtPayload, VersionInfo } from \"../common/types.js\";\nimport {\n API_VERSION,\n Constants,\n InternalEnvironmentVariables,\n MINIMUM_SUPPORTED_PLAYWRIGHT_VERSION,\n ServiceEnvironmentVariable,\n} from \"../common/constants.js\";\nimport { ServiceErrorMessageConstants } from \"../common/messages.js\";\nimport { coreLogger } from \"../common/logger.js\";\nimport type { TokenCredential } from \"@azure/identity\";\nimport ReporterUtils from \"./reporterUtils.js\";\nimport { CIInfoProvider } from \"./cIInfoProvider.js\";\nimport process from \"node:process\";\nimport { parseJwt } from \"./parseJwt.js\";\nimport { getPlaywrightVersion } from \"./getPlaywrightVersion.js\";\nimport { createEntraIdAccessToken } from \"../common/entraIdAccessToken.js\";\n\n// Re-exporting for backward compatibility\nexport { getPlaywrightVersion } from \"./getPlaywrightVersion.js\";\nexport { parseJwt } from \"./parseJwt.js\";\n\nexport const exitWithFailureMessage = (error: { key: string; message: string }): never => {\n console.log();\n console.error(error.message);\n // eslint-disable-next-line n/no-process-exit\n process.exit(1);\n};\n\nexport const populateValuesFromServiceUrl = (): { region: string; accountId: string } | null => {\n // Service URL format: wss://<region>.api.playwright.microsoft.com/accounts/<workspace-id>/browsers\n const url = process.env[\"PLAYWRIGHT_SERVICE_URL\"]!;\n if (!ReporterUtils.isNullOrEmpty(url)) {\n const parts = url.split(\"/\");\n\n if (parts.length > 2) {\n const subdomainParts = parts[2]!.split(\".\");\n const region = subdomainParts.length > 0 ? subdomainParts[0] : null;\n const accountId = parts[4];\n\n return { region: region!, accountId: accountId! };\n }\n }\n return null;\n};\n\nexport const getAccessToken = (): string | undefined => {\n return process.env[ServiceEnvironmentVariable.PLAYWRIGHT_SERVICE_ACCESS_TOKEN];\n};\n\nexport const getServiceBaseURL = (): string | undefined => {\n return process.env[ServiceEnvironmentVariable.PLAYWRIGHT_SERVICE_URL];\n};\n\nexport const getAndSetRunId = (): string => {\n const runId = ReporterUtils.getRunId(CIInfoProvider.getCIInfo());\n process.env[InternalEnvironmentVariables.MPT_SERVICE_RUN_ID] = runId;\n return runId;\n};\n\nexport const getServiceWSEndpoint = (runId: string, os: string): string => {\n return `${getServiceBaseURL()}?runId=${encodeURIComponent(runId)}&os=${os}&api-version=${API_VERSION}`;\n};\n\nexport const validateServiceUrl = (): void => {\n const serviceUrl = getServiceBaseURL();\n if (!serviceUrl) {\n exitWithFailureMessage(ServiceErrorMessageConstants.NO_SERVICE_URL_ERROR);\n }\n};\n\nexport const validateMptPAT = (\n validationFailureCallback: (error: { key: string; message: string }) => void,\n): void => {\n try {\n const accessToken = getAccessToken();\n const result = populateValuesFromServiceUrl();\n if (!accessToken) {\n validationFailureCallback(ServiceErrorMessageConstants.NO_AUTH_ERROR);\n }\n const claims = parseJwt<JwtPayload>(accessToken!);\n if (!claims.exp) {\n validationFailureCallback(ServiceErrorMessageConstants.INVALID_MPT_PAT_ERROR);\n }\n if (Date.now() >= claims.exp! * 1000) {\n validationFailureCallback(ServiceErrorMessageConstants.EXPIRED_MPT_PAT_ERROR);\n }\n if (result!.accountId !== claims!.aid) {\n validationFailureCallback(ServiceErrorMessageConstants.WORKSPACE_MISMATCH_ERROR);\n }\n } catch (err) {\n coreLogger.error(err);\n exitWithFailureMessage(ServiceErrorMessageConstants.INVALID_MPT_PAT_ERROR);\n }\n};\nconst isTokenExpiringSoon = (expirationTime: number, currentTime: number): boolean => {\n return expirationTime * 1000 - currentTime <= Constants.sevenDaysInMs;\n};\n\nconst warnAboutTokenExpiry = (expirationTime: number, currentTime: number): void => {\n const daysToExpiration = Math.ceil((expirationTime * 1000 - currentTime) / Constants.oneDayInMs);\n const expirationDate = new Date(expirationTime * 1000).toLocaleDateString();\n const expirationWarning = `Warning: The access token used for this test run will expire in ${daysToExpiration} days on ${expirationDate}. Generate a new token from the portal to avoid failures. For a simpler, more secure solution, switch to Microsoft Entra ID and eliminate token management. https://learn.microsoft.com/entra/identity/`;\n console.warn(expirationWarning);\n};\n\nexport const warnIfAccessTokenCloseToExpiry = (): void => {\n const accessToken = getAccessToken();\n const claims = parseJwt<JwtPayload>(accessToken!);\n const currentTime = Date.now();\n if (isTokenExpiringSoon(claims.exp!, currentTime)) {\n warnAboutTokenExpiry(claims.exp!, currentTime);\n }\n};\n\nexport const fetchOrValidateAccessToken = async (credential?: TokenCredential): Promise<string> => {\n const entraIdAccessToken = createEntraIdAccessToken(credential);\n if (entraIdAccessToken.token && entraIdAccessToken.doesEntraIdAccessTokenNeedRotation()) {\n await entraIdAccessToken.fetchEntraIdAccessToken();\n }\n if (!getAccessToken()) {\n throw new Error(ServiceErrorMessageConstants.NO_AUTH_ERROR.message);\n }\n return getAccessToken()!;\n};\n\nexport const emitReportingUrl = (): void => {\n const regex =\n /wss:\\/\\/([\\w-]+)\\.api\\.(playwright(?:-test|-int)?\\.io|playwright\\.microsoft\\.com)\\//;\n const url = getServiceBaseURL();\n const match = url?.match(regex);\n if (match && match.length >= 3) {\n const [, region, domain] = match;\n process.env[InternalEnvironmentVariables.MPT_SERVICE_REPORTING_URL] =\n `https://${region}.reporting.api.${domain}`;\n }\n};\n\nexport const getPackageVersion = (): string => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const version = require(\"../../package.json\").version;\n return version;\n } catch (error) {\n console.error(\"Error fetching package version:\", error);\n return \"unknown version\";\n }\n};\nexport const getVersionInfo = (version: string): VersionInfo => {\n const regex = /^(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?/;\n const match = version.match(regex);\n const versionInfo = {\n major: 0,\n minor: 0,\n patch: 0,\n };\n versionInfo.major = match && match[1] ? parseInt(match[1], 10) : 0;\n versionInfo.minor = match && match[2] ? parseInt(match[2], 10) : 0;\n versionInfo.patch = match && match[3] ? parseInt(match[3], 10) : 0;\n return versionInfo;\n};\n\nexport const validatePlaywrightVersion = (): void => {\n const minimumSupportedVersion = MINIMUM_SUPPORTED_PLAYWRIGHT_VERSION;\n const installedVersion = getPlaywrightVersion();\n\n const minimumSupportedVersionInfo = getVersionInfo(minimumSupportedVersion);\n const installedVersionInfo = getVersionInfo(installedVersion);\n\n const isInstalledVersionGreater =\n installedVersionInfo.major > minimumSupportedVersionInfo.major ||\n (installedVersionInfo.major === minimumSupportedVersionInfo.major &&\n installedVersionInfo.minor >= minimumSupportedVersionInfo.minor);\n if (!isInstalledVersionGreater) {\n exitWithFailureMessage(ServiceErrorMessageConstants.INVALID_PLAYWRIGHT_VERSION_ERROR);\n }\n};\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { JwtPayload, VersionInfo } from \"../common/types.js\";\nimport {\n API_VERSION,\n Constants,\n InternalEnvironmentVariables,\n MINIMUM_SUPPORTED_PLAYWRIGHT_VERSION,\n ServiceEnvironmentVariable,\n} from \"../common/constants.js\";\nimport { ServiceErrorMessageConstants } from \"../common/messages.js\";\nimport { coreLogger } from \"../common/logger.js\";\nimport type { TokenCredential } from \"@azure/identity\";\nimport ReporterUtils from \"./reporterUtils.js\";\nimport { CIInfoProvider } from \"./cIInfoProvider.js\";\nimport process from \"node:process\";\nimport { parseJwt } from \"./parseJwt.js\";\nimport { getPlaywrightVersion } from \"./getPlaywrightVersion.js\";\nimport { createEntraIdAccessToken } from \"../common/entraIdAccessToken.js\";\n\n// Re-exporting for backward compatibility\nexport { getPlaywrightVersion } from \"./getPlaywrightVersion.js\";\nexport { parseJwt } from \"./parseJwt.js\";\n\nexport const exitWithFailureMessage = (error: { key: string; message: string }): never => {\n console.log();\n console.error(error.message);\n // eslint-disable-next-line n/no-process-exit\n process.exit(1);\n};\n\nexport const populateValuesFromServiceUrl = (): { region: string; accountId: string } | null => {\n // Service URL format: wss://<region>.api.playwright.microsoft.com/accounts/<workspace-id>/browsers\n const url = process.env[\"PLAYWRIGHT_SERVICE_URL\"]!;\n if (!ReporterUtils.isNullOrEmpty(url)) {\n const parts = url.split(\"/\");\n\n if (parts.length > 2) {\n const subdomainParts = parts[2]!.split(\".\");\n const region = subdomainParts.length > 0 ? subdomainParts[0] : null;\n const accountId = parts[4];\n\n return { region: region!, accountId: accountId! };\n }\n }\n return null;\n};\n\nexport const getAccessToken = (): string | undefined => {\n return process.env[ServiceEnvironmentVariable.PLAYWRIGHT_SERVICE_ACCESS_TOKEN];\n};\n\nexport const getServiceBaseURL = (): string | undefined => {\n return process.env[ServiceEnvironmentVariable.PLAYWRIGHT_SERVICE_URL];\n};\n\nexport const getAndSetRunId = (): string => {\n const runId = ReporterUtils.getRunId(CIInfoProvider.getCIInfo());\n process.env[InternalEnvironmentVariables.MPT_SERVICE_RUN_ID] = runId;\n return runId;\n};\n\nexport const getServiceWSEndpoint = (runId: string, os: string): string => {\n return `${getServiceBaseURL()}?runId=${encodeURIComponent(runId)}&os=${os}&api-version=${API_VERSION}`;\n};\n\nexport const validateServiceUrl = (): void => {\n const serviceUrl = getServiceBaseURL();\n if (!serviceUrl) {\n exitWithFailureMessage(ServiceErrorMessageConstants.NO_SERVICE_URL_ERROR);\n }\n};\n\nexport const validateMptPAT = (\n validationFailureCallback: (error: { key: string; message: string }) => void,\n): void => {\n try {\n const accessToken = getAccessToken();\n const result = populateValuesFromServiceUrl();\n if (!accessToken) {\n validationFailureCallback(ServiceErrorMessageConstants.NO_AUTH_ERROR);\n }\n const claims = parseJwt<JwtPayload>(accessToken!);\n if (!claims.exp) {\n validationFailureCallback(ServiceErrorMessageConstants.INVALID_MPT_PAT_ERROR);\n }\n if (Date.now() >= claims.exp! * 1000) {\n validationFailureCallback(ServiceErrorMessageConstants.EXPIRED_MPT_PAT_ERROR);\n }\n if (result!.accountId !== claims!.aid) {\n validationFailureCallback(ServiceErrorMessageConstants.WORKSPACE_MISMATCH_ERROR);\n }\n } catch (err) {\n coreLogger.error(err);\n exitWithFailureMessage(ServiceErrorMessageConstants.INVALID_MPT_PAT_ERROR);\n }\n};\nconst isTokenExpiringSoon = (expirationTime: number, currentTime: number): boolean => {\n return expirationTime * 1000 - currentTime <= Constants.sevenDaysInMs;\n};\n\nconst warnAboutTokenExpiry = (expirationTime: number, currentTime: number): void => {\n const daysToExpiration = Math.ceil((expirationTime * 1000 - currentTime) / Constants.oneDayInMs);\n const expirationDate = new Date(expirationTime * 1000).toLocaleDateString();\n const expirationWarning = `Warning: The access token used for this test run will expire in ${daysToExpiration} days on ${expirationDate}. Generate a new token from the portal to avoid failures. For a simpler, more secure solution, switch to Microsoft Entra ID and eliminate token management. https://learn.microsoft.com/entra/identity/`;\n console.warn(expirationWarning);\n};\n\nexport const warnIfAccessTokenCloseToExpiry = (): void => {\n const accessToken = getAccessToken();\n const claims = parseJwt<JwtPayload>(accessToken!);\n const currentTime = Date.now();\n if (isTokenExpiringSoon(claims.exp!, currentTime)) {\n warnAboutTokenExpiry(claims.exp!, currentTime);\n }\n};\n\nexport const fetchOrValidateAccessToken = async (credential?: TokenCredential): Promise<string> => {\n const entraIdAccessToken = createEntraIdAccessToken(credential);\n if (entraIdAccessToken.token && entraIdAccessToken.doesEntraIdAccessTokenNeedRotation()) {\n await entraIdAccessToken.fetchEntraIdAccessToken();\n }\n if (!getAccessToken()) {\n throw new Error(ServiceErrorMessageConstants.NO_AUTH_ERROR.message);\n }\n return getAccessToken()!;\n};\n\nexport const emitReportingUrl = (): void => {\n const regex =\n /wss:\\/\\/([\\w-]+)\\.api\\.(playwright(?:-test|-int)?\\.io|playwright\\.microsoft\\.com)\\//;\n const url = getServiceBaseURL();\n const match = url?.match(regex);\n if (match && match.length >= 3) {\n const [, region, domain] = match;\n process.env[InternalEnvironmentVariables.MPT_SERVICE_REPORTING_URL] =\n `https://${region}.reporting.api.${domain}`;\n }\n};\n\nexport const getPackageVersion = (): string => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const version = require(\"../../package.json\").version;\n return version;\n } catch (error) {\n console.error(\"Error fetching package version:\", error);\n return \"unknown version\";\n }\n};\nexport const getVersionInfo = (version: string): VersionInfo => {\n const regex = /^(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?/;\n const match = version.match(regex);\n const versionInfo = {\n major: 0,\n minor: 0,\n patch: 0,\n };\n versionInfo.major = match && match[1] ? parseInt(match[1], 10) : 0;\n versionInfo.minor = match && match[2] ? parseInt(match[2], 10) : 0;\n versionInfo.patch = match && match[3] ? parseInt(match[3], 10) : 0;\n return versionInfo;\n};\n\nexport const validatePlaywrightVersion = (): void => {\n const minimumSupportedVersion = MINIMUM_SUPPORTED_PLAYWRIGHT_VERSION;\n const installedVersion = getPlaywrightVersion();\n\n const minimumSupportedVersionInfo = getVersionInfo(minimumSupportedVersion);\n const installedVersionInfo = getVersionInfo(installedVersion);\n\n const isInstalledVersionGreater =\n installedVersionInfo.major > minimumSupportedVersionInfo.major ||\n (installedVersionInfo.major === minimumSupportedVersionInfo.major &&\n installedVersionInfo.minor >= minimumSupportedVersionInfo.minor);\n if (!isInstalledVersionGreater) {\n exitWithFailureMessage(ServiceErrorMessageConstants.INVALID_PLAYWRIGHT_VERSION_ERROR);\n }\n};\n"]}
|