@azure/playwright 1.0.1-alpha.20251225.1 → 1.0.1-alpha.20251231.2
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.d.ts +1 -0
- package/dist/browser/common/constants.d.ts.map +1 -1
- package/dist/browser/common/constants.js +1 -0
- package/dist/browser/common/constants.js.map +1 -1
- package/dist/browser/common/messages.d.ts +60 -9
- package/dist/browser/common/messages.d.ts.map +1 -1
- package/dist/browser/common/messages.js +74 -23
- package/dist/browser/common/messages.js.map +1 -1
- package/dist/browser/common/types.d.ts +12 -0
- package/dist/browser/common/types.d.ts.map +1 -1
- package/dist/browser/common/types.js.map +1 -1
- package/dist/browser/core/initializePlaywrightServiceTestRun.d.ts.map +1 -1
- package/dist/browser/core/initializePlaywrightServiceTestRun.js +4 -5
- package/dist/browser/core/initializePlaywrightServiceTestRun.js.map +1 -1
- package/dist/browser/reporter/playwrightReporter.d.ts +2 -1
- package/dist/browser/reporter/playwrightReporter.d.ts.map +1 -1
- package/dist/browser/reporter/playwrightReporter.js +99 -34
- package/dist/browser/reporter/playwrightReporter.js.map +1 -1
- package/dist/browser/utils/PlaywrightServiceClient.d.ts +9 -0
- package/dist/browser/utils/PlaywrightServiceClient.d.ts.map +1 -0
- package/dist/browser/utils/PlaywrightServiceClient.js +67 -0
- package/dist/browser/utils/PlaywrightServiceClient.js.map +1 -0
- package/dist/browser/utils/playwrightReporterStorageManager.d.ts +4 -5
- package/dist/browser/utils/playwrightReporterStorageManager.d.ts.map +1 -1
- package/dist/browser/utils/playwrightReporterStorageManager.js +155 -97
- package/dist/browser/utils/playwrightReporterStorageManager.js.map +1 -1
- package/dist/browser/utils/utils.d.ts +1 -0
- package/dist/browser/utils/utils.d.ts.map +1 -1
- package/dist/browser/utils/utils.js +19 -0
- package/dist/browser/utils/utils.js.map +1 -1
- package/dist/commonjs/common/constants.d.ts +1 -0
- package/dist/commonjs/common/constants.d.ts.map +1 -1
- package/dist/commonjs/common/constants.js +1 -0
- package/dist/commonjs/common/constants.js.map +1 -1
- package/dist/commonjs/common/messages.d.ts +60 -9
- package/dist/commonjs/common/messages.d.ts.map +1 -1
- package/dist/commonjs/common/messages.js +74 -23
- package/dist/commonjs/common/messages.js.map +1 -1
- package/dist/commonjs/common/types.d.ts +12 -0
- package/dist/commonjs/common/types.d.ts.map +1 -1
- package/dist/commonjs/common/types.js.map +1 -1
- package/dist/commonjs/core/initializePlaywrightServiceTestRun.d.ts.map +1 -1
- package/dist/commonjs/core/initializePlaywrightServiceTestRun.js +4 -5
- package/dist/commonjs/core/initializePlaywrightServiceTestRun.js.map +1 -1
- package/dist/commonjs/reporter/playwrightReporter.d.ts +2 -1
- package/dist/commonjs/reporter/playwrightReporter.d.ts.map +1 -1
- package/dist/commonjs/reporter/playwrightReporter.js +97 -32
- package/dist/commonjs/reporter/playwrightReporter.js.map +1 -1
- package/dist/commonjs/utils/PlaywrightServiceClient.d.ts +9 -0
- package/dist/commonjs/utils/PlaywrightServiceClient.d.ts.map +1 -0
- package/dist/commonjs/utils/PlaywrightServiceClient.js +71 -0
- package/dist/commonjs/utils/PlaywrightServiceClient.js.map +1 -0
- package/dist/commonjs/utils/playwrightReporterStorageManager.d.ts +4 -5
- package/dist/commonjs/utils/playwrightReporterStorageManager.d.ts.map +1 -1
- package/dist/commonjs/utils/playwrightReporterStorageManager.js +153 -95
- package/dist/commonjs/utils/playwrightReporterStorageManager.js.map +1 -1
- package/dist/commonjs/utils/utils.d.ts +1 -0
- package/dist/commonjs/utils/utils.d.ts.map +1 -1
- package/dist/commonjs/utils/utils.js +21 -1
- package/dist/commonjs/utils/utils.js.map +1 -1
- package/dist/esm/common/constants.d.ts +1 -0
- package/dist/esm/common/constants.d.ts.map +1 -1
- package/dist/esm/common/constants.js +1 -0
- package/dist/esm/common/constants.js.map +1 -1
- package/dist/esm/common/messages.d.ts +60 -9
- package/dist/esm/common/messages.d.ts.map +1 -1
- package/dist/esm/common/messages.js +74 -23
- package/dist/esm/common/messages.js.map +1 -1
- package/dist/esm/common/types.d.ts +12 -0
- package/dist/esm/common/types.d.ts.map +1 -1
- package/dist/esm/common/types.js.map +1 -1
- package/dist/esm/core/initializePlaywrightServiceTestRun.d.ts.map +1 -1
- package/dist/esm/core/initializePlaywrightServiceTestRun.js +4 -5
- package/dist/esm/core/initializePlaywrightServiceTestRun.js.map +1 -1
- package/dist/esm/reporter/playwrightReporter.d.ts +2 -1
- package/dist/esm/reporter/playwrightReporter.d.ts.map +1 -1
- package/dist/esm/reporter/playwrightReporter.js +99 -34
- package/dist/esm/reporter/playwrightReporter.js.map +1 -1
- package/dist/esm/utils/PlaywrightServiceClient.d.ts +9 -0
- package/dist/esm/utils/PlaywrightServiceClient.d.ts.map +1 -0
- package/dist/esm/utils/PlaywrightServiceClient.js +67 -0
- package/dist/esm/utils/PlaywrightServiceClient.js.map +1 -0
- package/dist/esm/utils/playwrightReporterStorageManager.d.ts +4 -5
- package/dist/esm/utils/playwrightReporterStorageManager.d.ts.map +1 -1
- package/dist/esm/utils/playwrightReporterStorageManager.js +155 -97
- package/dist/esm/utils/playwrightReporterStorageManager.js.map +1 -1
- package/dist/esm/utils/utils.d.ts +1 -0
- package/dist/esm/utils/utils.d.ts.map +1 -1
- package/dist/esm/utils/utils.js +19 -0
- package/dist/esm/utils/utils.js.map +1 -1
- package/dist/react-native/common/constants.d.ts +1 -0
- package/dist/react-native/common/constants.d.ts.map +1 -1
- package/dist/react-native/common/constants.js +1 -0
- package/dist/react-native/common/constants.js.map +1 -1
- package/dist/react-native/common/messages.d.ts +60 -9
- package/dist/react-native/common/messages.d.ts.map +1 -1
- package/dist/react-native/common/messages.js +74 -23
- package/dist/react-native/common/messages.js.map +1 -1
- package/dist/react-native/common/types.d.ts +12 -0
- package/dist/react-native/common/types.d.ts.map +1 -1
- package/dist/react-native/common/types.js.map +1 -1
- package/dist/react-native/core/initializePlaywrightServiceTestRun.d.ts.map +1 -1
- package/dist/react-native/core/initializePlaywrightServiceTestRun.js +4 -5
- package/dist/react-native/core/initializePlaywrightServiceTestRun.js.map +1 -1
- package/dist/react-native/reporter/playwrightReporter.d.ts +2 -1
- package/dist/react-native/reporter/playwrightReporter.d.ts.map +1 -1
- package/dist/react-native/reporter/playwrightReporter.js +99 -34
- package/dist/react-native/reporter/playwrightReporter.js.map +1 -1
- package/dist/react-native/utils/PlaywrightServiceClient.d.ts +9 -0
- package/dist/react-native/utils/PlaywrightServiceClient.d.ts.map +1 -0
- package/dist/react-native/utils/PlaywrightServiceClient.js +67 -0
- package/dist/react-native/utils/PlaywrightServiceClient.js.map +1 -0
- package/dist/react-native/utils/playwrightReporterStorageManager.d.ts +4 -5
- package/dist/react-native/utils/playwrightReporterStorageManager.d.ts.map +1 -1
- package/dist/react-native/utils/playwrightReporterStorageManager.js +155 -97
- package/dist/react-native/utils/playwrightReporterStorageManager.js.map +1 -1
- package/dist/react-native/utils/utils.d.ts +1 -0
- package/dist/react-native/utils/utils.d.ts.map +1 -1
- package/dist/react-native/utils/utils.js +19 -0
- package/dist/react-native/utils/utils.js.map +1 -1
- package/package.json +1 -1
- package/dist/browser/utils/playwrightServiceApicall.d.ts +0 -16
- package/dist/browser/utils/playwrightServiceApicall.d.ts.map +0 -1
- package/dist/browser/utils/playwrightServiceApicall.js +0 -57
- package/dist/browser/utils/playwrightServiceApicall.js.map +0 -1
- package/dist/commonjs/utils/playwrightServiceApicall.d.ts +0 -16
- package/dist/commonjs/utils/playwrightServiceApicall.d.ts.map +0 -1
- package/dist/commonjs/utils/playwrightServiceApicall.js +0 -61
- package/dist/commonjs/utils/playwrightServiceApicall.js.map +0 -1
- package/dist/esm/utils/playwrightServiceApicall.d.ts +0 -16
- package/dist/esm/utils/playwrightServiceApicall.d.ts.map +0 -1
- package/dist/esm/utils/playwrightServiceApicall.js +0 -57
- package/dist/esm/utils/playwrightServiceApicall.js.map +0 -1
- package/dist/react-native/utils/playwrightServiceApicall.d.ts +0 -16
- package/dist/react-native/utils/playwrightServiceApicall.d.ts.map +0 -1
- package/dist/react-native/utils/playwrightServiceApicall.js +0 -57
- package/dist/react-native/utils/playwrightServiceApicall.js.map +0 -1
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import { PlaywrightReporterStorageManager } from "../utils/playwrightReporterStorageManager.js";
|
|
2
|
-
import { getHtmlReporterOutputFolder, getPortalTestRunUrl
|
|
2
|
+
import { getHtmlReporterOutputFolder, getPortalTestRunUrl } from "../utils/utils.js";
|
|
3
3
|
import { coreLogger } from "../common/logger.js";
|
|
4
4
|
import { PlaywrightServiceConfig } from "../common/playwrightServiceConfig.js";
|
|
5
|
-
import { ServiceAuth } from "../common/constants.js";
|
|
5
|
+
import { ServiceAuth, InternalEnvironmentVariables } from "../common/constants.js";
|
|
6
6
|
import { ServiceErrorMessageConstants } from "../common/messages.js";
|
|
7
|
-
import {
|
|
7
|
+
import { PlaywrightServiceClient } from "../utils/PlaywrightServiceClient.js";
|
|
8
8
|
/**
|
|
9
9
|
* Azure Playwright Reporter - Uploads generated Playwright test report folder to Azure Storage.
|
|
10
10
|
*/
|
|
11
11
|
export default class PlaywrightReporter {
|
|
12
12
|
config;
|
|
13
13
|
workspaceMetadata = null;
|
|
14
|
+
isReportingEnabled = false;
|
|
14
15
|
/**
|
|
15
16
|
* Called when test run begins. Stores configuration for later use and validates serviceAuthType and
|
|
16
17
|
* retrieves workspace metadata.
|
|
@@ -18,34 +19,87 @@ export default class PlaywrightReporter {
|
|
|
18
19
|
*/
|
|
19
20
|
async onBegin(config) {
|
|
20
21
|
coreLogger.info(`Reporter configuration: ${JSON.stringify(config.reporter, null, 2)}`);
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
this.config = config;
|
|
23
|
+
// Check if using service config
|
|
24
|
+
const usingServiceConfig = process.env[InternalEnvironmentVariables.USING_SERVICE_CONFIG] === "true";
|
|
25
|
+
coreLogger.info(`Using service config: ${usingServiceConfig}`);
|
|
26
|
+
if (!usingServiceConfig) {
|
|
27
|
+
console.error(ServiceErrorMessageConstants.REPORTER_REQUIRES_SERVICE_CONFIG.message);
|
|
28
|
+
this.isReportingEnabled = false;
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// Check if test run creation was successful
|
|
32
|
+
const testRunCreationSuccess = process.env[InternalEnvironmentVariables.TEST_RUN_CREATION_SUCCESS] === "true";
|
|
33
|
+
if (!testRunCreationSuccess) {
|
|
34
|
+
console.error(ServiceErrorMessageConstants.REPORTING_STATUS_FAILED.message);
|
|
35
|
+
console.error(ServiceErrorMessageConstants.REPORTING_TEST_RUN_FAILED.message);
|
|
36
|
+
this.isReportingEnabled = false;
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// Check authentication
|
|
24
40
|
const playwrightServiceConfig = PlaywrightServiceConfig.instance;
|
|
25
41
|
coreLogger.info(`Current authentication type: ${playwrightServiceConfig.serviceAuthType}`);
|
|
26
42
|
const isUsingAccessToken = playwrightServiceConfig.serviceAuthType === ServiceAuth.ACCESS_TOKEN;
|
|
27
43
|
if (isUsingAccessToken) {
|
|
28
|
-
|
|
44
|
+
console.error(ServiceErrorMessageConstants.REPORTER_REQUIRES_ENTRA_AUTH.message);
|
|
45
|
+
this.isReportingEnabled = false;
|
|
46
|
+
return;
|
|
29
47
|
}
|
|
30
48
|
coreLogger.info("Authentication validation passed - using ENTRA_ID");
|
|
31
|
-
this.config = config;
|
|
32
49
|
// Get workspace metadata for later use
|
|
33
50
|
try {
|
|
34
|
-
const playwrightServiceApiClient = new
|
|
51
|
+
const playwrightServiceApiClient = new PlaywrightServiceClient();
|
|
35
52
|
this.workspaceMetadata = await playwrightServiceApiClient.getWorkspaceMetadata();
|
|
36
|
-
|
|
53
|
+
if (!this.workspaceMetadata?.storageUri) {
|
|
54
|
+
console.error(ServiceErrorMessageConstants.WORKSPACE_REPORTING_DISABLED.message);
|
|
55
|
+
this.isReportingEnabled = false;
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
this.isReportingEnabled = true;
|
|
59
|
+
this.validateHtmlReporterConfiguration(config);
|
|
60
|
+
if (this.isReportingEnabled) {
|
|
61
|
+
console.log(ServiceErrorMessageConstants.REPORTING_ENABLED.message);
|
|
62
|
+
}
|
|
37
63
|
}
|
|
38
64
|
catch (error) {
|
|
39
|
-
|
|
40
|
-
|
|
65
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
66
|
+
console.error(`${ServiceErrorMessageConstants.WORKSPACE_METADATA_FETCH_FAILED.message}Error: ${errorMessage} `);
|
|
67
|
+
this.isReportingEnabled = false;
|
|
41
68
|
}
|
|
42
69
|
}
|
|
43
70
|
/**
|
|
44
|
-
* Called when test run ends. Uploads Playwright test report to Azure Storage.
|
|
71
|
+
* Called when test run ends. Uploads Playwright test report to Azure Storage if reporting is enabled.
|
|
45
72
|
*/
|
|
46
73
|
async onEnd() {
|
|
47
|
-
|
|
48
|
-
|
|
74
|
+
if (this.isReportingEnabled) {
|
|
75
|
+
console.log(ServiceErrorMessageConstants.COLLECTING_ARTIFACTS.message);
|
|
76
|
+
const uploadResult = await this.uploadHtmlReport();
|
|
77
|
+
if (uploadResult.success) {
|
|
78
|
+
if (uploadResult.partialSuccess &&
|
|
79
|
+
uploadResult.failedFileDetails &&
|
|
80
|
+
uploadResult.failedFileDetails.length > 0) {
|
|
81
|
+
console.log("Warning: Failed to upload the following files:");
|
|
82
|
+
uploadResult.failedFileDetails.forEach((fileDetail) => {
|
|
83
|
+
console.log(` - ${fileDetail.fileName}, ERROR: ${fileDetail.error}`);
|
|
84
|
+
});
|
|
85
|
+
console.log(ServiceErrorMessageConstants.REPORTING_STATUS_PARTIAL.message);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
console.log(ServiceErrorMessageConstants.REPORTING_STATUS_SUCCESS.message);
|
|
89
|
+
}
|
|
90
|
+
// Display portal URL for both full and partial success
|
|
91
|
+
if (this.workspaceMetadata) {
|
|
92
|
+
const portalUrl = getPortalTestRunUrl(this.workspaceMetadata);
|
|
93
|
+
console.log(ServiceErrorMessageConstants.TEST_REPORT_VIEW_URL.formatWithUrl(portalUrl));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
console.error(ServiceErrorMessageConstants.REPORTING_STATUS_FAILED.message);
|
|
98
|
+
if (uploadResult.errorMessage) {
|
|
99
|
+
console.error(`Error: ${uploadResult.errorMessage}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
49
103
|
}
|
|
50
104
|
async uploadHtmlReport() {
|
|
51
105
|
try {
|
|
@@ -53,36 +107,47 @@ export default class PlaywrightReporter {
|
|
|
53
107
|
coreLogger.info(`Resolved Playwright test report output folder: ${outputFolder}`);
|
|
54
108
|
const storageManager = new PlaywrightReporterStorageManager();
|
|
55
109
|
coreLogger.info("Starting Playwright test report upload process");
|
|
56
|
-
await storageManager.uploadPlaywrightHtmlReportAfterTests(outputFolder, this.workspaceMetadata);
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
if (this.workspaceMetadata) {
|
|
60
|
-
const portalUrl = getPortalTestRunUrl(this.workspaceMetadata);
|
|
61
|
-
process.stdout.write(`You can view test report at: ${portalUrl}\n`);
|
|
110
|
+
const uploadResult = await storageManager.uploadPlaywrightHtmlReportAfterTests(outputFolder, this.workspaceMetadata);
|
|
111
|
+
if (uploadResult.success) {
|
|
112
|
+
coreLogger.info(`Playwright Test report uploaded successfully to Azure Storage.`);
|
|
62
113
|
}
|
|
114
|
+
return uploadResult;
|
|
63
115
|
}
|
|
64
116
|
catch (error) {
|
|
65
117
|
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
66
|
-
|
|
118
|
+
coreLogger.error(`Upload failed: ${errorMessage}`);
|
|
119
|
+
return { success: false, errorMessage };
|
|
67
120
|
}
|
|
68
121
|
}
|
|
69
122
|
validateHtmlReporterConfiguration(config) {
|
|
70
123
|
if (!config.reporter || !Array.isArray(config.reporter)) {
|
|
71
|
-
|
|
124
|
+
console.error(ServiceErrorMessageConstants.HTML_REPORTER_REQUIRED.message);
|
|
125
|
+
this.isReportingEnabled = false;
|
|
126
|
+
return;
|
|
72
127
|
}
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
128
|
+
const htmlReporterIndex = config.reporter.findIndex((reporter) => {
|
|
129
|
+
const reporterName = typeof reporter === "string" ? reporter : reporter?.[0];
|
|
130
|
+
return reporterName === "html";
|
|
131
|
+
});
|
|
132
|
+
const azureReporterIndex = config.reporter.findIndex((reporter) => {
|
|
133
|
+
const reporterName = typeof reporter === "string" ? reporter : reporter?.[0];
|
|
134
|
+
return (typeof reporterName === "string" &&
|
|
135
|
+
reporterName.includes("playwright") &&
|
|
136
|
+
reporterName.includes("reporter"));
|
|
81
137
|
});
|
|
82
|
-
|
|
83
|
-
|
|
138
|
+
// Validate HTML reporter exists
|
|
139
|
+
if (htmlReporterIndex === -1) {
|
|
140
|
+
console.error(ServiceErrorMessageConstants.HTML_REPORTER_REQUIRED.message);
|
|
141
|
+
this.isReportingEnabled = false;
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
// Validate HTML reporter comes before Azure reporter (if Azure reporter exists)
|
|
145
|
+
if (azureReporterIndex !== -1 && htmlReporterIndex > azureReporterIndex) {
|
|
146
|
+
console.error(ServiceErrorMessageConstants.HTML_REPORTER_REQUIRED.message);
|
|
147
|
+
this.isReportingEnabled = false;
|
|
148
|
+
return;
|
|
84
149
|
}
|
|
85
|
-
coreLogger.info("HTML reporter validation passed - HTML reporter is configured");
|
|
150
|
+
coreLogger.info("HTML reporter validation passed - HTML reporter is configured and properly ordered");
|
|
86
151
|
}
|
|
87
152
|
}
|
|
88
153
|
//# sourceMappingURL=playwrightReporter.js.map
|
|
@@ -1 +1 @@
|
|
|
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 exitWithFailureMessage,\n} from \"../utils/utils.js\";\nimport { coreLogger } from \"../common/logger.js\";\nimport { PlaywrightServiceConfig } from \"../common/playwrightServiceConfig.js\";\nimport { ServiceAuth } from \"../common/constants.js\";\nimport { ServiceErrorMessageConstants } from \"../common/messages.js\";\nimport { PlaywrightServiceApiCall } from \"../utils/playwrightServiceApicall.js\";\nimport type { WorkspaceMetaData } 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\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 // Validate that HTML reporter is configured\n this.validateHtmlReporterConfiguration(config);\n\n // Validate that reporter is used only with ENTRA_ID 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 exitWithFailureMessage(ServiceErrorMessageConstants.REPORTER_REQUIRES_ENTRA_AUTH);\n }\n coreLogger.info(\"Authentication validation passed - using ENTRA_ID\");\n this.config = config;\n // Get workspace metadata for later use\n try {\n const playwrightServiceApiClient = new PlaywrightServiceApiCall();\n this.workspaceMetadata = await playwrightServiceApiClient.getWorkspaceMetadata();\n process.stdout.write(\"Initializing reporting for this test run.\\n\");\n } catch (error) {\n coreLogger.error(\n `Failed to get workspace metadata: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n process.stderr.write(\"Failed to initialize reporting for this test run.\\n\");\n }\n }\n\n /**\n * Called when test run ends. Uploads Playwright test report to Azure Storage.\n */\n\n async onEnd(): Promise<void> {\n process.stdout.write(`Uploading Playwright Test report in Azure storage account.\\n`);\n await this.uploadHtmlReport();\n }\n\n private async uploadHtmlReport(): Promise<void> {\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 await storageManager.uploadPlaywrightHtmlReportAfterTests(\n outputFolder,\n this.workspaceMetadata,\n );\n coreLogger.info(`✅ Playwright Test report uploaded successfully to Azure Storage.`);\n\n // Display portal URL for test report\n if (this.workspaceMetadata) {\n const portalUrl = getPortalTestRunUrl(this.workspaceMetadata);\n process.stdout.write(`You can view test report at: ${portalUrl}\\n`);\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\n process.stderr.write(`❌ Failed to upload Playwright test report: ${errorMessage}\\n`);\n }\n }\n\n private validateHtmlReporterConfiguration(config: FullConfig): void {\n if (!config.reporter || !Array.isArray(config.reporter)) {\n throw new Error(ServiceErrorMessageConstants.HTML_REPORTER_REQUIRED.message);\n }\n\n const hasHtmlReporter = config.reporter.some((reporter) => {\n if (typeof reporter === \"string\") {\n return reporter === \"html\";\n }\n if (Array.isArray(reporter) && reporter.length > 0) {\n return reporter[0] === \"html\";\n }\n return false;\n });\n\n if (!hasHtmlReporter) {\n exitWithFailureMessage(ServiceErrorMessageConstants.HTML_REPORTER_REQUIRED);\n }\n\n coreLogger.info(\"HTML reporter validation passed - HTML reporter is configured\");\n }\n}\n"]}
|
|
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 { getHtmlReporterOutputFolder, getPortalTestRunUrl } 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 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 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 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 // Get workspace metadata for later use\n try {\n const playwrightServiceApiClient = new PlaywrightServiceClient();\n this.workspaceMetadata = await playwrightServiceApiClient.getWorkspaceMetadata();\n\n if (!this.workspaceMetadata?.storageUri) {\n console.error(ServiceErrorMessageConstants.WORKSPACE_REPORTING_DISABLED.message);\n this.isReportingEnabled = false;\n return;\n }\n\n this.isReportingEnabled = true;\n\n this.validateHtmlReporterConfiguration(config);\n if (this.isReportingEnabled) {\n console.log(ServiceErrorMessageConstants.REPORTING_ENABLED.message);\n }\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 this.isReportingEnabled = false;\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);\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): void {\n if (!config.reporter || !Array.isArray(config.reporter)) {\n console.error(ServiceErrorMessageConstants.HTML_REPORTER_REQUIRED.message);\n this.isReportingEnabled = false;\n return;\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 this.isReportingEnabled = false;\n return;\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 this.isReportingEnabled = false;\n return;\n }\n\n coreLogger.info(\n \"HTML reporter validation passed - HTML reporter is configured and properly ordered\",\n );\n }\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { HttpService } from "../common/httpService.js";
|
|
2
|
+
import { TestRunCreatePayload, WorkspaceMetaData } from "../common/types.js";
|
|
3
|
+
export declare class PlaywrightServiceClient {
|
|
4
|
+
private httpService;
|
|
5
|
+
constructor(httpService?: HttpService);
|
|
6
|
+
createOrUpdateTestRun(payload: TestRunCreatePayload): Promise<void>;
|
|
7
|
+
getWorkspaceMetadata(): Promise<WorkspaceMetaData>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=PlaywrightServiceClient.d.ts.map
|
|
@@ -0,0 +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,MAAM,oBAAoB,CAAC;AAG7E,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;CAsCzD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation.
|
|
2
|
+
// Licensed under the MIT License.
|
|
3
|
+
import { getTestRunApiUrl, getAccessToken, extractErrorMessage, getWorkspaceMetaDataApiUrl, } from "./utils.js";
|
|
4
|
+
import { ServiceErrorMessageConstants } from "../common/messages.js";
|
|
5
|
+
import { HttpService } from "../common/httpService.js";
|
|
6
|
+
import { Constants, InternalEnvironmentVariables } from "../common/constants.js";
|
|
7
|
+
export class PlaywrightServiceClient {
|
|
8
|
+
httpService;
|
|
9
|
+
constructor(httpService) {
|
|
10
|
+
this.httpService = httpService ?? new HttpService();
|
|
11
|
+
}
|
|
12
|
+
async createOrUpdateTestRun(payload) {
|
|
13
|
+
try {
|
|
14
|
+
const baseUrl = getTestRunApiUrl();
|
|
15
|
+
const token = getAccessToken();
|
|
16
|
+
if (!token) {
|
|
17
|
+
throw new Error("PLAYWRIGHT_SERVICE_ACCESS_TOKEN environment variable is not set.");
|
|
18
|
+
}
|
|
19
|
+
const url = new URL(baseUrl);
|
|
20
|
+
url.searchParams.set("api-version", Constants.LatestAPIVersion);
|
|
21
|
+
const method = "PATCH";
|
|
22
|
+
const data = JSON.stringify(payload);
|
|
23
|
+
const contentType = "application/merge-patch+json";
|
|
24
|
+
const correlationId = crypto.randomUUID();
|
|
25
|
+
const response = await this.httpService.callAPI(method, url.toString(), data, token, contentType, correlationId);
|
|
26
|
+
if (response.status !== 200) {
|
|
27
|
+
const errorMessage = extractErrorMessage(response?.bodyAsText ?? "");
|
|
28
|
+
process.env[InternalEnvironmentVariables.TEST_RUN_CREATION_SUCCESS] = "false";
|
|
29
|
+
console.error(ServiceErrorMessageConstants.TEST_RUN_CREATION_FAILED.formatWithErrorDetails(errorMessage || "Unknown error"));
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
console.log("Test run created successfully.");
|
|
33
|
+
process.env[InternalEnvironmentVariables.TEST_RUN_CREATION_SUCCESS] = "true";
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error occurred during test run creation";
|
|
37
|
+
process.env[InternalEnvironmentVariables.TEST_RUN_CREATION_SUCCESS] = "false";
|
|
38
|
+
console.error(ServiceErrorMessageConstants.TEST_RUN_CREATION_FAILED.formatWithErrorDetails(errorMessage));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async getWorkspaceMetadata() {
|
|
42
|
+
try {
|
|
43
|
+
const baseUrl = getWorkspaceMetaDataApiUrl();
|
|
44
|
+
const token = getAccessToken();
|
|
45
|
+
if (!token) {
|
|
46
|
+
throw new Error("PLAYWRIGHT_SERVICE_ACCESS_TOKEN environment variable is not set.");
|
|
47
|
+
}
|
|
48
|
+
const url = new URL(baseUrl);
|
|
49
|
+
url.searchParams.set("api-version", Constants.LatestAPIVersion);
|
|
50
|
+
const method = "GET";
|
|
51
|
+
const correlationId = crypto.randomUUID();
|
|
52
|
+
const response = await this.httpService.callAPI(method, url.toString(), null, token, "", correlationId);
|
|
53
|
+
if (response.status !== 200) {
|
|
54
|
+
const errorMessage = extractErrorMessage(response?.bodyAsText ?? "");
|
|
55
|
+
throw new Error(ServiceErrorMessageConstants.FAILED_TO_GET_WORKSPACE_METADATA.formatWithError(errorMessage || `HTTP ${response.status}: Failed to retrieve workspace details`));
|
|
56
|
+
}
|
|
57
|
+
return response.bodyAsText ? JSON.parse(response.bodyAsText) : {};
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
if (error instanceof Error) {
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
throw new Error(ServiceErrorMessageConstants.FAILED_TO_GET_WORKSPACE_METADATA.message);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=PlaywrightServiceClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlaywrightServiceClient.js","sourceRoot":"","sources":["../../../src/utils/PlaywrightServiceClient.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport {\n getTestRunApiUrl,\n getAccessToken,\n extractErrorMessage,\n getWorkspaceMetaDataApiUrl,\n} from \"./utils.js\";\nimport { ServiceErrorMessageConstants } from \"../common/messages.js\";\nimport { HttpService } from \"../common/httpService.js\";\nimport { TestRunCreatePayload, WorkspaceMetaData } from \"../common/types.js\";\nimport { Constants, InternalEnvironmentVariables } from \"../common/constants.js\";\n\nexport class PlaywrightServiceClient {\n private httpService: HttpService;\n\n constructor(httpService?: HttpService) {\n this.httpService = httpService ?? new HttpService();\n }\n\n async createOrUpdateTestRun(payload: TestRunCreatePayload): Promise<void> {\n try {\n const baseUrl = getTestRunApiUrl();\n const token = getAccessToken();\n if (!token) {\n throw new Error(\"PLAYWRIGHT_SERVICE_ACCESS_TOKEN environment variable is not set.\");\n }\n const url = new URL(baseUrl);\n url.searchParams.set(\"api-version\", Constants.LatestAPIVersion);\n const method = \"PATCH\";\n const data = JSON.stringify(payload);\n const contentType = \"application/merge-patch+json\";\n const correlationId = crypto.randomUUID();\n\n const response = await this.httpService.callAPI(\n method,\n url.toString(),\n data,\n token,\n contentType,\n correlationId,\n );\n\n if (response.status !== 200) {\n const errorMessage = extractErrorMessage(response?.bodyAsText ?? \"\");\n process.env[InternalEnvironmentVariables.TEST_RUN_CREATION_SUCCESS] = \"false\";\n console.error(\n ServiceErrorMessageConstants.TEST_RUN_CREATION_FAILED.formatWithErrorDetails(\n errorMessage || \"Unknown error\",\n ),\n );\n return;\n }\n\n console.log(\"Test run created successfully.\");\n process.env[InternalEnvironmentVariables.TEST_RUN_CREATION_SUCCESS] = \"true\";\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error occurred during test run creation\";\n process.env[InternalEnvironmentVariables.TEST_RUN_CREATION_SUCCESS] = \"false\";\n console.error(\n ServiceErrorMessageConstants.TEST_RUN_CREATION_FAILED.formatWithErrorDetails(errorMessage),\n );\n }\n }\n\n async getWorkspaceMetadata(): Promise<WorkspaceMetaData> {\n try {\n const baseUrl = getWorkspaceMetaDataApiUrl();\n const token = getAccessToken();\n if (!token) {\n throw new Error(\"PLAYWRIGHT_SERVICE_ACCESS_TOKEN environment variable is not set.\");\n }\n const url = new URL(baseUrl);\n url.searchParams.set(\"api-version\", Constants.LatestAPIVersion);\n const method = \"GET\";\n const correlationId = crypto.randomUUID();\n\n const response = await this.httpService.callAPI(\n method,\n url.toString(),\n null,\n token,\n \"\",\n correlationId,\n );\n\n if (response.status !== 200) {\n const errorMessage = extractErrorMessage(response?.bodyAsText ?? \"\");\n throw new Error(\n ServiceErrorMessageConstants.FAILED_TO_GET_WORKSPACE_METADATA.formatWithError(\n errorMessage || `HTTP ${response.status}: Failed to retrieve workspace details`,\n ),\n );\n }\n\n return response.bodyAsText ? JSON.parse(response.bodyAsText) : {};\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(ServiceErrorMessageConstants.FAILED_TO_GET_WORKSPACE_METADATA.message);\n }\n }\n}\n"]}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import type { TokenCredential } from "@azure/core-auth";
|
|
2
|
-
import type { WorkspaceMetaData } from "../common/types.js";
|
|
2
|
+
import type { WorkspaceMetaData, UploadResult } from "../common/types.js";
|
|
3
3
|
export declare class PlaywrightReporterStorageManager {
|
|
4
|
-
uploadHtmlReportFolder(credential: TokenCredential, runId: string, outputFolder: string, workspaceDetails: WorkspaceMetaData): Promise<
|
|
5
|
-
private
|
|
6
|
-
|
|
7
|
-
uploadPlaywrightHtmlReportAfterTests(outputFolderName?: string, workspaceMetadata?: WorkspaceMetaData | null): Promise<void>;
|
|
4
|
+
uploadHtmlReportFolder(credential: TokenCredential, runId: string, outputFolder: string, workspaceDetails: WorkspaceMetaData): Promise<UploadResult>;
|
|
5
|
+
private modifyTraceIndexHtml;
|
|
6
|
+
uploadPlaywrightHtmlReportAfterTests(outputFolderName?: string, workspaceMetadata?: WorkspaceMetaData | null): Promise<UploadResult>;
|
|
8
7
|
private uploadFolderInParallel;
|
|
9
8
|
private uploadWithConcurrencyControl;
|
|
10
9
|
private executeWithOptimizedBatching;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwrightReporterStorageManager.d.ts","sourceRoot":"","sources":["../../../src/utils/playwrightReporterStorageManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"playwrightReporterStorageManager.d.ts","sourceRoot":"","sources":["../../../src/utils/playwrightReporterStorageManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAaxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE1E,qBAAa,gCAAgC;IAErC,sBAAsB,CAC1B,UAAU,EAAE,eAAe,EAC3B,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,iBAAiB,GAClC,OAAO,CAAC,YAAY,CAAC;YAwGV,oBAAoB;IAmD5B,oCAAoC,CACxC,gBAAgB,CAAC,EAAE,MAAM,EACzB,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,IAAI,GAC3C,OAAO,CAAC,YAAY,CAAC;YAiDV,sBAAsB;YA4GtB,4BAA4B;YAwB5B,4BAA4B;YA4E5B,yBAAyB;YA8CzB,sBAAsB;CAsCrC"}
|