@azure/playwright 1.1.2 → 1.1.3-alpha.20260310.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.
Files changed (168) hide show
  1. package/dist/browser/common/types.d.ts +1 -1
  2. package/dist/browser/common/types.d.ts.map +1 -1
  3. package/dist/browser/common/types.js.map +1 -1
  4. package/dist/browser/index.d.ts +1 -1
  5. package/dist/browser/index.d.ts.map +1 -1
  6. package/dist/browser/index.js.map +1 -1
  7. package/dist/browser/utils/PlaywrightServiceClient.d.ts +1 -1
  8. package/dist/browser/utils/PlaywrightServiceClient.d.ts.map +1 -1
  9. package/dist/browser/utils/PlaywrightServiceClient.js.map +1 -1
  10. package/dist/browser/utils/playwrightReporterStorageManager.d.ts.map +1 -1
  11. package/dist/browser/utils/playwrightReporterStorageManager.js.map +1 -1
  12. package/dist/browser/utils/utils.d.ts +2 -2
  13. package/dist/browser/utils/utils.d.ts.map +1 -1
  14. package/dist/browser/utils/utils.js.map +1 -1
  15. package/dist/commonjs/common/constants.js +127 -95
  16. package/dist/commonjs/common/constants.js.map +7 -1
  17. package/dist/commonjs/common/customerConfig.js +31 -14
  18. package/dist/commonjs/common/customerConfig.js.map +7 -1
  19. package/dist/commonjs/common/entraIdAccessToken.js +106 -83
  20. package/dist/commonjs/common/entraIdAccessToken.js.map +7 -1
  21. package/dist/commonjs/common/environmentVariables.js +43 -24
  22. package/dist/commonjs/common/environmentVariables.js.map +7 -1
  23. package/dist/commonjs/common/executor.js +88 -67
  24. package/dist/commonjs/common/executor.js.map +7 -1
  25. package/dist/commonjs/common/httpService.js +54 -35
  26. package/dist/commonjs/common/httpService.js.map +7 -1
  27. package/dist/commonjs/common/logger.js +28 -8
  28. package/dist/commonjs/common/logger.js.map +7 -1
  29. package/dist/commonjs/common/messages.js +189 -169
  30. package/dist/commonjs/common/messages.js.map +7 -1
  31. package/dist/commonjs/common/playwrightServiceConfig.js +113 -98
  32. package/dist/commonjs/common/playwrightServiceConfig.js.map +7 -1
  33. package/dist/commonjs/common/state.js +30 -10
  34. package/dist/commonjs/common/state.js.map +7 -1
  35. package/dist/commonjs/common/types.d.ts +1 -1
  36. package/dist/commonjs/common/types.d.ts.map +1 -1
  37. package/dist/commonjs/common/types.js +15 -5
  38. package/dist/commonjs/common/types.js.map +7 -1
  39. package/dist/commonjs/core/global/playwright-service-global-setup.js +52 -26
  40. package/dist/commonjs/core/global/playwright-service-global-setup.js.map +7 -1
  41. package/dist/commonjs/core/global/playwright-service-global-teardown.js +49 -20
  42. package/dist/commonjs/core/global/playwright-service-global-teardown.js.map +7 -1
  43. package/dist/commonjs/core/initializePlaywrightServiceTestRun.js +39 -27
  44. package/dist/commonjs/core/initializePlaywrightServiceTestRun.js.map +7 -1
  45. package/dist/commonjs/core/playwrightService.js +166 -205
  46. package/dist/commonjs/core/playwrightService.js.map +7 -1
  47. package/dist/commonjs/core/playwrightServiceEntra.js +67 -48
  48. package/dist/commonjs/core/playwrightServiceEntra.js.map +7 -1
  49. package/dist/commonjs/core/playwrightServiceUtils.d.ts +1 -1
  50. package/dist/commonjs/core/playwrightServiceUtils.d.ts.map +1 -0
  51. package/dist/commonjs/core/playwrightServiceUtils.js +44 -11
  52. package/dist/commonjs/core/playwrightServiceUtils.js.map +7 -0
  53. package/dist/commonjs/index.d.ts +1 -1
  54. package/dist/commonjs/index.d.ts.map +1 -1
  55. package/dist/commonjs/index.js +36 -18
  56. package/dist/commonjs/index.js.map +7 -1
  57. package/dist/commonjs/reporter/index.js +34 -15
  58. package/dist/commonjs/reporter/index.js.map +7 -1
  59. package/dist/commonjs/reporter/playwrightReporter.js +222 -216
  60. package/dist/commonjs/reporter/playwrightReporter.js.map +7 -1
  61. package/dist/commonjs/tsdoc-metadata.json +1 -1
  62. package/dist/commonjs/utils/PlaywrightServiceClient.d.ts +1 -1
  63. package/dist/commonjs/utils/PlaywrightServiceClient.d.ts.map +1 -1
  64. package/dist/commonjs/utils/PlaywrightServiceClient.js +140 -91
  65. package/dist/commonjs/utils/PlaywrightServiceClient.js.map +7 -1
  66. package/dist/commonjs/utils/cIInfoProvider.js +81 -74
  67. package/dist/commonjs/utils/cIInfoProvider.js.map +7 -1
  68. package/dist/commonjs/utils/getPackageVersion.d.ts +1 -1
  69. package/dist/commonjs/utils/getPackageVersion.d.ts.map +1 -0
  70. package/dist/commonjs/utils/getPackageVersion.js +50 -19
  71. package/dist/commonjs/utils/getPackageVersion.js.map +7 -0
  72. package/dist/commonjs/utils/getPlaywrightVersion.js +42 -21
  73. package/dist/commonjs/utils/getPlaywrightVersion.js.map +7 -1
  74. package/dist/commonjs/utils/packageManager.js +59 -40
  75. package/dist/commonjs/utils/packageManager.js.map +7 -1
  76. package/dist/commonjs/utils/parseJwt.js +37 -17
  77. package/dist/commonjs/utils/parseJwt.js.map +7 -1
  78. package/dist/commonjs/utils/playwrightReporterStorageManager.d.ts.map +1 -1
  79. package/dist/commonjs/utils/playwrightReporterStorageManager.js +381 -342
  80. package/dist/commonjs/utils/playwrightReporterStorageManager.js.map +7 -1
  81. package/dist/commonjs/utils/utils.d.ts +2 -2
  82. package/dist/commonjs/utils/utils.d.ts.map +1 -1
  83. package/dist/commonjs/utils/utils.js +417 -369
  84. package/dist/commonjs/utils/utils.js.map +7 -1
  85. package/dist/esm/common/constants.js +92 -92
  86. package/dist/esm/common/constants.js.map +7 -1
  87. package/dist/esm/common/customerConfig.js +11 -11
  88. package/dist/esm/common/customerConfig.js.map +7 -1
  89. package/dist/esm/common/entraIdAccessToken.js +85 -77
  90. package/dist/esm/common/entraIdAccessToken.js.map +7 -1
  91. package/dist/esm/common/environmentVariables.js +19 -19
  92. package/dist/esm/common/environmentVariables.js.map +7 -1
  93. package/dist/esm/common/executor.js +51 -58
  94. package/dist/esm/common/executor.js.map +7 -1
  95. package/dist/esm/common/httpService.js +34 -29
  96. package/dist/esm/common/httpService.js.map +7 -1
  97. package/dist/esm/common/logger.js +4 -4
  98. package/dist/esm/common/logger.js.map +7 -1
  99. package/dist/esm/common/messages.js +166 -166
  100. package/dist/esm/common/messages.js.map +7 -1
  101. package/dist/esm/common/playwrightServiceConfig.js +91 -91
  102. package/dist/esm/common/playwrightServiceConfig.js.map +7 -1
  103. package/dist/esm/common/state.js +7 -7
  104. package/dist/esm/common/state.js.map +7 -1
  105. package/dist/esm/common/types.d.ts +1 -1
  106. package/dist/esm/common/types.d.ts.map +1 -1
  107. package/dist/esm/common/types.js +0 -4
  108. package/dist/esm/common/types.js.map +7 -1
  109. package/dist/esm/core/global/playwright-service-global-setup.js +17 -17
  110. package/dist/esm/core/global/playwright-service-global-setup.js.map +7 -1
  111. package/dist/esm/core/global/playwright-service-global-teardown.js +16 -13
  112. package/dist/esm/core/global/playwright-service-global-teardown.js.map +7 -1
  113. package/dist/esm/core/initializePlaywrightServiceTestRun.js +13 -21
  114. package/dist/esm/core/initializePlaywrightServiceTestRun.js.map +7 -1
  115. package/dist/esm/core/playwrightService.js +144 -195
  116. package/dist/esm/core/playwrightService.js.map +7 -1
  117. package/dist/esm/core/playwrightServiceEntra.js +44 -42
  118. package/dist/esm/core/playwrightServiceEntra.js.map +7 -1
  119. package/dist/esm/core/playwrightServiceUtils.js +6 -8
  120. package/dist/esm/core/playwrightServiceUtils.js.map +7 -1
  121. package/dist/esm/index.d.ts +1 -1
  122. package/dist/esm/index.d.ts.map +1 -1
  123. package/dist/esm/index.js +7 -9
  124. package/dist/esm/index.js.map +7 -1
  125. package/dist/esm/reporter/index.js +4 -11
  126. package/dist/esm/reporter/index.js.map +7 -1
  127. package/dist/esm/reporter/playwrightReporter.js +202 -207
  128. package/dist/esm/reporter/playwrightReporter.js.map +7 -1
  129. package/dist/esm/utils/PlaywrightServiceClient.d.ts +1 -1
  130. package/dist/esm/utils/PlaywrightServiceClient.d.ts.map +1 -1
  131. package/dist/esm/utils/PlaywrightServiceClient.js +120 -85
  132. package/dist/esm/utils/PlaywrightServiceClient.js.map +7 -1
  133. package/dist/esm/utils/cIInfoProvider.js +58 -71
  134. package/dist/esm/utils/cIInfoProvider.js.map +7 -1
  135. package/dist/esm/utils/getPackageVersion.js +12 -17
  136. package/dist/esm/utils/getPackageVersion.js.map +7 -1
  137. package/dist/esm/utils/getPlaywrightVersion.js +15 -13
  138. package/dist/esm/utils/getPlaywrightVersion.js.map +7 -1
  139. package/dist/esm/utils/packageManager.js +37 -37
  140. package/dist/esm/utils/packageManager.js.map +7 -1
  141. package/dist/esm/utils/parseJwt.js +15 -14
  142. package/dist/esm/utils/parseJwt.js.map +7 -1
  143. package/dist/esm/utils/playwrightReporterStorageManager.d.ts.map +1 -1
  144. package/dist/esm/utils/playwrightReporterStorageManager.js +358 -333
  145. package/dist/esm/utils/playwrightReporterStorageManager.js.map +7 -1
  146. package/dist/esm/utils/utils.d.ts +2 -2
  147. package/dist/esm/utils/utils.d.ts.map +1 -1
  148. package/dist/esm/utils/utils.js +377 -350
  149. package/dist/esm/utils/utils.js.map +7 -1
  150. package/dist/react-native/common/types.d.ts +1 -1
  151. package/dist/react-native/common/types.d.ts.map +1 -1
  152. package/dist/react-native/common/types.js.map +1 -1
  153. package/dist/react-native/index.d.ts +1 -1
  154. package/dist/react-native/index.d.ts.map +1 -1
  155. package/dist/react-native/index.js.map +1 -1
  156. package/dist/react-native/utils/PlaywrightServiceClient.d.ts +1 -1
  157. package/dist/react-native/utils/PlaywrightServiceClient.d.ts.map +1 -1
  158. package/dist/react-native/utils/PlaywrightServiceClient.js.map +1 -1
  159. package/dist/react-native/utils/playwrightReporterStorageManager.d.ts.map +1 -1
  160. package/dist/react-native/utils/playwrightReporterStorageManager.js.map +1 -1
  161. package/dist/react-native/utils/utils.d.ts +2 -2
  162. package/dist/react-native/utils/utils.d.ts.map +1 -1
  163. package/dist/react-native/utils/utils.js.map +1 -1
  164. package/package.json +6 -24
  165. package/dist/commonjs/core/playwrightServiceUtils-cjs.cjs.map +0 -1
  166. package/dist/commonjs/core/playwrightServiceUtils-cjs.d.cts.map +0 -1
  167. package/dist/commonjs/utils/getPackageVersion-cjs.cjs.map +0 -1
  168. package/dist/commonjs/utils/getPackageVersion-cjs.d.cts.map +0 -1
@@ -1,12 +1,5 @@
1
- // Copyright (c) Microsoft Corporation.
2
- // Licensed under the MIT License.
3
- /**
4
- * Azure Playwright Reporter
5
- * Feature that uploads the report generated by the HTML reporter to the customer's storage account and
6
- * view them in the service portal for faster and easier troubleshooting.
7
- *
8
- * @packageDocumentation
9
- */
10
1
  import playwrightReporter from "./playwrightReporter.js";
11
- export default playwrightReporter;
12
- //# sourceMappingURL=index.js.map
2
+ var reporter_default = playwrightReporter;
3
+ export {
4
+ reporter_default as default
5
+ };
@@ -1 +1,7 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/reporter/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC;;;;;;GAMG;AAEH,OAAO,kBAAkB,MAAM,yBAAyB,CAAC;AAEzD,eAAe,kBAAkB,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Azure Playwright Reporter\n * Feature that uploads the report generated by the HTML reporter to the customer's storage account and\n * view them in the service portal for faster and easier troubleshooting.\n *\n * @packageDocumentation\n */\n\nimport playwrightReporter from \"./playwrightReporter.js\";\n\nexport default playwrightReporter;\n"]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["/mnt/vss/_work/1/s/sdk/loadtesting/playwright/src/reporter/index.ts"],
4
+ "sourcesContent": ["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Azure Playwright Reporter\n * Feature that uploads the report generated by the HTML reporter to the customer's storage account and\n * view them in the service portal for faster and easier troubleshooting.\n *\n * @packageDocumentation\n */\n\nimport playwrightReporter from \"./playwrightReporter.js\";\n\nexport default playwrightReporter;\n"],
5
+ "mappings": "AAWA,OAAO,wBAAwB;AAE/B,IAAO,mBAAQ;",
6
+ "names": []
7
+ }
@@ -1,224 +1,219 @@
1
1
  import { PlaywrightReporterStorageManager } from "../utils/playwrightReporterStorageManager.js";
2
- import { getHtmlReporterOutputFolder, getPortalTestRunUrl, getVersionInfo, resolveTenantDomain, } from "../utils/utils.js";
2
+ import {
3
+ getHtmlReporterOutputFolder,
4
+ getPortalTestRunUrl,
5
+ getVersionInfo,
6
+ resolveTenantDomain
7
+ } from "../utils/utils.js";
3
8
  import { coreLogger } from "../common/logger.js";
4
9
  import { PlaywrightServiceConfig } from "../common/playwrightServiceConfig.js";
5
10
  import { ServiceAuth, InternalEnvironmentVariables } from "../common/constants.js";
6
11
  import { ServiceErrorMessageConstants } from "../common/messages.js";
7
12
  import { PlaywrightServiceClient } from "../utils/PlaywrightServiceClient.js";
8
13
  import { getPlaywrightVersion } from "../utils/getPlaywrightVersion.js";
9
- /**
10
- * Azure Playwright Reporter - Uploads generated Playwright test report folder to Azure Storage.
11
- */
12
- export default class PlaywrightReporter {
13
- config;
14
- workspaceMetadata = null;
15
- tenantDomain;
16
- isReportingEnabled = false;
17
- /**
18
- * Called when test run begins. Stores configuration for later use and validates serviceAuthType and
19
- * retrieves workspace metadata.
20
- * @param config - Playwright test configuration
21
- */
22
- async onBegin(config) {
23
- coreLogger.info(`Reporter configuration: ${JSON.stringify(config.reporter, null, 2)}`);
24
- this.config = config;
25
- // Check Playwright version for reporting feature compatibility
26
- try {
27
- const playwrightVersion = getPlaywrightVersion();
28
- const playwrightVersionInfo = getVersionInfo(playwrightVersion);
29
- // Check if version is < 1.57
30
- const isReportingSupportedVersion = playwrightVersionInfo.major > 1 ||
31
- (playwrightVersionInfo.major === 1 && playwrightVersionInfo.minor >= 57);
32
- if (!isReportingSupportedVersion) {
33
- console.error(ServiceErrorMessageConstants.PLAYWRIGHT_VERSION_TOO_OLD_FOR_REPORTING.message);
34
- this.isReportingEnabled = false;
35
- return;
36
- }
37
- }
38
- catch (error) {
39
- coreLogger.error(`Failed to get Playwright version: ${error}`);
40
- console.error(ServiceErrorMessageConstants.PLAYWRIGHT_VERSION_TOO_OLD_FOR_REPORTING.message);
41
- this.isReportingEnabled = false;
42
- return;
43
- }
44
- // Check if using service config
45
- const usingServiceConfig = process.env[InternalEnvironmentVariables.USING_SERVICE_CONFIG] === "true";
46
- coreLogger.info(`Using service config: ${usingServiceConfig}`);
47
- if (!usingServiceConfig) {
48
- console.error(ServiceErrorMessageConstants.REPORTER_REQUIRES_SERVICE_CONFIG.message);
49
- this.isReportingEnabled = false;
50
- return;
51
- }
52
- // Check if test run creation was successful
53
- const testRunCreationSuccess = process.env[InternalEnvironmentVariables.TEST_RUN_CREATION_SUCCESS] === "true";
54
- if (!testRunCreationSuccess) {
55
- console.error(ServiceErrorMessageConstants.REPORTING_STATUS_FAILED.message);
56
- console.error(ServiceErrorMessageConstants.REPORTING_TEST_RUN_FAILED.message);
57
- this.isReportingEnabled = false;
58
- return;
59
- }
60
- // Check authentication
61
- const playwrightServiceConfig = PlaywrightServiceConfig.instance;
62
- coreLogger.info(`Current authentication type: ${playwrightServiceConfig.serviceAuthType}`);
63
- const isUsingAccessToken = playwrightServiceConfig.serviceAuthType === ServiceAuth.ACCESS_TOKEN;
64
- if (isUsingAccessToken) {
65
- console.error(ServiceErrorMessageConstants.REPORTER_REQUIRES_ENTRA_AUTH.message);
66
- this.isReportingEnabled = false;
67
- return;
68
- }
69
- coreLogger.info("Authentication validation passed - using ENTRA_ID");
70
- // Validate HTML reporter configuration
71
- if (!this.validateHtmlReporterConfiguration(config)) {
72
- return;
73
- }
74
- // Get workspace metadata for later use
75
- try {
76
- const playwrightServiceApiClient = new PlaywrightServiceClient();
77
- this.workspaceMetadata = await playwrightServiceApiClient.getWorkspaceMetadata();
78
- coreLogger.info(`Received workspace details: ${JSON.stringify(this.workspaceMetadata, null, 2)}`);
79
- if (!this.isReportingAllowed(this.workspaceMetadata)) {
80
- return;
81
- }
82
- // Resolve tenant domain for portal URL (if tenantId is available)
83
- if (this.workspaceMetadata.tenantId) {
84
- try {
85
- const tenants = await playwrightServiceApiClient.getTenants();
86
- this.tenantDomain = resolveTenantDomain(this.workspaceMetadata.tenantId, tenants);
87
- }
88
- catch (error) {
89
- coreLogger.error(`Failed to resolve tenant domain: ${error}`);
90
- }
91
- }
92
- else {
93
- coreLogger.info("Workspace metadata does not contain tenantId; skipping tenant domain resolution.");
94
- }
95
- this.isReportingEnabled = true;
96
- console.log(ServiceErrorMessageConstants.REPORTING_ENABLED.message);
97
- }
98
- catch (error) {
99
- const errorMessage = error instanceof Error ? error.message : String(error);
100
- console.error(`${ServiceErrorMessageConstants.WORKSPACE_METADATA_FETCH_FAILED.message}Error: ${errorMessage} `);
101
- }
14
+ class PlaywrightReporter {
15
+ config;
16
+ workspaceMetadata = null;
17
+ tenantDomain;
18
+ isReportingEnabled = false;
19
+ /**
20
+ * Called when test run begins. Stores configuration for later use and validates serviceAuthType and
21
+ * retrieves workspace metadata.
22
+ * @param config - Playwright test configuration
23
+ */
24
+ async onBegin(config) {
25
+ coreLogger.info(`Reporter configuration: ${JSON.stringify(config.reporter, null, 2)}`);
26
+ this.config = config;
27
+ try {
28
+ const playwrightVersion = getPlaywrightVersion();
29
+ const playwrightVersionInfo = getVersionInfo(playwrightVersion);
30
+ const isReportingSupportedVersion = playwrightVersionInfo.major > 1 || playwrightVersionInfo.major === 1 && playwrightVersionInfo.minor >= 57;
31
+ if (!isReportingSupportedVersion) {
32
+ console.error(
33
+ ServiceErrorMessageConstants.PLAYWRIGHT_VERSION_TOO_OLD_FOR_REPORTING.message
34
+ );
35
+ this.isReportingEnabled = false;
36
+ return;
37
+ }
38
+ } catch (error) {
39
+ coreLogger.error(`Failed to get Playwright version: ${error}`);
40
+ console.error(ServiceErrorMessageConstants.PLAYWRIGHT_VERSION_TOO_OLD_FOR_REPORTING.message);
41
+ this.isReportingEnabled = false;
42
+ return;
102
43
  }
103
- /**
104
- * Called when test run ends. Uploads Playwright test report to Azure Storage if reporting is enabled.
105
- */
106
- async onEnd() {
107
- if (this.isReportingEnabled) {
108
- console.log(ServiceErrorMessageConstants.COLLECTING_ARTIFACTS.message);
109
- const uploadResult = await this.uploadHtmlReport();
110
- if (uploadResult.success) {
111
- if (uploadResult.partialSuccess &&
112
- uploadResult.failedFileDetails &&
113
- uploadResult.failedFileDetails.length > 0) {
114
- console.log("Warning: Failed to upload the following files:");
115
- uploadResult.failedFileDetails.forEach((fileDetail) => {
116
- console.log(` - ${fileDetail.fileName}, ERROR: ${fileDetail.error}`);
117
- });
118
- console.log(ServiceErrorMessageConstants.REPORTING_STATUS_PARTIAL.message);
119
- }
120
- else {
121
- console.log(ServiceErrorMessageConstants.REPORTING_STATUS_SUCCESS.message);
122
- }
123
- // Display portal URL for both full and partial success
124
- if (this.workspaceMetadata) {
125
- const portalUrl = getPortalTestRunUrl(this.workspaceMetadata, this.tenantDomain);
126
- console.log(ServiceErrorMessageConstants.TEST_REPORT_VIEW_URL.formatWithUrl(portalUrl));
127
- }
128
- }
129
- else {
130
- console.error(ServiceErrorMessageConstants.REPORTING_STATUS_FAILED.message);
131
- if (uploadResult.errorMessage) {
132
- console.error(`Error: ${uploadResult.errorMessage}`);
133
- }
134
- }
135
- }
44
+ const usingServiceConfig = process.env[InternalEnvironmentVariables.USING_SERVICE_CONFIG] === "true";
45
+ coreLogger.info(`Using service config: ${usingServiceConfig}`);
46
+ if (!usingServiceConfig) {
47
+ console.error(ServiceErrorMessageConstants.REPORTER_REQUIRES_SERVICE_CONFIG.message);
48
+ this.isReportingEnabled = false;
49
+ return;
50
+ }
51
+ const testRunCreationSuccess = process.env[InternalEnvironmentVariables.TEST_RUN_CREATION_SUCCESS] === "true";
52
+ if (!testRunCreationSuccess) {
53
+ console.error(ServiceErrorMessageConstants.REPORTING_STATUS_FAILED.message);
54
+ console.error(ServiceErrorMessageConstants.REPORTING_TEST_RUN_FAILED.message);
55
+ this.isReportingEnabled = false;
56
+ return;
57
+ }
58
+ const playwrightServiceConfig = PlaywrightServiceConfig.instance;
59
+ coreLogger.info(`Current authentication type: ${playwrightServiceConfig.serviceAuthType}`);
60
+ const isUsingAccessToken = playwrightServiceConfig.serviceAuthType === ServiceAuth.ACCESS_TOKEN;
61
+ if (isUsingAccessToken) {
62
+ console.error(ServiceErrorMessageConstants.REPORTER_REQUIRES_ENTRA_AUTH.message);
63
+ this.isReportingEnabled = false;
64
+ return;
65
+ }
66
+ coreLogger.info("Authentication validation passed - using ENTRA_ID");
67
+ if (!this.validateHtmlReporterConfiguration(config)) {
68
+ return;
136
69
  }
137
- async uploadHtmlReport() {
70
+ try {
71
+ const playwrightServiceApiClient = new PlaywrightServiceClient();
72
+ this.workspaceMetadata = await playwrightServiceApiClient.getWorkspaceMetadata();
73
+ coreLogger.info(
74
+ `Received workspace details: ${JSON.stringify(this.workspaceMetadata, null, 2)}`
75
+ );
76
+ if (!this.isReportingAllowed(this.workspaceMetadata)) {
77
+ return;
78
+ }
79
+ if (this.workspaceMetadata.tenantId) {
138
80
  try {
139
- const outputFolder = getHtmlReporterOutputFolder(this.config);
140
- coreLogger.info(`Resolved Playwright test report output folder: ${outputFolder}`);
141
- const storageManager = new PlaywrightReporterStorageManager();
142
- coreLogger.info("Starting Playwright test report upload process");
143
- const uploadResult = await storageManager.uploadPlaywrightHtmlReportAfterTests(outputFolder, this.workspaceMetadata);
144
- if (uploadResult.success) {
145
- coreLogger.info(`Playwright Test report uploaded successfully to Azure Storage.`);
146
- }
147
- return uploadResult;
148
- }
149
- catch (error) {
150
- const errorMessage = error instanceof Error ? error.message : "Unknown error";
151
- coreLogger.error(`Upload failed: ${errorMessage}`);
152
- return { success: false, errorMessage };
153
- }
81
+ const tenants = await playwrightServiceApiClient.getTenants();
82
+ this.tenantDomain = resolveTenantDomain(this.workspaceMetadata.tenantId, tenants);
83
+ } catch (error) {
84
+ coreLogger.error(`Failed to resolve tenant domain: ${error}`);
85
+ }
86
+ } else {
87
+ coreLogger.info(
88
+ "Workspace metadata does not contain tenantId; skipping tenant domain resolution."
89
+ );
90
+ }
91
+ this.isReportingEnabled = true;
92
+ console.log(ServiceErrorMessageConstants.REPORTING_ENABLED.message);
93
+ } catch (error) {
94
+ const errorMessage = error instanceof Error ? error.message : String(error);
95
+ console.error(
96
+ `${ServiceErrorMessageConstants.WORKSPACE_METADATA_FETCH_FAILED.message}Error: ${errorMessage} `
97
+ );
154
98
  }
155
- validateHtmlReporterConfiguration(config) {
156
- if (!config.reporter || !Array.isArray(config.reporter)) {
157
- console.error(ServiceErrorMessageConstants.HTML_REPORTER_REQUIRED.message);
158
- return false;
159
- }
160
- const htmlReporterIndex = config.reporter.findIndex((reporter) => {
161
- const reporterName = typeof reporter === "string" ? reporter : reporter?.[0];
162
- return reporterName === "html";
163
- });
164
- const azureReporterIndex = config.reporter.findIndex((reporter) => {
165
- const reporterName = typeof reporter === "string" ? reporter : reporter?.[0];
166
- return (typeof reporterName === "string" &&
167
- reporterName.includes("playwright") &&
168
- reporterName.includes("reporter"));
169
- });
170
- // Validate HTML reporter exists
171
- if (htmlReporterIndex === -1) {
172
- console.error(ServiceErrorMessageConstants.HTML_REPORTER_REQUIRED.message);
173
- return false;
174
- }
175
- // Validate HTML reporter comes before Azure reporter (if Azure reporter exists)
176
- if (azureReporterIndex !== -1 && htmlReporterIndex > azureReporterIndex) {
177
- console.error(ServiceErrorMessageConstants.HTML_REPORTER_REQUIRED.message);
178
- return false;
179
- }
180
- coreLogger.info("HTML reporter validation passed - HTML reporter is configured and properly ordered");
181
- return true;
99
+ }
100
+ /**
101
+ * Called when test run ends. Uploads Playwright test report to Azure Storage if reporting is enabled.
102
+ */
103
+ async onEnd() {
104
+ if (this.isReportingEnabled) {
105
+ console.log(ServiceErrorMessageConstants.COLLECTING_ARTIFACTS.message);
106
+ const uploadResult = await this.uploadHtmlReport();
107
+ if (uploadResult.success) {
108
+ if (uploadResult.partialSuccess && uploadResult.failedFileDetails && uploadResult.failedFileDetails.length > 0) {
109
+ console.log("Warning: Failed to upload the following files:");
110
+ uploadResult.failedFileDetails.forEach((fileDetail) => {
111
+ console.log(` - ${fileDetail.fileName}, ERROR: ${fileDetail.error}`);
112
+ });
113
+ console.log(ServiceErrorMessageConstants.REPORTING_STATUS_PARTIAL.message);
114
+ } else {
115
+ console.log(ServiceErrorMessageConstants.REPORTING_STATUS_SUCCESS.message);
116
+ }
117
+ if (this.workspaceMetadata) {
118
+ const portalUrl = getPortalTestRunUrl(this.workspaceMetadata, this.tenantDomain);
119
+ console.log(ServiceErrorMessageConstants.TEST_REPORT_VIEW_URL.formatWithUrl(portalUrl));
120
+ }
121
+ } else {
122
+ console.error(ServiceErrorMessageConstants.REPORTING_STATUS_FAILED.message);
123
+ if (uploadResult.errorMessage) {
124
+ console.error(`Error: ${uploadResult.errorMessage}`);
125
+ }
126
+ }
182
127
  }
183
- /**
184
- * Determines if reporting should be enabled based on workspace metadata.
185
- * @param workspaceMetadata - The workspace metadata containing reporting and storageUri information
186
- * @returns true if reporting should be enabled, false otherwise
187
- */
188
- isReportingAllowed(workspaceMetadata) {
189
- if (!workspaceMetadata) {
190
- console.error(ServiceErrorMessageConstants.FAILED_TO_GET_WORKSPACE_METADATA.message);
191
- return false;
192
- }
193
- const { reporting, storageUri } = workspaceMetadata;
194
- // If reporting field is present in metadata, check its value
195
- if (reporting !== undefined) {
196
- const normalizedReporting = typeof reporting === "string" ? reporting.toLowerCase() : reporting;
197
- if (normalizedReporting === "disabled") {
198
- console.error(ServiceErrorMessageConstants.WORKSPACE_REPORTING_DISABLED.message);
199
- coreLogger.info("Reporting disabled via workspace metadata configuration");
200
- return false;
201
- }
202
- if (normalizedReporting === "enabled") {
203
- if (!storageUri) {
204
- console.error(ServiceErrorMessageConstants.WORKSPACE_REPORTING_STORAGE_NOT_LINKED.message);
205
- coreLogger.info("Reporting enabled in metadata but storage URI not configured");
206
- return false;
207
- }
208
- coreLogger.info("Reporting enabled via workspace metadata configuration");
209
- return true;
210
- }
211
- // If reporting has an unexpected value, log warning and fall back to storageUri check
212
- coreLogger.info(`Unexpected reporting value in workspace metadata: ${reporting}. Falling back to storage URI check.`);
213
- }
214
- // Fallback to current logic: check only storageUri (when reporting field is not present or has unexpected value)
128
+ }
129
+ async uploadHtmlReport() {
130
+ try {
131
+ const outputFolder = getHtmlReporterOutputFolder(this.config);
132
+ coreLogger.info(`Resolved Playwright test report output folder: ${outputFolder}`);
133
+ const storageManager = new PlaywrightReporterStorageManager();
134
+ coreLogger.info("Starting Playwright test report upload process");
135
+ const uploadResult = await storageManager.uploadPlaywrightHtmlReportAfterTests(
136
+ outputFolder,
137
+ this.workspaceMetadata
138
+ );
139
+ if (uploadResult.success) {
140
+ coreLogger.info(`Playwright Test report uploaded successfully to Azure Storage.`);
141
+ }
142
+ return uploadResult;
143
+ } catch (error) {
144
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
145
+ coreLogger.error(`Upload failed: ${errorMessage}`);
146
+ return { success: false, errorMessage };
147
+ }
148
+ }
149
+ validateHtmlReporterConfiguration(config) {
150
+ if (!config.reporter || !Array.isArray(config.reporter)) {
151
+ console.error(ServiceErrorMessageConstants.HTML_REPORTER_REQUIRED.message);
152
+ return false;
153
+ }
154
+ const htmlReporterIndex = config.reporter.findIndex((reporter) => {
155
+ const reporterName = typeof reporter === "string" ? reporter : reporter?.[0];
156
+ return reporterName === "html";
157
+ });
158
+ const azureReporterIndex = config.reporter.findIndex((reporter) => {
159
+ const reporterName = typeof reporter === "string" ? reporter : reporter?.[0];
160
+ return typeof reporterName === "string" && reporterName.includes("playwright") && reporterName.includes("reporter");
161
+ });
162
+ if (htmlReporterIndex === -1) {
163
+ console.error(ServiceErrorMessageConstants.HTML_REPORTER_REQUIRED.message);
164
+ return false;
165
+ }
166
+ if (azureReporterIndex !== -1 && htmlReporterIndex > azureReporterIndex) {
167
+ console.error(ServiceErrorMessageConstants.HTML_REPORTER_REQUIRED.message);
168
+ return false;
169
+ }
170
+ coreLogger.info(
171
+ "HTML reporter validation passed - HTML reporter is configured and properly ordered"
172
+ );
173
+ return true;
174
+ }
175
+ /**
176
+ * Determines if reporting should be enabled based on workspace metadata.
177
+ * @param workspaceMetadata - The workspace metadata containing reporting and storageUri information
178
+ * @returns true if reporting should be enabled, false otherwise
179
+ */
180
+ isReportingAllowed(workspaceMetadata) {
181
+ if (!workspaceMetadata) {
182
+ console.error(ServiceErrorMessageConstants.FAILED_TO_GET_WORKSPACE_METADATA.message);
183
+ return false;
184
+ }
185
+ const { reporting, storageUri } = workspaceMetadata;
186
+ if (reporting !== void 0) {
187
+ const normalizedReporting = typeof reporting === "string" ? reporting.toLowerCase() : reporting;
188
+ if (normalizedReporting === "disabled") {
189
+ console.error(ServiceErrorMessageConstants.WORKSPACE_REPORTING_DISABLED.message);
190
+ coreLogger.info("Reporting disabled via workspace metadata configuration");
191
+ return false;
192
+ }
193
+ if (normalizedReporting === "enabled") {
215
194
  if (!storageUri) {
216
- console.error(ServiceErrorMessageConstants.WORKSPACE_REPORTING_DISABLED.message);
217
- coreLogger.info("Storage URI not configured in workspace metadata");
218
- return false;
195
+ console.error(
196
+ ServiceErrorMessageConstants.WORKSPACE_REPORTING_STORAGE_NOT_LINKED.message
197
+ );
198
+ coreLogger.info("Reporting enabled in metadata but storage URI not configured");
199
+ return false;
219
200
  }
220
- coreLogger.info("Reporting enabled based on storage URI configuration");
201
+ coreLogger.info("Reporting enabled via workspace metadata configuration");
221
202
  return true;
203
+ }
204
+ coreLogger.info(
205
+ `Unexpected reporting value in workspace metadata: ${reporting}. Falling back to storage URI check.`
206
+ );
207
+ }
208
+ if (!storageUri) {
209
+ console.error(ServiceErrorMessageConstants.WORKSPACE_REPORTING_DISABLED.message);
210
+ coreLogger.info("Storage URI not configured in workspace metadata");
211
+ return false;
222
212
  }
213
+ coreLogger.info("Reporting enabled based on storage URI configuration");
214
+ return true;
215
+ }
223
216
  }
224
- //# sourceMappingURL=playwrightReporter.js.map
217
+ export {
218
+ PlaywrightReporter as default
219
+ };
@@ -1 +1,7 @@
1
- {"version":3,"file":"playwrightReporter.js","sourceRoot":"","sources":["../../../src/reporter/playwrightReporter.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport type { FullConfig, Reporter } from \"@playwright/test/reporter\";\nimport { PlaywrightReporterStorageManager } from \"../utils/playwrightReporterStorageManager.js\";\nimport {\n getHtmlReporterOutputFolder,\n getPortalTestRunUrl,\n getVersionInfo,\n resolveTenantDomain,\n} from \"../utils/utils.js\";\nimport { coreLogger } from \"../common/logger.js\";\nimport { PlaywrightServiceConfig } from \"../common/playwrightServiceConfig.js\";\nimport { ServiceAuth, InternalEnvironmentVariables } from \"../common/constants.js\";\nimport { ServiceErrorMessageConstants } from \"../common/messages.js\";\nimport { PlaywrightServiceClient } from \"../utils/PlaywrightServiceClient.js\";\nimport { getPlaywrightVersion } from \"../utils/getPlaywrightVersion.js\";\nimport type { WorkspaceMetaData, UploadResult } from \"../common/types.js\";\n\n/**\n * Azure Playwright Reporter - Uploads generated Playwright test report folder to Azure Storage.\n */\n\nexport default class PlaywrightReporter implements Reporter {\n private config: FullConfig | undefined;\n private workspaceMetadata: WorkspaceMetaData | null = null;\n private tenantDomain: string | undefined;\n private isReportingEnabled = false;\n\n /**\n * Called when test run begins. Stores configuration for later use and validates serviceAuthType and\n * retrieves workspace metadata.\n * @param config - Playwright test configuration\n */\n\n async onBegin(config: FullConfig): Promise<void> {\n coreLogger.info(`Reporter configuration: ${JSON.stringify(config.reporter, null, 2)}`);\n\n this.config = config;\n\n // Check Playwright version for reporting feature compatibility\n try {\n const playwrightVersion = getPlaywrightVersion();\n const playwrightVersionInfo = getVersionInfo(playwrightVersion);\n\n // Check if version is < 1.57\n const isReportingSupportedVersion =\n playwrightVersionInfo.major > 1 ||\n (playwrightVersionInfo.major === 1 && playwrightVersionInfo.minor >= 57);\n\n if (!isReportingSupportedVersion) {\n console.error(\n ServiceErrorMessageConstants.PLAYWRIGHT_VERSION_TOO_OLD_FOR_REPORTING.message,\n );\n this.isReportingEnabled = false;\n return;\n }\n } catch (error) {\n coreLogger.error(`Failed to get Playwright version: ${error}`);\n console.error(ServiceErrorMessageConstants.PLAYWRIGHT_VERSION_TOO_OLD_FOR_REPORTING.message);\n this.isReportingEnabled = false;\n return;\n }\n\n // Check if using service config\n const usingServiceConfig =\n process.env[InternalEnvironmentVariables.USING_SERVICE_CONFIG] === \"true\";\n coreLogger.info(`Using service config: ${usingServiceConfig}`);\n if (!usingServiceConfig) {\n console.error(ServiceErrorMessageConstants.REPORTER_REQUIRES_SERVICE_CONFIG.message);\n this.isReportingEnabled = false;\n return;\n }\n\n // Check if test run creation was successful\n const testRunCreationSuccess =\n process.env[InternalEnvironmentVariables.TEST_RUN_CREATION_SUCCESS] === \"true\";\n if (!testRunCreationSuccess) {\n console.error(ServiceErrorMessageConstants.REPORTING_STATUS_FAILED.message);\n console.error(ServiceErrorMessageConstants.REPORTING_TEST_RUN_FAILED.message);\n this.isReportingEnabled = false;\n return;\n }\n\n // Check authentication\n const playwrightServiceConfig = PlaywrightServiceConfig.instance;\n coreLogger.info(`Current authentication type: ${playwrightServiceConfig.serviceAuthType}`);\n const isUsingAccessToken = playwrightServiceConfig.serviceAuthType === ServiceAuth.ACCESS_TOKEN;\n if (isUsingAccessToken) {\n console.error(ServiceErrorMessageConstants.REPORTER_REQUIRES_ENTRA_AUTH.message);\n this.isReportingEnabled = false;\n return;\n }\n coreLogger.info(\"Authentication validation passed - using ENTRA_ID\");\n\n // Validate HTML reporter configuration\n if (!this.validateHtmlReporterConfiguration(config)) {\n return;\n }\n\n // Get workspace metadata for later use\n try {\n const playwrightServiceApiClient = new PlaywrightServiceClient();\n this.workspaceMetadata = await playwrightServiceApiClient.getWorkspaceMetadata();\n coreLogger.info(\n `Received workspace details: ${JSON.stringify(this.workspaceMetadata, null, 2)}`,\n );\n\n if (!this.isReportingAllowed(this.workspaceMetadata)) {\n return;\n }\n\n // Resolve tenant domain for portal URL (if tenantId is available)\n if (this.workspaceMetadata.tenantId) {\n try {\n const tenants = await playwrightServiceApiClient.getTenants();\n this.tenantDomain = resolveTenantDomain(this.workspaceMetadata.tenantId, tenants);\n } catch (error) {\n coreLogger.error(`Failed to resolve tenant domain: ${error}`);\n }\n } else {\n coreLogger.info(\n \"Workspace metadata does not contain tenantId; skipping tenant domain resolution.\",\n );\n }\n\n this.isReportingEnabled = true;\n console.log(ServiceErrorMessageConstants.REPORTING_ENABLED.message);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(\n `${ServiceErrorMessageConstants.WORKSPACE_METADATA_FETCH_FAILED.message}Error: ${errorMessage} `,\n );\n }\n }\n\n /**\n * Called when test run ends. Uploads Playwright test report to Azure Storage if reporting is enabled.\n */\n\n async onEnd(): Promise<void> {\n if (this.isReportingEnabled) {\n console.log(ServiceErrorMessageConstants.COLLECTING_ARTIFACTS.message);\n const uploadResult = await this.uploadHtmlReport();\n\n if (uploadResult.success) {\n if (\n uploadResult.partialSuccess &&\n uploadResult.failedFileDetails &&\n uploadResult.failedFileDetails.length > 0\n ) {\n console.log(\"Warning: Failed to upload the following files:\");\n uploadResult.failedFileDetails.forEach((fileDetail) => {\n console.log(` - ${fileDetail.fileName}, ERROR: ${fileDetail.error}`);\n });\n console.log(ServiceErrorMessageConstants.REPORTING_STATUS_PARTIAL.message);\n } else {\n console.log(ServiceErrorMessageConstants.REPORTING_STATUS_SUCCESS.message);\n }\n // Display portal URL for both full and partial success\n if (this.workspaceMetadata) {\n const portalUrl = getPortalTestRunUrl(this.workspaceMetadata, this.tenantDomain);\n console.log(ServiceErrorMessageConstants.TEST_REPORT_VIEW_URL.formatWithUrl(portalUrl));\n }\n } else {\n console.error(ServiceErrorMessageConstants.REPORTING_STATUS_FAILED.message);\n if (uploadResult.errorMessage) {\n console.error(`Error: ${uploadResult.errorMessage}`);\n }\n }\n }\n }\n\n private async uploadHtmlReport(): Promise<UploadResult> {\n try {\n const outputFolder = getHtmlReporterOutputFolder(this.config);\n coreLogger.info(`Resolved Playwright test report output folder: ${outputFolder}`);\n const storageManager = new PlaywrightReporterStorageManager();\n coreLogger.info(\"Starting Playwright test report upload process\");\n const uploadResult = await storageManager.uploadPlaywrightHtmlReportAfterTests(\n outputFolder,\n this.workspaceMetadata,\n );\n\n if (uploadResult.success) {\n coreLogger.info(`Playwright Test report uploaded successfully to Azure Storage.`);\n }\n return uploadResult;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\n coreLogger.error(`Upload failed: ${errorMessage}`);\n return { success: false, errorMessage };\n }\n }\n\n private validateHtmlReporterConfiguration(config: FullConfig): boolean {\n if (!config.reporter || !Array.isArray(config.reporter)) {\n console.error(ServiceErrorMessageConstants.HTML_REPORTER_REQUIRED.message);\n return false;\n }\n\n const htmlReporterIndex = config.reporter.findIndex((reporter) => {\n const reporterName = typeof reporter === \"string\" ? reporter : reporter?.[0];\n return reporterName === \"html\";\n });\n\n const azureReporterIndex = config.reporter.findIndex((reporter) => {\n const reporterName = typeof reporter === \"string\" ? reporter : reporter?.[0];\n return (\n typeof reporterName === \"string\" &&\n reporterName.includes(\"playwright\") &&\n reporterName.includes(\"reporter\")\n );\n });\n\n // Validate HTML reporter exists\n if (htmlReporterIndex === -1) {\n console.error(ServiceErrorMessageConstants.HTML_REPORTER_REQUIRED.message);\n return false;\n }\n\n // Validate HTML reporter comes before Azure reporter (if Azure reporter exists)\n if (azureReporterIndex !== -1 && htmlReporterIndex > azureReporterIndex) {\n console.error(ServiceErrorMessageConstants.HTML_REPORTER_REQUIRED.message);\n return false;\n }\n\n coreLogger.info(\n \"HTML reporter validation passed - HTML reporter is configured and properly ordered\",\n );\n return true;\n }\n\n /**\n * Determines if reporting should be enabled based on workspace metadata.\n * @param workspaceMetadata - The workspace metadata containing reporting and storageUri information\n * @returns true if reporting should be enabled, false otherwise\n */\n private isReportingAllowed(workspaceMetadata: WorkspaceMetaData | null): boolean {\n if (!workspaceMetadata) {\n console.error(ServiceErrorMessageConstants.FAILED_TO_GET_WORKSPACE_METADATA.message);\n return false;\n }\n\n const { reporting, storageUri } = workspaceMetadata;\n\n // If reporting field is present in metadata, check its value\n if (reporting !== undefined) {\n const normalizedReporting =\n typeof reporting === \"string\" ? reporting.toLowerCase() : reporting;\n\n if (normalizedReporting === \"disabled\") {\n console.error(ServiceErrorMessageConstants.WORKSPACE_REPORTING_DISABLED.message);\n coreLogger.info(\"Reporting disabled via workspace metadata configuration\");\n return false;\n }\n\n if (normalizedReporting === \"enabled\") {\n if (!storageUri) {\n console.error(\n ServiceErrorMessageConstants.WORKSPACE_REPORTING_STORAGE_NOT_LINKED.message,\n );\n coreLogger.info(\"Reporting enabled in metadata but storage URI not configured\");\n return false;\n }\n coreLogger.info(\"Reporting enabled via workspace metadata configuration\");\n return true;\n }\n\n // If reporting has an unexpected value, log warning and fall back to storageUri check\n coreLogger.info(\n `Unexpected reporting value in workspace metadata: ${reporting}. Falling back to storage URI check.`,\n );\n }\n\n // Fallback to current logic: check only storageUri (when reporting field is not present or has unexpected value)\n if (!storageUri) {\n console.error(ServiceErrorMessageConstants.WORKSPACE_REPORTING_DISABLED.message);\n coreLogger.info(\"Storage URI not configured in workspace metadata\");\n return false;\n }\n\n coreLogger.info(\"Reporting enabled based on storage URI configuration\");\n return true;\n }\n}\n"]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["/mnt/vss/_work/1/s/sdk/loadtesting/playwright/src/reporter/playwrightReporter.ts"],
4
+ "sourcesContent": ["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport type { FullConfig, Reporter } from \"@playwright/test/reporter\";\nimport { PlaywrightReporterStorageManager } from \"../utils/playwrightReporterStorageManager.js\";\nimport {\n getHtmlReporterOutputFolder,\n getPortalTestRunUrl,\n getVersionInfo,\n resolveTenantDomain,\n} from \"../utils/utils.js\";\nimport { coreLogger } from \"../common/logger.js\";\nimport { PlaywrightServiceConfig } from \"../common/playwrightServiceConfig.js\";\nimport { ServiceAuth, InternalEnvironmentVariables } from \"../common/constants.js\";\nimport { ServiceErrorMessageConstants } from \"../common/messages.js\";\nimport { PlaywrightServiceClient } from \"../utils/PlaywrightServiceClient.js\";\nimport { getPlaywrightVersion } from \"../utils/getPlaywrightVersion.js\";\nimport type { WorkspaceMetaData, UploadResult } from \"../common/types.js\";\n\n/**\n * Azure Playwright Reporter - Uploads generated Playwright test report folder to Azure Storage.\n */\n\nexport default class PlaywrightReporter implements Reporter {\n private config: FullConfig | undefined;\n private workspaceMetadata: WorkspaceMetaData | null = null;\n private tenantDomain: string | undefined;\n private isReportingEnabled = false;\n\n /**\n * Called when test run begins. Stores configuration for later use and validates serviceAuthType and\n * retrieves workspace metadata.\n * @param config - Playwright test configuration\n */\n\n async onBegin(config: FullConfig): Promise<void> {\n coreLogger.info(`Reporter configuration: ${JSON.stringify(config.reporter, null, 2)}`);\n\n this.config = config;\n\n // Check Playwright version for reporting feature compatibility\n try {\n const playwrightVersion = getPlaywrightVersion();\n const playwrightVersionInfo = getVersionInfo(playwrightVersion);\n\n // Check if version is < 1.57\n const isReportingSupportedVersion =\n playwrightVersionInfo.major > 1 ||\n (playwrightVersionInfo.major === 1 && playwrightVersionInfo.minor >= 57);\n\n if (!isReportingSupportedVersion) {\n console.error(\n ServiceErrorMessageConstants.PLAYWRIGHT_VERSION_TOO_OLD_FOR_REPORTING.message,\n );\n this.isReportingEnabled = false;\n return;\n }\n } catch (error) {\n coreLogger.error(`Failed to get Playwright version: ${error}`);\n console.error(ServiceErrorMessageConstants.PLAYWRIGHT_VERSION_TOO_OLD_FOR_REPORTING.message);\n this.isReportingEnabled = false;\n return;\n }\n\n // Check if using service config\n const usingServiceConfig =\n process.env[InternalEnvironmentVariables.USING_SERVICE_CONFIG] === \"true\";\n coreLogger.info(`Using service config: ${usingServiceConfig}`);\n if (!usingServiceConfig) {\n console.error(ServiceErrorMessageConstants.REPORTER_REQUIRES_SERVICE_CONFIG.message);\n this.isReportingEnabled = false;\n return;\n }\n\n // Check if test run creation was successful\n const testRunCreationSuccess =\n process.env[InternalEnvironmentVariables.TEST_RUN_CREATION_SUCCESS] === \"true\";\n if (!testRunCreationSuccess) {\n console.error(ServiceErrorMessageConstants.REPORTING_STATUS_FAILED.message);\n console.error(ServiceErrorMessageConstants.REPORTING_TEST_RUN_FAILED.message);\n this.isReportingEnabled = false;\n return;\n }\n\n // Check authentication\n const playwrightServiceConfig = PlaywrightServiceConfig.instance;\n coreLogger.info(`Current authentication type: ${playwrightServiceConfig.serviceAuthType}`);\n const isUsingAccessToken = playwrightServiceConfig.serviceAuthType === ServiceAuth.ACCESS_TOKEN;\n if (isUsingAccessToken) {\n console.error(ServiceErrorMessageConstants.REPORTER_REQUIRES_ENTRA_AUTH.message);\n this.isReportingEnabled = false;\n return;\n }\n coreLogger.info(\"Authentication validation passed - using ENTRA_ID\");\n\n // Validate HTML reporter configuration\n if (!this.validateHtmlReporterConfiguration(config)) {\n return;\n }\n\n // Get workspace metadata for later use\n try {\n const playwrightServiceApiClient = new PlaywrightServiceClient();\n this.workspaceMetadata = await playwrightServiceApiClient.getWorkspaceMetadata();\n coreLogger.info(\n `Received workspace details: ${JSON.stringify(this.workspaceMetadata, null, 2)}`,\n );\n\n if (!this.isReportingAllowed(this.workspaceMetadata)) {\n return;\n }\n\n // Resolve tenant domain for portal URL (if tenantId is available)\n if (this.workspaceMetadata.tenantId) {\n try {\n const tenants = await playwrightServiceApiClient.getTenants();\n this.tenantDomain = resolveTenantDomain(this.workspaceMetadata.tenantId, tenants);\n } catch (error) {\n coreLogger.error(`Failed to resolve tenant domain: ${error}`);\n }\n } else {\n coreLogger.info(\n \"Workspace metadata does not contain tenantId; skipping tenant domain resolution.\",\n );\n }\n\n this.isReportingEnabled = true;\n console.log(ServiceErrorMessageConstants.REPORTING_ENABLED.message);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(\n `${ServiceErrorMessageConstants.WORKSPACE_METADATA_FETCH_FAILED.message}Error: ${errorMessage} `,\n );\n }\n }\n\n /**\n * Called when test run ends. Uploads Playwright test report to Azure Storage if reporting is enabled.\n */\n\n async onEnd(): Promise<void> {\n if (this.isReportingEnabled) {\n console.log(ServiceErrorMessageConstants.COLLECTING_ARTIFACTS.message);\n const uploadResult = await this.uploadHtmlReport();\n\n if (uploadResult.success) {\n if (\n uploadResult.partialSuccess &&\n uploadResult.failedFileDetails &&\n uploadResult.failedFileDetails.length > 0\n ) {\n console.log(\"Warning: Failed to upload the following files:\");\n uploadResult.failedFileDetails.forEach((fileDetail) => {\n console.log(` - ${fileDetail.fileName}, ERROR: ${fileDetail.error}`);\n });\n console.log(ServiceErrorMessageConstants.REPORTING_STATUS_PARTIAL.message);\n } else {\n console.log(ServiceErrorMessageConstants.REPORTING_STATUS_SUCCESS.message);\n }\n // Display portal URL for both full and partial success\n if (this.workspaceMetadata) {\n const portalUrl = getPortalTestRunUrl(this.workspaceMetadata, this.tenantDomain);\n console.log(ServiceErrorMessageConstants.TEST_REPORT_VIEW_URL.formatWithUrl(portalUrl));\n }\n } else {\n console.error(ServiceErrorMessageConstants.REPORTING_STATUS_FAILED.message);\n if (uploadResult.errorMessage) {\n console.error(`Error: ${uploadResult.errorMessage}`);\n }\n }\n }\n }\n\n private async uploadHtmlReport(): Promise<UploadResult> {\n try {\n const outputFolder = getHtmlReporterOutputFolder(this.config);\n coreLogger.info(`Resolved Playwright test report output folder: ${outputFolder}`);\n const storageManager = new PlaywrightReporterStorageManager();\n coreLogger.info(\"Starting Playwright test report upload process\");\n const uploadResult = await storageManager.uploadPlaywrightHtmlReportAfterTests(\n outputFolder,\n this.workspaceMetadata,\n );\n\n if (uploadResult.success) {\n coreLogger.info(`Playwright Test report uploaded successfully to Azure Storage.`);\n }\n return uploadResult;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\n coreLogger.error(`Upload failed: ${errorMessage}`);\n return { success: false, errorMessage };\n }\n }\n\n private validateHtmlReporterConfiguration(config: FullConfig): boolean {\n if (!config.reporter || !Array.isArray(config.reporter)) {\n console.error(ServiceErrorMessageConstants.HTML_REPORTER_REQUIRED.message);\n return false;\n }\n\n const htmlReporterIndex = config.reporter.findIndex((reporter) => {\n const reporterName = typeof reporter === \"string\" ? reporter : reporter?.[0];\n return reporterName === \"html\";\n });\n\n const azureReporterIndex = config.reporter.findIndex((reporter) => {\n const reporterName = typeof reporter === \"string\" ? reporter : reporter?.[0];\n return (\n typeof reporterName === \"string\" &&\n reporterName.includes(\"playwright\") &&\n reporterName.includes(\"reporter\")\n );\n });\n\n // Validate HTML reporter exists\n if (htmlReporterIndex === -1) {\n console.error(ServiceErrorMessageConstants.HTML_REPORTER_REQUIRED.message);\n return false;\n }\n\n // Validate HTML reporter comes before Azure reporter (if Azure reporter exists)\n if (azureReporterIndex !== -1 && htmlReporterIndex > azureReporterIndex) {\n console.error(ServiceErrorMessageConstants.HTML_REPORTER_REQUIRED.message);\n return false;\n }\n\n coreLogger.info(\n \"HTML reporter validation passed - HTML reporter is configured and properly ordered\",\n );\n return true;\n }\n\n /**\n * Determines if reporting should be enabled based on workspace metadata.\n * @param workspaceMetadata - The workspace metadata containing reporting and storageUri information\n * @returns true if reporting should be enabled, false otherwise\n */\n private isReportingAllowed(workspaceMetadata: WorkspaceMetaData | null): boolean {\n if (!workspaceMetadata) {\n console.error(ServiceErrorMessageConstants.FAILED_TO_GET_WORKSPACE_METADATA.message);\n return false;\n }\n\n const { reporting, storageUri } = workspaceMetadata;\n\n // If reporting field is present in metadata, check its value\n if (reporting !== undefined) {\n const normalizedReporting =\n typeof reporting === \"string\" ? reporting.toLowerCase() : reporting;\n\n if (normalizedReporting === \"disabled\") {\n console.error(ServiceErrorMessageConstants.WORKSPACE_REPORTING_DISABLED.message);\n coreLogger.info(\"Reporting disabled via workspace metadata configuration\");\n return false;\n }\n\n if (normalizedReporting === \"enabled\") {\n if (!storageUri) {\n console.error(\n ServiceErrorMessageConstants.WORKSPACE_REPORTING_STORAGE_NOT_LINKED.message,\n );\n coreLogger.info(\"Reporting enabled in metadata but storage URI not configured\");\n return false;\n }\n coreLogger.info(\"Reporting enabled via workspace metadata configuration\");\n return true;\n }\n\n // If reporting has an unexpected value, log warning and fall back to storageUri check\n coreLogger.info(\n `Unexpected reporting value in workspace metadata: ${reporting}. Falling back to storage URI check.`,\n );\n }\n\n // Fallback to current logic: check only storageUri (when reporting field is not present or has unexpected value)\n if (!storageUri) {\n console.error(ServiceErrorMessageConstants.WORKSPACE_REPORTING_DISABLED.message);\n coreLogger.info(\"Storage URI not configured in workspace metadata\");\n return false;\n }\n\n coreLogger.info(\"Reporting enabled based on storage URI configuration\");\n return true;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,5 +1,5 @@
1
1
  import { HttpService } from "../common/httpService.js";
2
- import { TestRunCreatePayload, WorkspaceMetaData, TenantInfo } from "../common/types.js";
2
+ import type { TestRunCreatePayload, WorkspaceMetaData, TenantInfo } from "../common/types.js";
3
3
  export declare class PlaywrightServiceClient {
4
4
  private httpService;
5
5
  constructor(httpService?: HttpService);
@@ -1 +1 @@
1
- {"version":3,"file":"PlaywrightServiceClient.d.ts","sourceRoot":"","sources":["../../../src/utils/PlaywrightServiceClient.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGzF,qBAAa,uBAAuB;IAClC,OAAO,CAAC,WAAW,CAAc;gBAErB,WAAW,CAAC,EAAE,WAAW;IAI/B,qBAAqB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IA8CnE,oBAAoB,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAuClD,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;CAkC1C"}
1
+ {"version":3,"file":"PlaywrightServiceClient.d.ts","sourceRoot":"","sources":["../../../src/utils/PlaywrightServiceClient.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAG9F,qBAAa,uBAAuB;IAClC,OAAO,CAAC,WAAW,CAAc;gBAErB,WAAW,CAAC,EAAE,WAAW;IAI/B,qBAAqB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IA8CnE,oBAAoB,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAuClD,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;CAkC1C"}