@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
|
@@ -3,35 +3,13 @@
|
|
|
3
3
|
import { DefaultConnectOptionsConstants, InternalEnvironmentVariables } from "./constants.js";
|
|
4
4
|
import { getAndSetRunId } from "../utils/utils.js";
|
|
5
5
|
class PlaywrightServiceConfig {
|
|
6
|
+
serviceOs;
|
|
7
|
+
runId;
|
|
8
|
+
timeout;
|
|
9
|
+
slowMo;
|
|
10
|
+
exposeNetwork;
|
|
11
|
+
runName;
|
|
6
12
|
constructor() {
|
|
7
|
-
this.setOptions = (options) => {
|
|
8
|
-
if (options === null || options === void 0 ? void 0 : options.exposeNetwork) {
|
|
9
|
-
this.exposeNetwork = options.exposeNetwork;
|
|
10
|
-
}
|
|
11
|
-
if (!process.env[InternalEnvironmentVariables.MPT_SERVICE_RUN_ID]) {
|
|
12
|
-
if (options === null || options === void 0 ? void 0 : options.runId) {
|
|
13
|
-
this.runId = options.runId;
|
|
14
|
-
process.env[InternalEnvironmentVariables.MPT_SERVICE_RUN_ID] = this.runId;
|
|
15
|
-
}
|
|
16
|
-
else {
|
|
17
|
-
this.runId = getAndSetRunId();
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
if (!process.env[InternalEnvironmentVariables.MPT_SERVICE_RUN_NAME] && (options === null || options === void 0 ? void 0 : options.runName)) {
|
|
21
|
-
this.runName = options.runName;
|
|
22
|
-
process.env[InternalEnvironmentVariables.MPT_SERVICE_RUN_NAME] = this.runName;
|
|
23
|
-
}
|
|
24
|
-
if (options === null || options === void 0 ? void 0 : options.os) {
|
|
25
|
-
this.serviceOs = options.os;
|
|
26
|
-
process.env[InternalEnvironmentVariables.MPT_SERVICE_OS] = this.serviceOs;
|
|
27
|
-
}
|
|
28
|
-
if (options === null || options === void 0 ? void 0 : options.slowMo) {
|
|
29
|
-
this.slowMo = options.slowMo;
|
|
30
|
-
}
|
|
31
|
-
if (options === null || options === void 0 ? void 0 : options.timeout) {
|
|
32
|
-
this.timeout = options.timeout;
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
13
|
this.serviceOs = (process.env[InternalEnvironmentVariables.MPT_SERVICE_OS] ||
|
|
36
14
|
DefaultConnectOptionsConstants.DEFAULT_SERVICE_OS);
|
|
37
15
|
this.runName = process.env[InternalEnvironmentVariables.MPT_SERVICE_RUN_NAME] || "";
|
|
@@ -40,6 +18,34 @@ class PlaywrightServiceConfig {
|
|
|
40
18
|
this.slowMo = DefaultConnectOptionsConstants.DEFAULT_SLOW_MO;
|
|
41
19
|
this.exposeNetwork = DefaultConnectOptionsConstants.DEFAULT_EXPOSE_NETWORK;
|
|
42
20
|
}
|
|
21
|
+
setOptions = (options) => {
|
|
22
|
+
if (options?.exposeNetwork) {
|
|
23
|
+
this.exposeNetwork = options.exposeNetwork;
|
|
24
|
+
}
|
|
25
|
+
if (!process.env[InternalEnvironmentVariables.MPT_SERVICE_RUN_ID]) {
|
|
26
|
+
if (options?.runId) {
|
|
27
|
+
this.runId = options.runId;
|
|
28
|
+
process.env[InternalEnvironmentVariables.MPT_SERVICE_RUN_ID] = this.runId;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
this.runId = getAndSetRunId();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (!process.env[InternalEnvironmentVariables.MPT_SERVICE_RUN_NAME] && options?.runName) {
|
|
35
|
+
this.runName = options.runName;
|
|
36
|
+
process.env[InternalEnvironmentVariables.MPT_SERVICE_RUN_NAME] = this.runName;
|
|
37
|
+
}
|
|
38
|
+
if (options?.os) {
|
|
39
|
+
this.serviceOs = options.os;
|
|
40
|
+
process.env[InternalEnvironmentVariables.MPT_SERVICE_OS] = this.serviceOs;
|
|
41
|
+
}
|
|
42
|
+
if (options?.slowMo) {
|
|
43
|
+
this.slowMo = options.slowMo;
|
|
44
|
+
}
|
|
45
|
+
if (options?.timeout) {
|
|
46
|
+
this.timeout = options.timeout;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
43
49
|
}
|
|
44
50
|
export { PlaywrightServiceConfig };
|
|
45
51
|
//# sourceMappingURL=playwrightServiceConfig.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwrightServiceConfig.js","sourceRoot":"","sources":["../../../src/common/playwrightServiceConfig.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAE9F,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,uBAAuB;
|
|
1
|
+
{"version":3,"file":"playwrightServiceConfig.js","sourceRoot":"","sources":["../../../src/common/playwrightServiceConfig.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAE9F,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,uBAAuB;IACpB,SAAS,CAAS;IAClB,KAAK,CAAS;IACd,OAAO,CAAS;IAChB,MAAM,CAAS;IACf,aAAa,CAAS;IACtB,OAAO,CAAS;IACvB;QACE,IAAI,CAAC,SAAS,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,cAAc,CAAC;YACxE,8BAA8B,CAAC,kBAAkB,CAAW,CAAC;QAC/D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC;QACpF,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;QAChF,IAAI,CAAC,OAAO,GAAG,8BAA8B,CAAC,eAAe,CAAC;QAC9D,IAAI,CAAC,MAAM,GAAG,8BAA8B,CAAC,eAAe,CAAC;QAC7D,IAAI,CAAC,aAAa,GAAG,8BAA8B,CAAC,sBAAsB,CAAC;IAC7E,CAAC;IAED,UAAU,GAAG,CAAC,OAA4C,EAAQ,EAAE;QAClE,IAAI,OAAO,EAAE,aAAa,EAAE,CAAC;YAC3B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAClE,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;gBACnB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YAC5E,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,KAAK,GAAG,cAAc,EAAE,CAAC;YAChC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,oBAAoB,CAAC,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;YACxF,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;QAChF,CAAC;QACD,IAAI,OAAO,EAAE,EAAE,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;QAC5E,CAAC;QACD,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC/B,CAAC;QACD,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QACjC,CAAC;IACH,CAAC,CAAC;CACH;AAED,OAAO,EAAE,uBAAuB,EAAE,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { DefaultConnectOptionsConstants, InternalEnvironmentVariables } from \"./constants.js\";\nimport type { PlaywrightServiceAdditionalOptions, OsType } from \"./types.js\";\nimport { getAndSetRunId } from \"../utils/utils.js\";\n\nclass PlaywrightServiceConfig {\n public serviceOs: OsType;\n public runId: string;\n public timeout: number;\n public slowMo: number;\n public exposeNetwork: string;\n public runName: string;\n constructor() {\n this.serviceOs = (process.env[InternalEnvironmentVariables.MPT_SERVICE_OS] ||\n DefaultConnectOptionsConstants.DEFAULT_SERVICE_OS) as OsType;\n this.runName = process.env[InternalEnvironmentVariables.MPT_SERVICE_RUN_NAME] || \"\";\n this.runId = process.env[InternalEnvironmentVariables.MPT_SERVICE_RUN_ID] || \"\";\n this.timeout = DefaultConnectOptionsConstants.DEFAULT_TIMEOUT;\n this.slowMo = DefaultConnectOptionsConstants.DEFAULT_SLOW_MO;\n this.exposeNetwork = DefaultConnectOptionsConstants.DEFAULT_EXPOSE_NETWORK;\n }\n\n setOptions = (options?: PlaywrightServiceAdditionalOptions): void => {\n if (options?.exposeNetwork) {\n this.exposeNetwork = options.exposeNetwork;\n }\n if (!process.env[InternalEnvironmentVariables.MPT_SERVICE_RUN_ID]) {\n if (options?.runId) {\n this.runId = options.runId;\n process.env[InternalEnvironmentVariables.MPT_SERVICE_RUN_ID] = this.runId;\n } else {\n this.runId = getAndSetRunId();\n }\n }\n if (!process.env[InternalEnvironmentVariables.MPT_SERVICE_RUN_NAME] && options?.runName) {\n this.runName = options.runName;\n process.env[InternalEnvironmentVariables.MPT_SERVICE_RUN_NAME] = this.runName;\n }\n if (options?.os) {\n this.serviceOs = options.os;\n process.env[InternalEnvironmentVariables.MPT_SERVICE_OS] = this.serviceOs;\n }\n if (options?.slowMo) {\n this.slowMo = options.slowMo;\n }\n if (options?.timeout) {\n this.timeout = options.timeout;\n }\n };\n}\n\nexport { PlaywrightServiceConfig };\n"]}
|
|
@@ -12,7 +12,7 @@ const performOneTimeOperation = (options) => {
|
|
|
12
12
|
if (oneTimeOperationFlag)
|
|
13
13
|
return;
|
|
14
14
|
process.env[InternalEnvironmentVariables.ONE_TIME_OPERATION_FLAG] = "true";
|
|
15
|
-
if (
|
|
15
|
+
if (options?.serviceAuthType === ServiceAuth.ACCESS_TOKEN) {
|
|
16
16
|
warnIfAccessTokenCloseToExpiry();
|
|
17
17
|
}
|
|
18
18
|
};
|
|
@@ -51,7 +51,7 @@ const getServiceConfig = (config, options) => {
|
|
|
51
51
|
validateServiceUrl();
|
|
52
52
|
const playwrightVersionInfo = getVersionInfo(getPlaywrightVersion());
|
|
53
53
|
const isMultipleGlobalFileSupported = playwrightVersionInfo.major >= 1 && playwrightVersionInfo.minor >= 49;
|
|
54
|
-
if (options
|
|
54
|
+
if (options?.credential) {
|
|
55
55
|
playwrightServiceEntra.entraIdAccessToken = options.credential;
|
|
56
56
|
}
|
|
57
57
|
// if global setup/teardown is string -
|
|
@@ -96,7 +96,7 @@ const getServiceConfig = (config, options) => {
|
|
|
96
96
|
playwrightServiceConfig.setOptions(options);
|
|
97
97
|
emitReportingUrl();
|
|
98
98
|
const globalFunctions = {};
|
|
99
|
-
if (
|
|
99
|
+
if (options?.serviceAuthType === ServiceAuth.ACCESS_TOKEN) {
|
|
100
100
|
// mpt PAT requested and set by the customer, no need to setup entra lifecycle handlers
|
|
101
101
|
validateMptPAT(exitWithFailureMessage);
|
|
102
102
|
}
|
|
@@ -121,14 +121,17 @@ const getServiceConfig = (config, options) => {
|
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
123
|
performOneTimeOperation(options);
|
|
124
|
-
if (
|
|
125
|
-
return
|
|
124
|
+
if (options?.useCloudHostedBrowsers === false) {
|
|
125
|
+
return {
|
|
126
|
+
...globalFunctions,
|
|
127
|
+
};
|
|
126
128
|
}
|
|
127
129
|
if (!process.env[InternalEnvironmentVariables.MPT_CLOUD_HOSTED_BROWSER_USED]) {
|
|
128
130
|
process.env[InternalEnvironmentVariables.MPT_CLOUD_HOSTED_BROWSER_USED] = "true";
|
|
129
131
|
console.log("\nRunning tests using Microsoft Playwright Testing service.");
|
|
130
132
|
}
|
|
131
|
-
return
|
|
133
|
+
return {
|
|
134
|
+
use: {
|
|
132
135
|
connectOptions: {
|
|
133
136
|
wsEndpoint: getServiceWSEndpoint(playwrightServiceConfig.runId, playwrightServiceConfig.serviceOs),
|
|
134
137
|
headers: {
|
|
@@ -139,7 +142,9 @@ const getServiceConfig = (config, options) => {
|
|
|
139
142
|
exposeNetwork: playwrightServiceConfig.exposeNetwork,
|
|
140
143
|
slowMo: playwrightServiceConfig.slowMo,
|
|
141
144
|
},
|
|
142
|
-
}
|
|
145
|
+
},
|
|
146
|
+
...globalFunctions,
|
|
147
|
+
};
|
|
143
148
|
};
|
|
144
149
|
/**
|
|
145
150
|
* @public
|
|
@@ -172,7 +177,7 @@ const getServiceConfig = (config, options) => {
|
|
|
172
177
|
const getConnectOptions = async (options) => {
|
|
173
178
|
const playwrightServiceConfig = new PlaywrightServiceConfig();
|
|
174
179
|
playwrightServiceConfig.setOptions(options);
|
|
175
|
-
const token = await fetchOrValidateAccessToken(options
|
|
180
|
+
const token = await fetchOrValidateAccessToken(options?.credential);
|
|
176
181
|
return {
|
|
177
182
|
wsEndpoint: getServiceWSEndpoint(playwrightServiceConfig.runId, playwrightServiceConfig.serviceOs),
|
|
178
183
|
options: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwrightService.js","sourceRoot":"","sources":["../../../src/core/playwrightService.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { InternalEnvironmentVariables, ServiceAuth } from \"../common/constants.js\";\nimport customerConfig from \"../common/customerConfig.js\";\nimport { PlaywrightServiceConfig } from \"../common/playwrightServiceConfig.js\";\nimport playwrightServiceEntra from \"./playwrightServiceEntra.js\";\nimport type { PlaywrightServiceAdditionalOptions, BrowserConnectOptions } from \"../common/types.js\";\nimport {\n emitReportingUrl,\n fetchOrValidateAccessToken,\n getAccessToken,\n getServiceWSEndpoint,\n validateMptPAT,\n warnIfAccessTokenCloseToExpiry,\n validatePlaywrightVersion,\n validateServiceUrl,\n exitWithFailureMessage,\n getPackageVersion,\n getPlaywrightVersion,\n getVersionInfo,\n} from \"../utils/utils.js\";\nimport { ServiceErrorMessageConstants } from \"../common/messages.js\";\nimport type { PlaywrightTestConfig } from \"@playwright/test\";\nimport { globalSetupPath, globalTeardownPath } from \"./playwrightServiceUtils.js\";\n\nconst performOneTimeOperation = (options?: PlaywrightServiceAdditionalOptions): void => {\n const oneTimeOperationFlag =\n process.env[InternalEnvironmentVariables.ONE_TIME_OPERATION_FLAG] === \"true\";\n if (oneTimeOperationFlag) return;\n process.env[InternalEnvironmentVariables.ONE_TIME_OPERATION_FLAG] = \"true\";\n if (options?.serviceAuthType === ServiceAuth.ACCESS_TOKEN) {\n warnIfAccessTokenCloseToExpiry();\n }\n};\n/**\n * @public\n *\n * Generate playwright configuration integrated with Microsoft Playwright Testing.\n *\n * @param config - base playwright configuration\n * @param options - additional options for the service\n * @returns PlaywrightConfig\n *\n * @example\n * ```\n * import { defineConfig } from \"playwright/test\";\n * import { getServiceConfig } from \"@azure/microsoft-playwright-testing\";\n * import playwrightConfig from \"./playwright.config\";\n *\n * export default defineConfig(playwrightConfig, getServiceConfig(playwrightConfig));\n * ```\n *\n * @example\n * ```\n * import { defineConfig } from \"playwright/test\";\n * import { getServiceConfig, ServiceOS } from \"@azure/microsoft-playwright-testing\";\n * import playwrightConfig from \"./playwright.config\";\n *\n * export default defineConfig(playwrightConfig, getServiceConfig(playwrightConfig, {\n * runId: \"custom run id\",\n * os: ServiceOS.WINDOWS\n * }));\n * ```\n */\nconst getServiceConfig = (\n config: PlaywrightTestConfig,\n options?: PlaywrightServiceAdditionalOptions,\n): PlaywrightTestConfig => {\n validatePlaywrightVersion();\n validateServiceUrl();\n const playwrightVersionInfo = getVersionInfo(getPlaywrightVersion());\n const isMultipleGlobalFileSupported =\n playwrightVersionInfo.major >= 1 && playwrightVersionInfo.minor >= 49;\n if (options?.credential) {\n playwrightServiceEntra.entraIdAccessToken = options.credential;\n }\n\n // if global setup/teardown is string -\n // 1. if multiple global file is supported, convert it to array\n // 2. wrap playwright-service global setup/teardown with customer provided global setup/teardown\n\n // if global setup/teardown is array -\n // 1. if multiple global file is not supported, throw error\n // 2. append playwright-service global setup/teardown with customer provided global setup/teardown\n if (config && config.globalSetup) {\n if (typeof config.globalSetup === \"string\") {\n if (isMultipleGlobalFileSupported) {\n customerConfig.globalSetup = [config.globalSetup];\n } else {\n customerConfig.globalSetup = config.globalSetup;\n }\n } else {\n if (!isMultipleGlobalFileSupported) {\n throw new Error(\n ServiceErrorMessageConstants.MULTIPLE_SETUP_FILE_PLAYWRIGHT_VERSION_ERROR.message,\n );\n }\n customerConfig.globalSetup = config.globalSetup;\n }\n }\n\n if (config && config.globalTeardown) {\n if (typeof config.globalTeardown === \"string\") {\n if (isMultipleGlobalFileSupported) {\n customerConfig.globalTeardown = [config.globalTeardown];\n } else {\n customerConfig.globalTeardown = config.globalTeardown;\n }\n } else {\n if (!isMultipleGlobalFileSupported) {\n throw new Error(\n ServiceErrorMessageConstants.MULTIPLE_SETUP_FILE_PLAYWRIGHT_VERSION_ERROR.message,\n );\n }\n customerConfig.globalTeardown = config.globalTeardown;\n }\n }\n\n const playwrightServiceConfig = new PlaywrightServiceConfig();\n playwrightServiceConfig.setOptions(options);\n emitReportingUrl();\n\n const globalFunctions: any = {};\n\n if (options?.serviceAuthType === ServiceAuth.ACCESS_TOKEN) {\n // mpt PAT requested and set by the customer, no need to setup entra lifecycle handlers\n validateMptPAT(exitWithFailureMessage);\n } else {\n // If multiple global file is supported, append playwright-service global setup/teardown with customer provided global setup/teardown\n if (isMultipleGlobalFileSupported) {\n globalFunctions.globalSetup = [] as string[];\n globalFunctions.globalTeardown = [] as string[];\n if (customerConfig.globalSetup) {\n globalFunctions.globalSetup.push(...(customerConfig.globalSetup as string[]));\n }\n if (customerConfig.globalTeardown) {\n globalFunctions.globalTeardown.push(...(customerConfig.globalTeardown as string[]));\n }\n globalFunctions.globalSetup.push(globalSetupPath);\n globalFunctions.globalTeardown.push(globalTeardownPath);\n } else {\n // If multiple global file is not supported, wrap playwright-service global setup/teardown with customer provided global setup/teardown\n globalFunctions.globalSetup = globalSetupPath;\n globalFunctions.globalTeardown = globalTeardownPath;\n }\n }\n performOneTimeOperation(options);\n if (options?.useCloudHostedBrowsers === false) {\n return {\n ...globalFunctions,\n };\n }\n if (!process.env[InternalEnvironmentVariables.MPT_CLOUD_HOSTED_BROWSER_USED]) {\n process.env[InternalEnvironmentVariables.MPT_CLOUD_HOSTED_BROWSER_USED] = \"true\";\n console.log(\"\\nRunning tests using Microsoft Playwright Testing service.\");\n }\n\n return {\n use: {\n connectOptions: {\n wsEndpoint: getServiceWSEndpoint(\n playwrightServiceConfig.runId,\n playwrightServiceConfig.serviceOs,\n ),\n headers: {\n Authorization: `Bearer ${getAccessToken()}`,\n \"x-ms-package-version\": `@azure/microsoft-playwright-testing/${getPackageVersion()}`,\n },\n timeout: playwrightServiceConfig.timeout,\n exposeNetwork: playwrightServiceConfig.exposeNetwork,\n slowMo: playwrightServiceConfig.slowMo,\n },\n },\n ...globalFunctions,\n };\n};\n\n/**\n * @public\n *\n * Get connect options required to connect to Microsoft Playwright Testing's cloud hosted browsers.\n *\n * @param options - additional options for the service\n * @returns BrowserConnectOptions\n *\n * @example\n * ```\n * import playwright, { test, expect, BrowserType } from \"@playwright/test\";\n * import { getConnectOptions } from \"@azure/microsoft-playwright-testing\";\n *\n * test('has title', async ({ browserName }) => {\n * const { wsEndpoint, options } = await getConnectOptions();\n * const browser = await (playwright[browserName] as BrowserType).connect(wsEndpoint, options);\n * const context = await browser.newContext();\n * const page = await context.newPage();\n *\n * await page.goto('https://playwright.dev/');\n * await expect(page).toHaveTitle(/Playwright/);\n *\n * await page.close();\n * await context.close();\n * await browser.close();\n * });\n * ```\n */\nconst getConnectOptions = async (\n options?: Omit<PlaywrightServiceAdditionalOptions, \"serviceAuthType\">,\n): Promise<BrowserConnectOptions> => {\n const playwrightServiceConfig = new PlaywrightServiceConfig();\n playwrightServiceConfig.setOptions(options);\n\n const token = await fetchOrValidateAccessToken(options?.credential);\n return {\n wsEndpoint: getServiceWSEndpoint(\n playwrightServiceConfig.runId,\n playwrightServiceConfig.serviceOs,\n ),\n options: {\n headers: {\n Authorization: `Bearer ${token}`,\n \"x-ms-package-version\": `@azure/microsoft-playwright-testing/${getPackageVersion()}`,\n },\n timeout: playwrightServiceConfig.timeout,\n exposeNetwork: playwrightServiceConfig.exposeNetwork,\n slowMo: playwrightServiceConfig.slowMo,\n },\n };\n};\n\nexport { getServiceConfig, getConnectOptions };\n"]}
|
|
1
|
+
{"version":3,"file":"playwrightService.js","sourceRoot":"","sources":["../../../src/core/playwrightService.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { InternalEnvironmentVariables, ServiceAuth } from \"../common/constants.js\";\nimport customerConfig from \"../common/customerConfig.js\";\nimport { PlaywrightServiceConfig } from \"../common/playwrightServiceConfig.js\";\nimport playwrightServiceEntra from \"./playwrightServiceEntra.js\";\nimport type { PlaywrightServiceAdditionalOptions, BrowserConnectOptions } from \"../common/types.js\";\nimport {\n emitReportingUrl,\n fetchOrValidateAccessToken,\n getAccessToken,\n getServiceWSEndpoint,\n validateMptPAT,\n warnIfAccessTokenCloseToExpiry,\n validatePlaywrightVersion,\n validateServiceUrl,\n exitWithFailureMessage,\n getPackageVersion,\n getPlaywrightVersion,\n getVersionInfo,\n} from \"../utils/utils.js\";\nimport { ServiceErrorMessageConstants } from \"../common/messages.js\";\nimport type { PlaywrightTestConfig } from \"@playwright/test\";\nimport { globalSetupPath, globalTeardownPath } from \"./playwrightServiceUtils.js\";\n\nconst performOneTimeOperation = (options?: PlaywrightServiceAdditionalOptions): void => {\n const oneTimeOperationFlag =\n process.env[InternalEnvironmentVariables.ONE_TIME_OPERATION_FLAG] === \"true\";\n if (oneTimeOperationFlag) return;\n process.env[InternalEnvironmentVariables.ONE_TIME_OPERATION_FLAG] = \"true\";\n if (options?.serviceAuthType === ServiceAuth.ACCESS_TOKEN) {\n warnIfAccessTokenCloseToExpiry();\n }\n};\n/**\n * @public\n *\n * Generate playwright configuration integrated with Microsoft Playwright Testing.\n *\n * @param config - base playwright configuration\n * @param options - additional options for the service\n * @returns PlaywrightConfig\n *\n * @example\n * ```\n * import { defineConfig } from \"playwright/test\";\n * import { getServiceConfig } from \"@azure/microsoft-playwright-testing\";\n * import playwrightConfig from \"./playwright.config\";\n *\n * export default defineConfig(playwrightConfig, getServiceConfig(playwrightConfig));\n * ```\n *\n * @example\n * ```\n * import { defineConfig } from \"playwright/test\";\n * import { getServiceConfig, ServiceOS } from \"@azure/microsoft-playwright-testing\";\n * import playwrightConfig from \"./playwright.config\";\n *\n * export default defineConfig(playwrightConfig, getServiceConfig(playwrightConfig, {\n * runId: \"custom run id\",\n * os: ServiceOS.WINDOWS\n * }));\n * ```\n */\nconst getServiceConfig = (\n config: PlaywrightTestConfig,\n options?: PlaywrightServiceAdditionalOptions,\n): PlaywrightTestConfig => {\n validatePlaywrightVersion();\n validateServiceUrl();\n const playwrightVersionInfo = getVersionInfo(getPlaywrightVersion());\n const isMultipleGlobalFileSupported =\n playwrightVersionInfo.major >= 1 && playwrightVersionInfo.minor >= 49;\n if (options?.credential) {\n playwrightServiceEntra.entraIdAccessToken = options.credential;\n }\n\n // if global setup/teardown is string -\n // 1. if multiple global file is supported, convert it to array\n // 2. wrap playwright-service global setup/teardown with customer provided global setup/teardown\n\n // if global setup/teardown is array -\n // 1. if multiple global file is not supported, throw error\n // 2. append playwright-service global setup/teardown with customer provided global setup/teardown\n if (config && config.globalSetup) {\n if (typeof config.globalSetup === \"string\") {\n if (isMultipleGlobalFileSupported) {\n customerConfig.globalSetup = [config.globalSetup];\n } else {\n customerConfig.globalSetup = config.globalSetup;\n }\n } else {\n if (!isMultipleGlobalFileSupported) {\n throw new Error(\n ServiceErrorMessageConstants.MULTIPLE_SETUP_FILE_PLAYWRIGHT_VERSION_ERROR.message,\n );\n }\n customerConfig.globalSetup = config.globalSetup;\n }\n }\n\n if (config && config.globalTeardown) {\n if (typeof config.globalTeardown === \"string\") {\n if (isMultipleGlobalFileSupported) {\n customerConfig.globalTeardown = [config.globalTeardown];\n } else {\n customerConfig.globalTeardown = config.globalTeardown;\n }\n } else {\n if (!isMultipleGlobalFileSupported) {\n throw new Error(\n ServiceErrorMessageConstants.MULTIPLE_SETUP_FILE_PLAYWRIGHT_VERSION_ERROR.message,\n );\n }\n customerConfig.globalTeardown = config.globalTeardown;\n }\n }\n\n const playwrightServiceConfig = new PlaywrightServiceConfig();\n playwrightServiceConfig.setOptions(options);\n emitReportingUrl();\n\n const globalFunctions: any = {};\n\n if (options?.serviceAuthType === ServiceAuth.ACCESS_TOKEN) {\n // mpt PAT requested and set by the customer, no need to setup entra lifecycle handlers\n validateMptPAT(exitWithFailureMessage);\n } else {\n // If multiple global file is supported, append playwright-service global setup/teardown with customer provided global setup/teardown\n if (isMultipleGlobalFileSupported) {\n globalFunctions.globalSetup = [] as string[];\n globalFunctions.globalTeardown = [] as string[];\n if (customerConfig.globalSetup) {\n globalFunctions.globalSetup.push(...(customerConfig.globalSetup as string[]));\n }\n if (customerConfig.globalTeardown) {\n globalFunctions.globalTeardown.push(...(customerConfig.globalTeardown as string[]));\n }\n globalFunctions.globalSetup.push(globalSetupPath);\n globalFunctions.globalTeardown.push(globalTeardownPath);\n } else {\n // If multiple global file is not supported, wrap playwright-service global setup/teardown with customer provided global setup/teardown\n globalFunctions.globalSetup = globalSetupPath;\n globalFunctions.globalTeardown = globalTeardownPath;\n }\n }\n performOneTimeOperation(options);\n if (options?.useCloudHostedBrowsers === false) {\n return {\n ...globalFunctions,\n };\n }\n if (!process.env[InternalEnvironmentVariables.MPT_CLOUD_HOSTED_BROWSER_USED]) {\n process.env[InternalEnvironmentVariables.MPT_CLOUD_HOSTED_BROWSER_USED] = \"true\";\n console.log(\"\\nRunning tests using Microsoft Playwright Testing service.\");\n }\n\n return {\n use: {\n connectOptions: {\n wsEndpoint: getServiceWSEndpoint(\n playwrightServiceConfig.runId,\n playwrightServiceConfig.serviceOs,\n ),\n headers: {\n Authorization: `Bearer ${getAccessToken()}`,\n \"x-ms-package-version\": `@azure/microsoft-playwright-testing/${getPackageVersion()}`,\n },\n timeout: playwrightServiceConfig.timeout,\n exposeNetwork: playwrightServiceConfig.exposeNetwork,\n slowMo: playwrightServiceConfig.slowMo,\n },\n },\n ...globalFunctions,\n };\n};\n\n/**\n * @public\n *\n * Get connect options required to connect to Microsoft Playwright Testing's cloud hosted browsers.\n *\n * @param options - additional options for the service\n * @returns BrowserConnectOptions\n *\n * @example\n * ```\n * import playwright, { test, expect, BrowserType } from \"@playwright/test\";\n * import { getConnectOptions } from \"@azure/microsoft-playwright-testing\";\n *\n * test('has title', async ({ browserName }) => {\n * const { wsEndpoint, options } = await getConnectOptions();\n * const browser = await (playwright[browserName] as BrowserType).connect(wsEndpoint, options);\n * const context = await browser.newContext();\n * const page = await context.newPage();\n *\n * await page.goto('https://playwright.dev/');\n * await expect(page).toHaveTitle(/Playwright/);\n *\n * await page.close();\n * await context.close();\n * await browser.close();\n * });\n * ```\n */\nconst getConnectOptions = async (\n options?: Omit<PlaywrightServiceAdditionalOptions, \"serviceAuthType\">,\n): Promise<BrowserConnectOptions> => {\n const playwrightServiceConfig = new PlaywrightServiceConfig();\n playwrightServiceConfig.setOptions(options);\n\n const token = await fetchOrValidateAccessToken(options?.credential);\n return {\n wsEndpoint: getServiceWSEndpoint(\n playwrightServiceConfig.runId,\n playwrightServiceConfig.serviceOs,\n ),\n options: {\n headers: {\n Authorization: `Bearer ${token}`,\n \"x-ms-package-version\": `@azure/microsoft-playwright-testing/${getPackageVersion()}`,\n },\n timeout: playwrightServiceConfig.timeout,\n exposeNetwork: playwrightServiceConfig.exposeNetwork,\n slowMo: playwrightServiceConfig.slowMo,\n },\n };\n};\n\nexport { getServiceConfig, getConnectOptions };\n"]}
|
|
@@ -4,46 +4,49 @@ import { EntraIdAccessTokenConstants } from "../common/constants.js";
|
|
|
4
4
|
import { coreLogger } from "../common/logger.js";
|
|
5
5
|
import { EntraIdAccessToken } from "../common/entraIdAccessToken.js";
|
|
6
6
|
class PlaywrightServiceEntra {
|
|
7
|
+
_entraIdAccessTokenRotationInterval;
|
|
8
|
+
static instance;
|
|
9
|
+
_entraIdAccessToken;
|
|
10
|
+
static getInstance = () => {
|
|
11
|
+
if (!PlaywrightServiceEntra.instance) {
|
|
12
|
+
PlaywrightServiceEntra.instance = new PlaywrightServiceEntra();
|
|
13
|
+
}
|
|
14
|
+
return PlaywrightServiceEntra.instance;
|
|
15
|
+
};
|
|
7
16
|
set entraIdAccessToken(credential) {
|
|
8
17
|
this._entraIdAccessToken = new EntraIdAccessToken(credential);
|
|
9
18
|
}
|
|
10
19
|
constructor() {
|
|
11
|
-
this.globalSetup = async () => {
|
|
12
|
-
coreLogger.info("Entra id access token setup start");
|
|
13
|
-
await this._entraIdAccessToken.fetchEntraIdAccessToken();
|
|
14
|
-
this.entraIdGlobalSetupRotationHandler();
|
|
15
|
-
};
|
|
16
|
-
this.globalTeardown = () => {
|
|
17
|
-
coreLogger.info("Entra id access token teardown start");
|
|
18
|
-
if (this._entraIdAccessTokenRotationInterval) {
|
|
19
|
-
clearInterval(this._entraIdAccessTokenRotationInterval);
|
|
20
|
-
coreLogger.info("Entra id access token rotation interval cleared");
|
|
21
|
-
}
|
|
22
|
-
};
|
|
23
|
-
this.entraIdGlobalSetupRotationHandler = () => {
|
|
24
|
-
this._entraIdAccessTokenRotationInterval = setInterval(this.entraIdAccessTokenRotation, EntraIdAccessTokenConstants.ROTATION_INTERVAL_PERIOD_IN_MINUTES * 60 * 1000);
|
|
25
|
-
coreLogger.info("Entra id access token rotation handler setup done");
|
|
26
|
-
};
|
|
27
|
-
this.entraIdAccessTokenRotation = async () => {
|
|
28
|
-
coreLogger.info("Entra id access token rotation handler");
|
|
29
|
-
try {
|
|
30
|
-
if (this._entraIdAccessToken.doesEntraIdAccessTokenNeedRotation()) {
|
|
31
|
-
await this._entraIdAccessToken.fetchEntraIdAccessToken();
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
catch (err) {
|
|
35
|
-
coreLogger.error(err); // log error and continue if it's an intermittent issue (optimistic approach)
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
20
|
this._entraIdAccessToken = new EntraIdAccessToken();
|
|
39
21
|
}
|
|
22
|
+
globalSetup = async () => {
|
|
23
|
+
coreLogger.info("Entra id access token setup start");
|
|
24
|
+
await this._entraIdAccessToken.fetchEntraIdAccessToken();
|
|
25
|
+
this.entraIdGlobalSetupRotationHandler();
|
|
26
|
+
};
|
|
27
|
+
globalTeardown = () => {
|
|
28
|
+
coreLogger.info("Entra id access token teardown start");
|
|
29
|
+
if (this._entraIdAccessTokenRotationInterval) {
|
|
30
|
+
clearInterval(this._entraIdAccessTokenRotationInterval);
|
|
31
|
+
coreLogger.info("Entra id access token rotation interval cleared");
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
entraIdGlobalSetupRotationHandler = () => {
|
|
35
|
+
this._entraIdAccessTokenRotationInterval = setInterval(this.entraIdAccessTokenRotation, EntraIdAccessTokenConstants.ROTATION_INTERVAL_PERIOD_IN_MINUTES * 60 * 1000);
|
|
36
|
+
coreLogger.info("Entra id access token rotation handler setup done");
|
|
37
|
+
};
|
|
38
|
+
entraIdAccessTokenRotation = async () => {
|
|
39
|
+
coreLogger.info("Entra id access token rotation handler");
|
|
40
|
+
try {
|
|
41
|
+
if (this._entraIdAccessToken.doesEntraIdAccessTokenNeedRotation()) {
|
|
42
|
+
await this._entraIdAccessToken.fetchEntraIdAccessToken();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
coreLogger.error(err); // log error and continue if it's an intermittent issue (optimistic approach)
|
|
47
|
+
}
|
|
48
|
+
};
|
|
40
49
|
}
|
|
41
|
-
PlaywrightServiceEntra.getInstance = () => {
|
|
42
|
-
if (!PlaywrightServiceEntra.instance) {
|
|
43
|
-
PlaywrightServiceEntra.instance = new PlaywrightServiceEntra();
|
|
44
|
-
}
|
|
45
|
-
return PlaywrightServiceEntra.instance;
|
|
46
|
-
};
|
|
47
50
|
const instance = PlaywrightServiceEntra.getInstance();
|
|
48
51
|
export default instance;
|
|
49
52
|
//# sourceMappingURL=playwrightServiceEntra.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwrightServiceEntra.js","sourceRoot":"","sources":["../../../src/core/playwrightServiceEntra.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAGrE,MAAM,sBAAsB;
|
|
1
|
+
{"version":3,"file":"playwrightServiceEntra.js","sourceRoot":"","sources":["../../../src/core/playwrightServiceEntra.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAGrE,MAAM,sBAAsB;IAClB,mCAAmC,CAAkB;IACrD,MAAM,CAAC,QAAQ,CAAyB;IACxC,mBAAmB,CAAqB;IAEhD,MAAM,CAAC,WAAW,GAAG,GAA2B,EAAE;QAChD,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC;YACrC,sBAAsB,CAAC,QAAQ,GAAG,IAAI,sBAAsB,EAAE,CAAC;QACjE,CAAC;QACD,OAAO,sBAAsB,CAAC,QAAQ,CAAC;IACzC,CAAC,CAAC;IAEF,IAAI,kBAAkB,CAAC,UAA2B;QAChD,IAAI,CAAC,mBAAmB,GAAG,IAAI,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAChE,CAAC;IAED;QACE,IAAI,CAAC,mBAAmB,GAAG,IAAI,kBAAkB,EAAE,CAAC;IACtD,CAAC;IAEM,WAAW,GAAG,KAAK,IAAmB,EAAE;QAC7C,UAAU,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACrD,MAAM,IAAI,CAAC,mBAAmB,CAAC,uBAAuB,EAAE,CAAC;QACzD,IAAI,CAAC,iCAAiC,EAAE,CAAC;IAC3C,CAAC,CAAC;IAEK,cAAc,GAAG,GAAS,EAAE;QACjC,UAAU,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACxD,IAAI,IAAI,CAAC,mCAAmC,EAAE,CAAC;YAC7C,aAAa,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YACxD,UAAU,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;IACH,CAAC,CAAC;IAEM,iCAAiC,GAAG,GAAS,EAAE;QACrD,IAAI,CAAC,mCAAmC,GAAG,WAAW,CACpD,IAAI,CAAC,0BAA0B,EAC/B,2BAA2B,CAAC,mCAAmC,GAAG,EAAE,GAAG,IAAI,CAC5E,CAAC;QACF,UAAU,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC,CAAC;IAEM,0BAA0B,GAAG,KAAK,IAAmB,EAAE;QAC7D,UAAU,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QAC1D,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,mBAAmB,CAAC,kCAAkC,EAAE,EAAE,CAAC;gBAClE,MAAM,IAAI,CAAC,mBAAmB,CAAC,uBAAuB,EAAE,CAAC;YAC3D,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,6EAA6E;QACtG,CAAC;IACH,CAAC,CAAC;;AAGJ,MAAM,QAAQ,GAAG,sBAAsB,CAAC,WAAW,EAAE,CAAC;AACtD,eAAe,QAAQ,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { EntraIdAccessTokenConstants } from \"../common/constants.js\";\nimport { coreLogger } from \"../common/logger.js\";\nimport { EntraIdAccessToken } from \"../common/entraIdAccessToken.js\";\nimport type { TokenCredential } from \"@azure/identity\";\n\nclass PlaywrightServiceEntra {\n private _entraIdAccessTokenRotationInterval?: NodeJS.Timeout;\n private static instance: PlaywrightServiceEntra;\n private _entraIdAccessToken: EntraIdAccessToken;\n\n static getInstance = (): PlaywrightServiceEntra => {\n if (!PlaywrightServiceEntra.instance) {\n PlaywrightServiceEntra.instance = new PlaywrightServiceEntra();\n }\n return PlaywrightServiceEntra.instance;\n };\n\n set entraIdAccessToken(credential: TokenCredential) {\n this._entraIdAccessToken = new EntraIdAccessToken(credential);\n }\n\n constructor() {\n this._entraIdAccessToken = new EntraIdAccessToken();\n }\n\n public globalSetup = async (): Promise<void> => {\n coreLogger.info(\"Entra id access token setup start\");\n await this._entraIdAccessToken.fetchEntraIdAccessToken();\n this.entraIdGlobalSetupRotationHandler();\n };\n\n public globalTeardown = (): void => {\n coreLogger.info(\"Entra id access token teardown start\");\n if (this._entraIdAccessTokenRotationInterval) {\n clearInterval(this._entraIdAccessTokenRotationInterval);\n coreLogger.info(\"Entra id access token rotation interval cleared\");\n }\n };\n\n private entraIdGlobalSetupRotationHandler = (): void => {\n this._entraIdAccessTokenRotationInterval = setInterval(\n this.entraIdAccessTokenRotation,\n EntraIdAccessTokenConstants.ROTATION_INTERVAL_PERIOD_IN_MINUTES * 60 * 1000,\n );\n coreLogger.info(\"Entra id access token rotation handler setup done\");\n };\n\n private entraIdAccessTokenRotation = async (): Promise<void> => {\n coreLogger.info(\"Entra id access token rotation handler\");\n try {\n if (this._entraIdAccessToken.doesEntraIdAccessTokenNeedRotation()) {\n await this._entraIdAccessToken.fetchEntraIdAccessToken();\n }\n } catch (err) {\n coreLogger.error(err); // log error and continue if it's an intermittent issue (optimistic approach)\n }\n };\n}\n\nconst instance = PlaywrightServiceEntra.getInstance();\nexport default instance;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entraTokenDetails.js","sourceRoot":"","sources":["../../../src/model/entraTokenDetails.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,MAAM,OAAO,iBAAiB;
|
|
1
|
+
{"version":3,"file":"entraTokenDetails.js","sourceRoot":"","sources":["../../../src/model/entraTokenDetails.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,MAAM,OAAO,iBAAiB;IAC5B,SAAS;IACT,GAAG,CAAqB;IACxB,OAAO;IACP,IAAI,CAAqB;CAC1B","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nexport class EntraTokenDetails {\n // userId\n oid: string | undefined;\n // name\n name: string | undefined;\n}\n"]}
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
// Copyright (c) Microsoft Corporation.
|
|
2
2
|
// Licensed under the MIT License.
|
|
3
3
|
export class MPTTokenDetails {
|
|
4
|
+
// accountId
|
|
5
|
+
aid;
|
|
6
|
+
// userId
|
|
7
|
+
oid;
|
|
8
|
+
// tokenId
|
|
9
|
+
id;
|
|
10
|
+
// userName
|
|
11
|
+
userName;
|
|
4
12
|
}
|
|
5
13
|
export var TokenType;
|
|
6
14
|
(function (TokenType) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mptTokenDetails.js","sourceRoot":"","sources":["../../../src/model/mptTokenDetails.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,MAAM,OAAO,eAAe;
|
|
1
|
+
{"version":3,"file":"mptTokenDetails.js","sourceRoot":"","sources":["../../../src/model/mptTokenDetails.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,MAAM,OAAO,eAAe;IAC1B,YAAY;IACZ,GAAG,CAAqB;IACxB,SAAS;IACT,GAAG,CAAqB;IACxB,UAAU;IACV,EAAE,CAAqB;IACvB,WAAW;IACX,QAAQ,CAAqB;CAC9B;AAED,MAAM,CAAN,IAAY,SAGX;AAHD,WAAY,SAAS;IACnB,uCAAG,CAAA;IACH,2CAAK,CAAA;AACP,CAAC,EAHW,SAAS,KAAT,SAAS,QAGpB","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nexport class MPTTokenDetails {\n // accountId\n aid: string | undefined;\n // userId\n oid: string | undefined;\n // tokenId\n id: string | undefined;\n // userName\n userName: string | undefined;\n}\n\nexport enum TokenType {\n MPT,\n ENTRA,\n}\n"]}
|
package/dist/esm/model/shard.js
CHANGED
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
// Copyright (c) Microsoft Corporation.
|
|
2
2
|
// Licensed under the MIT License.
|
|
3
3
|
export class Shard {
|
|
4
|
+
shardId;
|
|
5
|
+
summary;
|
|
6
|
+
workers;
|
|
7
|
+
uploadCompleted;
|
|
4
8
|
}
|
|
5
9
|
export class TestRunSummary {
|
|
10
|
+
status;
|
|
11
|
+
startTime;
|
|
12
|
+
endTime;
|
|
13
|
+
totalTime;
|
|
14
|
+
errorMessages;
|
|
15
|
+
uploadMetadata;
|
|
6
16
|
}
|
|
7
17
|
export var TestResultStatus;
|
|
8
18
|
(function (TestResultStatus) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shard.js","sourceRoot":"","sources":["../../../src/model/shard.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,MAAM,OAAO,KAAK;
|
|
1
|
+
{"version":3,"file":"shard.js","sourceRoot":"","sources":["../../../src/model/shard.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,MAAM,OAAO,KAAK;IAChB,OAAO,CAAU;IACjB,OAAO,CAAkB;IACzB,OAAO,CAAU;IACjB,eAAe,CAAW;CAC3B;AAED,MAAM,OAAO,cAAc;IACzB,MAAM,CAAU;IAChB,SAAS,CAAU;IACnB,OAAO,CAAU;IACjB,SAAS,CAAU;IACnB,aAAa,CAAY;IACzB,cAAc,CAAkB;CACjC;AAWD,MAAM,CAAN,IAAY,gBAKX;AALD,WAAY,gBAAgB;IAC1B,qCAAiB,CAAA;IACjB,qCAAiB,CAAA;IACjB,yCAAqB,CAAA;IACrB,+CAA2B,CAAA;AAC7B,CAAC,EALW,gBAAgB,KAAhB,gBAAgB,QAK3B;AAED,MAAM,CAAN,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,oCAAmB,CAAA;IACnB,oDAAmC,CAAA;AACrC,CAAC,EAHW,aAAa,KAAb,aAAa,QAGxB","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nexport class Shard {\n shardId!: string;\n summary!: TestRunSummary;\n workers?: number;\n uploadCompleted!: boolean;\n}\n\nexport class TestRunSummary {\n status?: string;\n startTime!: string;\n endTime?: string;\n totalTime?: number;\n errorMessages?: string[];\n uploadMetadata?: UploadMetadata;\n}\n\nexport type TestRunResultsSummary = {\n numTotalTests?: number;\n numFailedTests?: number;\n numSkippedTests?: number;\n numPassedTests?: number;\n numFlakyTests?: number;\n status?: TestResultStatus;\n};\n\nexport enum TestResultStatus {\n PASSED = \"passed\",\n FAILED = \"failed\",\n TIMEDOUT = \"timedout\",\n INTERRUPTED = \"interrupted\",\n}\n\nexport enum TestRunStatus {\n RUNNING = \"RUNNING\",\n CLIENT_COMPLETE = \"CLIENT_COMPLETE\",\n}\n\nexport type UploadMetadata = {\n numTestResults: number;\n numTotalAttachments: number;\n sizeTotalAttachments: number;\n};\n\nexport type ShardInfo = {\n total: number;\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storageUri.js","sourceRoot":"","sources":["../../../src/model/storageUri.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,MAAM,OAAO,UAAU;
|
|
1
|
+
{"version":3,"file":"storageUri.js","sourceRoot":"","sources":["../../../src/model/storageUri.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,MAAM,OAAO,UAAU;IACrB,GAAG,CAAS;IACZ,SAAS,CAAS;IAClB,SAAS,CAAS;IAClB,WAAW,CAAc;IACzB,YAAY,GAAW,EAAE,SAAiB,EAAE,SAAiB,EAAE,WAAwB;QACrF,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;CACF;AAED,MAAM,CAAN,IAAY,WAKX;AALD,WAAY,WAAW;IACrB,6CAAI,CAAA;IACJ,+CAAK,CAAA;IACL,uDAAS,CAAA;IACT,yEAAkB,CAAA;AACpB,CAAC,EALW,WAAW,KAAX,WAAW,QAKtB","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nexport class StorageUri {\n uri: string;\n createdAt: string;\n expiresAt: string;\n accessLevel: AccessLevel;\n constructor(uri: string, createdAt: string, expiresAt: string, accessLevel: AccessLevel) {\n this.uri = uri;\n this.createdAt = createdAt;\n this.expiresAt = expiresAt;\n this.accessLevel = accessLevel;\n }\n}\n\nexport enum AccessLevel {\n Read,\n Write,\n ReadWrite,\n ReadAddCreateWrite,\n}\n"]}
|
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
// Copyright (c) Microsoft Corporation.
|
|
2
2
|
// Licensed under the MIT License.
|
|
3
3
|
export class TestResult {
|
|
4
|
+
testId;
|
|
5
|
+
testExecutionId;
|
|
6
|
+
testCombinationId;
|
|
7
|
+
runId;
|
|
8
|
+
shardId;
|
|
9
|
+
accountId;
|
|
10
|
+
suiteId;
|
|
11
|
+
testTitle;
|
|
12
|
+
suiteTitle;
|
|
13
|
+
fileName;
|
|
14
|
+
lineNumber;
|
|
15
|
+
retry;
|
|
16
|
+
status;
|
|
17
|
+
tags;
|
|
18
|
+
annotations;
|
|
19
|
+
webTestConfig;
|
|
20
|
+
resultsSummary;
|
|
21
|
+
artifactsPath;
|
|
4
22
|
}
|
|
5
23
|
//# sourceMappingURL=testResult.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testResult.js","sourceRoot":"","sources":["../../../src/model/testResult.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAIlC,MAAM,OAAO,UAAU;
|
|
1
|
+
{"version":3,"file":"testResult.js","sourceRoot":"","sources":["../../../src/model/testResult.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAIlC,MAAM,OAAO,UAAU;IACrB,MAAM,CAAU;IAChB,eAAe,CAAU;IACzB,iBAAiB,CAAU;IAC3B,KAAK,CAAU;IACf,OAAO,CAAU;IACjB,SAAS,CAAU;IACnB,OAAO,CAAU;IACjB,SAAS,CAAU;IACnB,UAAU,CAAU;IACpB,QAAQ,CAAU;IAClB,UAAU,CAAU;IACpB,KAAK,CAAU;IACf,MAAM,CAAU;IAChB,IAAI,CAAY;IAChB,WAAW,CAAY;IACvB,aAAa,CAAiB;IAC9B,cAAc,CAAsB;IACpC,aAAa,CAAY;CAC1B","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { RawTestStep } from \"../common/types.js\";\n\nexport class TestResult {\n testId!: string;\n testExecutionId!: string;\n testCombinationId!: string;\n runId!: string;\n shardId!: string;\n accountId!: string;\n suiteId!: string;\n testTitle!: string;\n suiteTitle!: string;\n fileName!: string;\n lineNumber!: number;\n retry!: number;\n status!: string;\n tags!: string[];\n annotations!: string[];\n webTestConfig!: WebTestConfig;\n resultsSummary!: TestResultsSummary;\n artifactsPath!: string[];\n}\n\nexport type WebTestConfig = {\n jobName: string;\n projectName: string;\n browserType?: string;\n os: string;\n};\n\nexport type TestResultsSummary = {\n status: string;\n duration: number;\n startTime: string;\n attachmentsMetadata: string;\n};\n\nexport type RawTestResult = {\n steps?: RawTestStep[];\n errors?: string;\n stdErr?: string;\n stdOut?: string;\n};\n"]}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
// Copyright (c) Microsoft Corporation.
|
|
2
2
|
// Licensed under the MIT License.
|
|
3
3
|
export class TestRun {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
testRunId;
|
|
5
|
+
displayName;
|
|
6
|
+
creatorId;
|
|
7
|
+
creatorName;
|
|
8
|
+
startTime;
|
|
9
|
+
ciConfig;
|
|
10
|
+
testRunConfig;
|
|
11
|
+
cloudReportingEnabled = "true"; // Default value set to 'true'
|
|
7
12
|
}
|
|
8
13
|
//# sourceMappingURL=testRun.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testRun.js","sourceRoot":"","sources":["../../../src/model/testRun.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAIlC,MAAM,OAAO,OAAO;
|
|
1
|
+
{"version":3,"file":"testRun.js","sourceRoot":"","sources":["../../../src/model/testRun.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAIlC,MAAM,OAAO,OAAO;IAClB,SAAS,CAAU;IACnB,WAAW,CAAU;IACrB,SAAS,CAAU;IACnB,WAAW,CAAU;IACrB,SAAS,CAAU;IACnB,QAAQ,CAAY;IACpB,aAAa,CAAiB;IAC9B,qBAAqB,GAAW,MAAM,CAAC,CAAC,8BAA8B;CACvE","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ShardInfo } from \"./shard.js\";\n\nexport class TestRun {\n testRunId!: string;\n displayName!: string;\n creatorId!: string;\n creatorName?: string;\n startTime!: string;\n ciConfig?: CIConfig;\n testRunConfig?: TestRunConfig;\n cloudReportingEnabled: string = \"true\"; // Default value set to 'true'\n}\n\nexport type CIConfig = {\n ciProviderName: string;\n branch: string;\n author: string;\n commitId: string;\n revisionUrl: string;\n};\n\nexport type TestRunConfig = {\n workers: number;\n pwVersion: string;\n timeout: number;\n shards: ShardInfo;\n retries?: number;\n repeatEach?: number;\n testFramework: TestFramework;\n testType: string;\n testSdkLanguage: string;\n reporterPackageVersion: string;\n};\n\nexport type TestFramework = {\n name: string;\n version: string;\n runnerName: string;\n};\n"]}
|
|
@@ -29,53 +29,37 @@ import { validateMptPAT, populateValuesFromServiceUrl } from "../utils/utils.js"
|
|
|
29
29
|
* ```
|
|
30
30
|
*/
|
|
31
31
|
class MPTReporter {
|
|
32
|
+
isTokenValid = true;
|
|
33
|
+
enableGitHubSummary = true;
|
|
34
|
+
isRegionValid = true;
|
|
35
|
+
shard;
|
|
36
|
+
isTestRunStartSuccess = false;
|
|
37
|
+
ciInfo = CIInfoProvider.getCIInfo();
|
|
38
|
+
serviceClient;
|
|
39
|
+
storageClient;
|
|
40
|
+
reporterUtils;
|
|
41
|
+
envVariables;
|
|
42
|
+
testRawResults = new MultiMap();
|
|
43
|
+
promiseOnBegin;
|
|
44
|
+
_testEndPromises = [];
|
|
45
|
+
testResultBatch = new Set();
|
|
46
|
+
errorMessages = [];
|
|
47
|
+
informationalMessages = [];
|
|
48
|
+
processedErrorMessageKeys = [];
|
|
49
|
+
sasUri;
|
|
50
|
+
uploadMetadata = {
|
|
51
|
+
numTestResults: 0,
|
|
52
|
+
numTotalAttachments: 0,
|
|
53
|
+
sizeTotalAttachments: 0,
|
|
54
|
+
};
|
|
55
|
+
numWorkers = -1;
|
|
56
|
+
testRunUrl = "";
|
|
57
|
+
enableResultPublish = true;
|
|
32
58
|
constructor(config) {
|
|
33
|
-
|
|
34
|
-
this.enableGitHubSummary = true;
|
|
35
|
-
this.isRegionValid = true;
|
|
36
|
-
this.isTestRunStartSuccess = false;
|
|
37
|
-
this.ciInfo = CIInfoProvider.getCIInfo();
|
|
38
|
-
this.testRawResults = new MultiMap();
|
|
39
|
-
this._testEndPromises = [];
|
|
40
|
-
this.testResultBatch = new Set();
|
|
41
|
-
this.errorMessages = [];
|
|
42
|
-
this.informationalMessages = [];
|
|
43
|
-
this.processedErrorMessageKeys = [];
|
|
44
|
-
this.uploadMetadata = {
|
|
45
|
-
numTestResults: 0,
|
|
46
|
-
numTotalAttachments: 0,
|
|
47
|
-
sizeTotalAttachments: 0,
|
|
48
|
-
};
|
|
49
|
-
this.numWorkers = -1;
|
|
50
|
-
this.testRunUrl = "";
|
|
51
|
-
this.enableResultPublish = true;
|
|
52
|
-
this._addInformationalMessage = (message) => {
|
|
53
|
-
this.informationalMessages.push(message);
|
|
54
|
-
};
|
|
55
|
-
this._addKeyToInformationMessage = (key) => {
|
|
56
|
-
this.processedErrorMessageKeys.push(key);
|
|
57
|
-
};
|
|
58
|
-
this._isInformationMessagePresent = (key) => {
|
|
59
|
-
return this.processedErrorMessageKeys.includes(key);
|
|
60
|
-
};
|
|
61
|
-
this._reporterFailureHandler = (error) => {
|
|
62
|
-
if (!this._isInformationMessagePresent(error.key)) {
|
|
63
|
-
this._addKeyToInformationMessage(error.key);
|
|
64
|
-
this._addInformationalMessage(error.message);
|
|
65
|
-
}
|
|
66
|
-
this.isTokenValid = false;
|
|
67
|
-
};
|
|
68
|
-
this.renewSasUriIfNeeded = async () => {
|
|
69
|
-
if (this.sasUri === undefined ||
|
|
70
|
-
!ReporterUtils.isTimeGreaterThanCurrentPlus10Minutes(this.sasUri)) {
|
|
71
|
-
this.sasUri = await this.serviceClient.createStorageUri();
|
|
72
|
-
reporterLogger.info(`\nFetched SAS URI with validity: ${this.sasUri.expiresAt} and access: ${this.sasUri.accessLevel}.`);
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
if ((config === null || config === void 0 ? void 0 : config.enableGitHubSummary) !== undefined) {
|
|
59
|
+
if (config?.enableGitHubSummary !== undefined) {
|
|
76
60
|
this.enableGitHubSummary = config.enableGitHubSummary;
|
|
77
61
|
}
|
|
78
|
-
if (
|
|
62
|
+
if (config?.enableResultPublish !== undefined) {
|
|
79
63
|
this.enableResultPublish = config.enableResultPublish;
|
|
80
64
|
}
|
|
81
65
|
}
|
|
@@ -84,6 +68,22 @@ class MPTReporter {
|
|
|
84
68
|
this.errorMessages.push(this.reporterUtils.redactAccessToken(errorMessage));
|
|
85
69
|
}
|
|
86
70
|
}
|
|
71
|
+
_addInformationalMessage = (message) => {
|
|
72
|
+
this.informationalMessages.push(message);
|
|
73
|
+
};
|
|
74
|
+
_addKeyToInformationMessage = (key) => {
|
|
75
|
+
this.processedErrorMessageKeys.push(key);
|
|
76
|
+
};
|
|
77
|
+
_isInformationMessagePresent = (key) => {
|
|
78
|
+
return this.processedErrorMessageKeys.includes(key);
|
|
79
|
+
};
|
|
80
|
+
_reporterFailureHandler = (error) => {
|
|
81
|
+
if (!this._isInformationMessagePresent(error.key)) {
|
|
82
|
+
this._addKeyToInformationMessage(error.key);
|
|
83
|
+
this._addInformationalMessage(error.message);
|
|
84
|
+
}
|
|
85
|
+
this.isTokenValid = false;
|
|
86
|
+
};
|
|
87
87
|
/**
|
|
88
88
|
* @public
|
|
89
89
|
*
|
|
@@ -189,7 +189,7 @@ class MPTReporter {
|
|
|
189
189
|
process.stdout.write(`\n`);
|
|
190
190
|
try {
|
|
191
191
|
const testRunResponse = await this.serviceClient.patchTestRun(this.ciInfo);
|
|
192
|
-
reporterLogger.info(`\nTest run report successfully initialized: ${testRunResponse
|
|
192
|
+
reporterLogger.info(`\nTest run report successfully initialized: ${testRunResponse?.displayName}.`);
|
|
193
193
|
process.stdout.write(`Initializing reporting for this test run. You can view the results at: https://playwright.microsoft.com/workspaces/${encodeURIComponent(this.envVariables.accountId)}/runs/${encodeURIComponent(this.envVariables.runId)}\n`);
|
|
194
194
|
const shardResponse = await this.serviceClient.postTestRunShardStart();
|
|
195
195
|
this.shard = shardResponse;
|
|
@@ -261,8 +261,14 @@ class MPTReporter {
|
|
|
261
261
|
reporterLogger.error(`\nError in uploading test run information: ${err.message}`);
|
|
262
262
|
}
|
|
263
263
|
}
|
|
264
|
+
renewSasUriIfNeeded = async () => {
|
|
265
|
+
if (this.sasUri === undefined ||
|
|
266
|
+
!ReporterUtils.isTimeGreaterThanCurrentPlus10Minutes(this.sasUri)) {
|
|
267
|
+
this.sasUri = await this.serviceClient.createStorageUri();
|
|
268
|
+
reporterLogger.info(`\nFetched SAS URI with validity: ${this.sasUri.expiresAt} and access: ${this.sasUri.accessLevel}.`);
|
|
269
|
+
}
|
|
270
|
+
};
|
|
264
271
|
async _uploadTestResultAttachments(testExecutionId, testAttachments, otherAttachments) {
|
|
265
|
-
var _a;
|
|
266
272
|
try {
|
|
267
273
|
this.isTestRunStartSuccess = await this.promiseOnBegin;
|
|
268
274
|
if (!this.isTestRunStartSuccess) {
|
|
@@ -276,7 +282,7 @@ class MPTReporter {
|
|
|
276
282
|
}
|
|
277
283
|
for (const otherAttachment of otherAttachments) {
|
|
278
284
|
await this.renewSasUriIfNeeded();
|
|
279
|
-
const match =
|
|
285
|
+
const match = otherAttachment?.contentType?.match(/charset=(.*)/);
|
|
280
286
|
const charset = match && match.length > 1 ? match[1] : "utf-8";
|
|
281
287
|
await this.storageClient.uploadBuffer(this.sasUri.uri, otherAttachment.body.toString(charset || "utf-8"), `${testExecutionId}/${otherAttachment.name}`);
|
|
282
288
|
}
|