@azure/microsoft-playwright-testing 1.0.0-alpha.20240911.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/CHANGELOG.md +17 -0
- package/LICENSE +21 -0
- package/README.md +151 -0
- package/dist/common/constants.d.ts +92 -0
- package/dist/common/constants.d.ts.map +1 -0
- package/dist/common/constants.js +222 -0
- package/dist/common/constants.js.map +1 -0
- package/dist/common/customerConfig.d.ts +9 -0
- package/dist/common/customerConfig.d.ts.map +1 -0
- package/dist/common/customerConfig.js +15 -0
- package/dist/common/customerConfig.js.map +1 -0
- package/dist/common/entraIdAccessToken.d.ts +12 -0
- package/dist/common/entraIdAccessToken.d.ts.map +1 -0
- package/dist/common/entraIdAccessToken.js +72 -0
- package/dist/common/entraIdAccessToken.js.map +1 -0
- package/dist/common/environmentVariables.d.ts +12 -0
- package/dist/common/environmentVariables.d.ts.map +1 -0
- package/dist/common/environmentVariables.js +17 -0
- package/dist/common/environmentVariables.js.map +1 -0
- package/dist/common/executor.d.ts +2 -0
- package/dist/common/executor.d.ts.map +1 -0
- package/dist/common/executor.js +79 -0
- package/dist/common/executor.js.map +1 -0
- package/dist/common/httpService.d.ts +5 -0
- package/dist/common/httpService.d.ts.map +1 -0
- package/dist/common/httpService.js +37 -0
- package/dist/common/httpService.js.map +1 -0
- package/dist/common/logger.d.ts +3 -0
- package/dist/common/logger.d.ts.map +1 -0
- package/dist/common/logger.js +9 -0
- package/dist/common/logger.js.map +1 -0
- package/dist/common/messages.d.ts +9 -0
- package/dist/common/messages.d.ts.map +1 -0
- package/dist/common/messages.js +14 -0
- package/dist/common/messages.js.map +1 -0
- package/dist/common/multimap.d.ts +16 -0
- package/dist/common/multimap.d.ts.map +1 -0
- package/dist/common/multimap.js +64 -0
- package/dist/common/multimap.js.map +1 -0
- package/dist/common/playwrightServiceConfig.d.ts +12 -0
- package/dist/common/playwrightServiceConfig.d.ts.map +1 -0
- package/dist/common/playwrightServiceConfig.js +39 -0
- package/dist/common/playwrightServiceConfig.js.map +1 -0
- package/dist/common/types.d.ts +301 -0
- package/dist/common/types.d.ts.map +1 -0
- package/dist/common/types.js +5 -0
- package/dist/common/types.js.map +1 -0
- package/dist/core/global/playwright-service-global-setup.d.ts +4 -0
- package/dist/core/global/playwright-service-global-setup.d.ts.map +1 -0
- package/dist/core/global/playwright-service-global-setup.js +19 -0
- package/dist/core/global/playwright-service-global-setup.js.map +1 -0
- package/dist/core/global/playwright-service-global-teardown.d.ts +4 -0
- package/dist/core/global/playwright-service-global-teardown.d.ts.map +1 -0
- package/dist/core/global/playwright-service-global-teardown.js +19 -0
- package/dist/core/global/playwright-service-global-teardown.js.map +1 -0
- package/dist/core/playwrightService.d.ts +63 -0
- package/dist/core/playwrightService.d.ts.map +1 -0
- package/dist/core/playwrightService.js +131 -0
- package/dist/core/playwrightService.js.map +1 -0
- package/dist/core/playwrightServiceEntra.d.ts +16 -0
- package/dist/core/playwrightServiceEntra.d.ts.map +1 -0
- package/dist/core/playwrightServiceEntra.js +51 -0
- package/dist/core/playwrightServiceEntra.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/model/entraTokenDetails.d.ts +5 -0
- package/dist/model/entraTokenDetails.d.ts.map +1 -0
- package/dist/model/entraTokenDetails.js +9 -0
- package/dist/model/entraTokenDetails.js.map +1 -0
- package/dist/model/mptTokenDetails.d.ts +11 -0
- package/dist/model/mptTokenDetails.d.ts.map +1 -0
- package/dist/model/mptTokenDetails.js +14 -0
- package/dist/model/mptTokenDetails.js.map +1 -0
- package/dist/model/shard.d.ts +41 -0
- package/dist/model/shard.d.ts.map +1 -0
- package/dist/model/shard.js +24 -0
- package/dist/model/shard.js.map +1 -0
- package/dist/model/storageUri.d.ts +14 -0
- package/dist/model/storageUri.d.ts.map +1 -0
- package/dist/model/storageUri.js +22 -0
- package/dist/model/storageUri.js.map +1 -0
- package/dist/model/testResult.d.ts +40 -0
- package/dist/model/testResult.d.ts.map +1 -0
- package/dist/model/testResult.js +9 -0
- package/dist/model/testResult.js.map +1 -0
- package/dist/model/testRun.d.ts +36 -0
- package/dist/model/testRun.d.ts.map +1 -0
- package/dist/model/testRun.js +12 -0
- package/dist/model/testRun.js.map +1 -0
- package/dist/reporter/index.d.ts +10 -0
- package/dist/reporter/index.d.ts.map +1 -0
- package/dist/reporter/index.js +15 -0
- package/dist/reporter/index.js.map +1 -0
- package/dist/reporter/mptReporter.d.ts +96 -0
- package/dist/reporter/mptReporter.d.ts.map +1 -0
- package/dist/reporter/mptReporter.js +350 -0
- package/dist/reporter/mptReporter.js.map +1 -0
- package/dist/tsdoc-metadata.json +11 -0
- package/dist/utils/cIInfoProvider.d.ts +25 -0
- package/dist/utils/cIInfoProvider.d.ts.map +1 -0
- package/dist/utils/cIInfoProvider.js +107 -0
- package/dist/utils/cIInfoProvider.js.map +1 -0
- package/dist/utils/packageManager.d.ts +15 -0
- package/dist/utils/packageManager.d.ts.map +1 -0
- package/dist/utils/packageManager.js +54 -0
- package/dist/utils/packageManager.js.map +1 -0
- package/dist/utils/reporterUtils.d.ts +57 -0
- package/dist/utils/reporterUtils.d.ts.map +1 -0
- package/dist/utils/reporterUtils.js +547 -0
- package/dist/utils/reporterUtils.js.map +1 -0
- package/dist/utils/serviceClient.d.ts +23 -0
- package/dist/utils/serviceClient.d.ts.map +1 -0
- package/dist/utils/serviceClient.js +91 -0
- package/dist/utils/serviceClient.js.map +1 -0
- package/dist/utils/storageClient.d.ts +6 -0
- package/dist/utils/storageClient.d.ts.map +1 -0
- package/dist/utils/storageClient.js +41 -0
- package/dist/utils/storageClient.js.map +1 -0
- package/dist/utils/utils.d.ts +17 -0
- package/dist/utils/utils.d.ts.map +1 -0
- package/dist/utils/utils.js +143 -0
- package/dist/utils/utils.js.map +1 -0
- package/package.json +104 -0
- package/types/microsoft-playwright-testing.d.ts +352 -0
- package/types/reporter/microsoft-playwright-testing.d.ts +146 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporterUtils.js","sourceRoot":"","sources":["../../src/utils/reporterUtils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n FullResult,\n Location,\n TestCase,\n TestResult,\n TestStep,\n FullConfig,\n Suite,\n} from \"@playwright/test/reporter\";\nimport { exec } from \"child_process\";\nimport { reporterLogger } from \"../common/logger\";\nimport { createHash, randomUUID } from \"crypto\";\nimport { IBackOffOptions } from \"../common/types\";\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nimport { Constants } from \"../common/constants\";\nimport { EnvironmentVariables } from \"../common/environmentVariables\";\nimport { DedupedStep, RawTestStep } from \"../common/types\";\nimport { TokenType } from \"../model/mptTokenDetails\";\nimport { Shard, TestRunStatus, UploadMetadata } from \"../model/shard\";\nimport { TestResult as MPTTestResult, RawTestResult } from \"../model/testResult\";\nimport { TestRun, TestRunConfig } from \"../model/testRun\";\nimport { CIInfo, CI_PROVIDERS } from \"./cIInfoProvider\";\nimport { CIInfoProvider } from \"./cIInfoProvider\";\n\nclass ReporterUtils {\n private envVariables: EnvironmentVariables;\n\n private config: FullConfig;\n totalTests: number;\n failedTests: number;\n skippedTests: number;\n passedTests: number;\n flakyTests: number;\n startTime: number;\n\n // eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters\n constructor(envVariables: EnvironmentVariables, config: FullConfig, _: Suite) {\n this.config = config;\n this.envVariables = envVariables;\n this.startTime = Date.now();\n\n this.totalTests = 0;\n this.failedTests = 0;\n this.skippedTests = 0;\n this.passedTests = 0;\n this.flakyTests = 0;\n }\n\n public async getTestRunObject(ciInfo: CIInfo): Promise<TestRun> {\n const testRun = new TestRun();\n const runName = await this.getRunName(ciInfo);\n if (ReporterUtils.isNullOrEmpty(this.envVariables.runId)) {\n if (!ReporterUtils.isNullOrEmpty(runName)) {\n this.envVariables.runId = runName;\n } else {\n this.envVariables.runId = randomUUID();\n }\n }\n testRun.testRunId = this.envVariables.runId;\n testRun.displayName = ReporterUtils.isNullOrEmpty(runName) ? randomUUID() : runName;\n testRun.creatorName = this.envVariables.userName;\n testRun.creatorId = this.envVariables.userId!;\n testRun.startTime = ReporterUtils.timestampToRFC3339(this.startTime);\n testRun.ciConfig = {\n ciProviderName: ciInfo.provider!,\n branch: ciInfo.branch!,\n author: ciInfo.author!,\n commitId: ciInfo.commitId!,\n revisionUrl: ciInfo.revisionUrl!,\n };\n testRun.testRunConfig = this.getTestRunConfig();\n testRun.cloudReportingEnabled = \"true\";\n return testRun;\n }\n\n public getTestRunShardStartObject(): Shard {\n const shard = new Shard();\n if (this.config.shard !== null && this.config.shard !== undefined) {\n this.envVariables.shardId = this.config.shard.current.toString();\n } else {\n this.envVariables.shardId = \"1\";\n }\n shard.shardId = this.envVariables.shardId;\n shard.summary = {\n startTime: ReporterUtils.timestampToRFC3339(this.startTime),\n };\n shard.uploadCompleted = false;\n return shard;\n }\n\n public getTestRunShardEndObject(\n result: FullResult,\n // eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters\n shard: Shard,\n errorMessages: string[],\n attachmentMetadata: UploadMetadata,\n workers: number,\n ): Shard {\n shard.shardId = this.envVariables.shardId ?? \"1\";\n shard.summary.totalTime = result.duration;\n shard.summary.endTime = ReporterUtils.timestampToRFC3339(Date.now());\n shard.summary.status = TestRunStatus.CLIENT_COMPLETE;\n shard.summary.errorMessages = errorMessages;\n shard.summary.uploadMetadata = attachmentMetadata;\n shard.uploadCompleted = true;\n shard.workers = workers;\n return shard;\n }\n\n public getTestResultObject(test: TestCase, result: TestResult, jobName: string): MPTTestResult {\n switch (test.outcome()) {\n case \"skipped\":\n this.skippedTests++;\n this.totalTests++;\n break;\n case \"expected\":\n this.passedTests++;\n this.totalTests++;\n break;\n case \"unexpected\":\n if (result.retry === test.retries) {\n this.failedTests++;\n this.totalTests++;\n }\n break;\n case \"flaky\":\n this.totalTests++;\n this.flakyTests++;\n break;\n default:\n break;\n }\n\n let browserName = test.parent.project()!.use.browserName?.toLowerCase();\n if (!browserName) {\n browserName = test.parent.project()!.use.defaultBrowserType?.toLowerCase();\n }\n const testResult = new MPTTestResult();\n testResult.runId = this.envVariables.runId;\n testResult.shardId = this.envVariables.runId + \"_\" + this.envVariables.shardId;\n testResult.accountId = this.envVariables.accountId!;\n testResult.suiteId = ReporterUtils.calculateSha1(`${test.parent.title}-${test.location.file}`);\n testResult.testId = testResult.suiteId.concat(`-${ReporterUtils.calculateSha1(test.title)}`);\n testResult.testCombinationId = test.id;\n testResult.testExecutionId = randomUUID();\n testResult.testTitle = test.title;\n testResult.suiteTitle = this.extractRootParentTitle(test.parent)!;\n testResult.fileName = test.location.file;\n testResult.status = this.getTestStatus(test, result);\n testResult.lineNumber = test.location.line;\n testResult.retry = result.retry ? result.retry : 0;\n testResult.webTestConfig = {\n jobName: jobName,\n projectName: test.parent.project()!.name,\n browserType: browserName!.toUpperCase(),\n os: this.getOsName(),\n };\n testResult.annotations = this.extractTestAnnotations(test.annotations);\n testResult.tags = this.extractTestTags(test);\n testResult.resultsSummary = {\n status: result.status.toUpperCase(),\n duration: result.duration,\n startTime: result.startTime.toISOString().replace(/\\.\\d+Z$/, \"Z\"),\n attachmentsMetadata: this.getAttachmentStatus(result),\n };\n testResult.artifactsPath = result.attachments\n .filter((attachment) => attachment?.path !== null && attachment?.path !== undefined) // Filter attachments with defined and non-null path property\n .map(\n (attachment) =>\n `${testResult.testExecutionId}/${ReporterUtils.getFileRelativePath(attachment.path!)}`,\n );\n return testResult;\n }\n\n public generateMarkdownSummary(testRunUrl: string): void {\n try {\n if (CIInfoProvider.getCIProvider() === CI_PROVIDERS.GITHUB) {\n const markdownContent = `\n#### Microsoft Playwright Testing run summary\n\n#### Results:\n \n **Passed:** ${this.passedTests}\n \n **Failed:** ${this.failedTests}\n \n **Flaky:** ${this.flakyTests}\n \n **Skipped:** ${this.skippedTests}\n \n#### For more details, visit the [service dashboard](${testRunUrl}).\n `;\n fs.writeFileSync(process.env[\"GITHUB_STEP_SUMMARY\"]!, markdownContent);\n }\n } catch (err) {\n reporterLogger.error(`\\nCould not generate markdown summary - ${err}`);\n }\n }\n\n public getRawTestResultObject(result: TestResult): RawTestResult {\n const rawTestResult: RawTestResult = {\n steps: this.dedupeSteps(result.steps).map((step) => this.serializeTestStep(step)),\n errors: result.errors ? JSON.stringify(result.errors, null, 2) : \"\",\n stdErr: result.stderr ? JSON.stringify(result.stderr, null, 2) : \"\",\n stdOut: result.stdout ? JSON.stringify(result.stdout, null, 2) : \"\",\n };\n return rawTestResult;\n }\n\n public static getRunId(cIInfo: CIInfo): string {\n if (cIInfo === null || cIInfo.provider === CI_PROVIDERS.DEFAULT) {\n return randomUUID();\n }\n\n const concatString = `${cIInfo.provider}-${cIInfo.repo}-${cIInfo.runId}-${cIInfo.runAttempt}`;\n const runId = ReporterUtils.calculateSha1(concatString);\n return runId;\n }\n\n public static calculateSha1(buffer: Buffer | string): string {\n const hash = createHash(\"sha1\");\n hash.update(buffer);\n return hash.digest(\"hex\");\n }\n\n /*\n public static getTokenDetails(accessToken: string) {\n let tokenDetails = new MPTTokenDetails();\n try {\n const token = accessToken.split('.')[1];\n const _token = Buffer.from(token, 'base64');\n tokenDetails = JSON.parse(_token.toString());\n } catch (err) {\n throw err;\n }\n return tokenDetails;\n }\n */\n\n public static getTokenDetails<T>(accessToken: string, tokenType: TokenType): T {\n const token = accessToken.split(\".\")[1]!;\n const _token = Buffer.from(token, \"base64\");\n const tokenDetails = JSON.parse(_token.toString());\n\n switch (tokenType) {\n case TokenType.MPT:\n return tokenDetails as T;\n case TokenType.ENTRA:\n return tokenDetails as T;\n default:\n throw new Error(\"Unsupported token type\");\n }\n }\n\n public static hasAudienceClaim(token: string): boolean {\n try {\n // Split the token into its three parts\n const parts = token.split(\".\");\n if (parts.length !== 3) {\n throw new Error(\"Invalid token format\");\n }\n\n // Base64 decode the payload\n const payload = parts[1]!;\n const decodedPayload = Buffer.from(payload, \"base64\");\n\n // Parse the decoded payload as JSON\n const payloadObject = JSON.parse(decodedPayload.toString());\n\n // Check if the payload has an 'aud' claim\n return \"aud\" in payloadObject;\n } catch (error) {\n return false;\n }\n }\n\n public static timestampToRFC3339(timestamp: number): string {\n const date = new Date(timestamp);\n const dateString = date.toISOString().replace(/\\.\\d+Z$/, \"Z\");\n return dateString;\n }\n\n public static getFileRelativePath(filePath: string): string {\n if (filePath) {\n let parts = filePath.split(\"/\");\n\n if (parts.length > 1) {\n return parts[parts.length - 1]!;\n }\n\n parts = filePath.split(\"\\\\\");\n\n if (parts.length > 1) {\n return parts[parts.length - 1]!;\n }\n }\n\n return filePath;\n }\n\n public static getReporterBackOffOptions: Partial<IBackOffOptions> = {\n numOfAttempts: 3,\n jitter: \"full\",\n retry: (error) => {\n if (error.response) {\n const status = error.response.status;\n if (Constants.NON_RETRYABLE_STATUS_CODES.includes(status)) {\n return false;\n }\n }\n return true;\n },\n };\n\n public static isTimeGreaterThanCurrentPlus10Minutes(isoString: string): boolean {\n // Parse ISO 8601 string into a timestamp\n const timestampFromIsoString: number = Date.parse(isoString);\n // Calculate the current timestamp plus 10 minutes\n const currentTimestampPlus10Minutes: number = Date.now() + 10 * 60 * 1000;\n // Compare the timestamps\n return timestampFromIsoString > currentTimestampPlus10Minutes;\n }\n\n public static getFileSize(attachmentPath: string): number {\n try {\n const stats = fs.statSync(attachmentPath);\n return stats.size;\n } catch (err) {\n return 0;\n }\n }\n\n public redactAccessToken(info: string | undefined): string {\n if (!info || ReporterUtils.isNullOrEmpty(this.envVariables.accessToken)) {\n return \"\";\n }\n const accessTokenRegex = new RegExp(this.envVariables.accessToken, \"g\");\n return info.replace(accessTokenRegex, Constants.DEFAULT_REDACTED_MESSAGE);\n }\n\n public static populateValuesFromServiceUrl(): {\n region: string;\n accountId: string;\n } | null {\n // Service URL format: wss://<region>.api.playwright.microsoft.com/accounts/<workspace-id>/browsers\n const url = process.env[\"PLAYWRIGHT_SERVICE_URL\"]!;\n if (!ReporterUtils.isNullOrEmpty(url)) {\n const parts = url.split(\"/\");\n\n if (parts.length > 2) {\n const subdomainParts = parts[2]!.split(\".\");\n const region = subdomainParts.length > 0 ? subdomainParts[0] : null;\n const accountId = parts[4];\n\n return { region: region!, accountId: accountId! };\n }\n }\n return null;\n }\n\n public static getRegionFromAccountID(accountId: string): string | undefined {\n if (accountId.includes(\"_\")) {\n return accountId.split(\"_\")[0]!;\n } else {\n return;\n } // Handling for older workspaces without region in id\n }\n\n public progressBar(current: number, total: number): void {\n const width = 40;\n const percent = current / total;\n const completed = Math.round(width * percent);\n const remaining = width - completed;\n\n process.stdout.write(\"\\r\");\n process.stdout.write(\n `[${\"=\".repeat(completed)}${\" \".repeat(remaining)}] ${Math.round(percent * 100)}%`,\n );\n }\n\n private getTestRunConfig(): TestRunConfig {\n const testRunConfig: TestRunConfig = {\n workers: this.config.workers,\n pwVersion: this.config.version,\n timeout: this.config.globalTimeout,\n repeatEach: this.config.projects[0].repeatEach,\n retries: this.config.projects[0].retries,\n shards: this.config.shard ? this.config.shard : { total: 1 },\n testFramework: {\n name: Constants.TEST_FRAMEWORK_NAME,\n version: this.config.version,\n runnerName: Constants.TEST_FRAMEWORK_RUNNERNAME,\n },\n testType: Constants.TEST_TYPE,\n testSdkLanguage: Constants.TEST_SDK_LANGUAGE,\n reporterPackageVersion: Constants.REPORTER_PACKAGE_VERSION,\n };\n return testRunConfig;\n }\n\n private relativeLocation(location: Location | undefined): Location | undefined {\n if (!location) {\n return undefined;\n }\n const file = this.toPosixPath(path.relative(this.config.rootDir, location.file));\n return {\n file,\n line: location.line,\n column: location.column,\n };\n }\n\n private extractTestTags(input: TestCase): string[] {\n let tags: string[] = [];\n if (\"tags\" in input && Array.isArray(input.tags) && input.tags.length > 0) {\n tags = input.tags.map((tag) => tag.slice(1));\n return tags;\n }\n\n // Check if the input string contains tags directly\n const regex = /@(\\w+)/g;\n const matches = input.title.match(regex);\n if (matches) {\n tags = tags.concat(matches.map((match) => match.slice(1)));\n }\n\n // Try parsing the input string as a JavaScript object\n try {\n const obj = JSON.parse(`{${input}}`);\n if (obj.tag && Array.isArray(obj.tag)) {\n tags = tags.concat(obj.tag);\n }\n } catch (error) {\n // Ignore parsing errors\n }\n return tags;\n }\n\n private extractTestAnnotations(annotations: TestCase[\"annotations\"]): string[] {\n const result = annotations.map((annotation) => {\n if (annotation.type && annotation.description) {\n return `${annotation.type}: ${annotation.description}`;\n }\n return annotation.type;\n });\n return result;\n }\n\n private toPosixPath(aPath: string): string {\n return aPath.split(path.sep).join(path.posix.sep);\n }\n\n private getAttachmentStatus(testResult: TestResult): string {\n let attachmentStatus: string = \"\";\n for (const attachment of testResult.attachments) {\n if (attachment.contentType.includes(\"image\")) {\n if (attachmentStatus !== \"\") {\n attachmentStatus += \",\";\n }\n attachmentStatus += \"image\";\n } else if (attachment.contentType.includes(\"video\")) {\n if (attachmentStatus !== \"\") {\n attachmentStatus += \",\";\n }\n attachmentStatus += \"video\";\n } else if (attachment.contentType === \"application/zip\") {\n if (attachmentStatus !== \"\") {\n attachmentStatus += \",\";\n }\n attachmentStatus += \"trace\";\n }\n }\n return attachmentStatus;\n }\n\n private dedupeSteps(steps: TestStep[]): DedupedStep[] {\n const result: DedupedStep[] = [];\n let lastResult = undefined;\n for (const step of steps) {\n const canDedupe =\n !step.error && step.duration >= 0 && step.location?.file && !step.steps.length;\n const lastStep = lastResult?.step;\n if (\n canDedupe &&\n lastResult &&\n lastStep &&\n step.category === lastStep.category &&\n step.title === lastStep.title &&\n step.location?.file === lastStep.location?.file &&\n step.location?.line === lastStep.location?.line &&\n step.location?.column === lastStep.location?.column\n ) {\n ++lastResult.count;\n lastResult.duration += step.duration;\n continue;\n }\n lastResult = { step, count: 1, duration: step.duration };\n result.push(lastResult);\n if (!canDedupe) {\n lastResult = undefined;\n }\n }\n return result;\n }\n\n private serializeTestStep(dedupedStep: DedupedStep): RawTestStep {\n const { step, duration, count } = dedupedStep;\n const result: RawTestStep = {\n title: step.title,\n category: step.category,\n startTime: step.startTime.toISOString(),\n duration,\n error: step.error ? step.error.message : undefined,\n location: this.relativeLocation(step.location),\n steps: this.dedupeSteps(step.steps).map((subStep) => this.serializeTestStep(subStep)),\n count: count,\n };\n return result;\n }\n\n private getTestStatus(test: TestCase, result: TestResult): string {\n if (test.expectedStatus === result.status) {\n if (result.status === \"skipped\") {\n return \"SKIPPED\";\n } else {\n return \"PASSED\";\n }\n } else if (result.status === \"interrupted\") {\n return \"SKIPPED\";\n } else {\n return \"FAILED\";\n }\n }\n\n private extractRootParentTitle(suite: Suite): string | undefined {\n // Traverse through the parent properties until reaching the root parent\n let currentSuite: Suite | undefined = suite;\n let depthCount: number = 0;\n let suiteTitle: string = currentSuite.title;\n const projectName = currentSuite.project()!.name;\n while (currentSuite?.parent && !ReporterUtils.isNullOrEmpty(currentSuite.parent.title)) {\n if (depthCount > 10 || currentSuite.parent.title === projectName) {\n break;\n }\n suiteTitle = suiteTitle + \" > \" + currentSuite.parent.title;\n currentSuite = currentSuite.parent;\n depthCount++;\n }\n return suiteTitle;\n }\n\n private async getRunName(ciInfo: CIInfo): Promise<string> {\n if (\n ciInfo.provider === CI_PROVIDERS.GITHUB &&\n process.env[\"GITHUB_EVENT_NAME\"] === \"pull_request\"\n ) {\n const prNumber: string = `${process.env[\"GITHUB_REF_NAME\"]?.split(\"/\")[0]}`;\n const prLink: string = `${process.env[\"GITHUB_REPOSITORY\"]}/pull/${prNumber}`;\n return `PR# ${prNumber} on Repo: ${process.env[\"GITHUB_REPOSITORY\"]} (${prLink})`;\n }\n\n let gitCommitMessage: string | null = null;\n try {\n const gitVersion = await this.runCommand(Constants.GIT_VERSION_COMMAND);\n if (ReporterUtils.isNullOrEmpty(gitVersion)) {\n throw new Error(\"Git is not installed on the machine\");\n }\n const isInsideWorkTree = await this.runCommand(Constants.GIT_REV_PARSE);\n if (isInsideWorkTree !== \"true\") {\n throw new Error(\"Not inside a git repository\");\n }\n gitCommitMessage = await this.runCommand(Constants.GIT_COMMIT_MESSAGE_COMMAND);\n return gitCommitMessage;\n } catch (err) {\n reporterLogger.error(`\\nError in getting git commit message: ${err}.`);\n return \"\";\n }\n }\n\n private async runCommand(command: string): Promise<string> {\n return new Promise((resolve, reject) => {\n exec(command, (error, stdout, stderr) => {\n if (error) {\n reject(error);\n return;\n }\n if (stderr) {\n reject(new Error(stderr));\n return;\n }\n resolve(stdout.trim());\n });\n });\n }\n\n public static isNullOrEmpty(str: string | null | undefined): boolean {\n return !str || str.trim() === \"\";\n }\n\n private getOsName(): string {\n const osType = os.type();\n switch (osType) {\n case \"Darwin\":\n return \"MAC\";\n case \"Linux\":\n return \"LINUX\";\n case \"Windows_NT\":\n return \"WINDOWS\";\n default:\n return \"UNKNOWN\";\n }\n }\n}\n\nexport default ReporterUtils;\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { FullResult } from "@playwright/test/reporter";
|
|
2
|
+
import { EnvironmentVariables } from "../common/environmentVariables";
|
|
3
|
+
import { Shard, UploadMetadata } from "../model/shard";
|
|
4
|
+
import { StorageUri } from "../model/storageUri";
|
|
5
|
+
import { TestResult } from "../model/testResult";
|
|
6
|
+
import { TestRun } from "../model/testRun";
|
|
7
|
+
import { CIInfo } from "./cIInfoProvider";
|
|
8
|
+
import ReporterUtils from "./reporterUtils";
|
|
9
|
+
export declare class ServiceClient {
|
|
10
|
+
private httpService;
|
|
11
|
+
private readonly envVariables;
|
|
12
|
+
private readonly reporterUtils;
|
|
13
|
+
constructor(envVariables: EnvironmentVariables, reporterUtils: ReporterUtils);
|
|
14
|
+
patchTestRun(ciInfo: CIInfo): Promise<TestRun>;
|
|
15
|
+
getTestRun(): Promise<TestRun>;
|
|
16
|
+
postTestRunShardStart(): Promise<Shard>;
|
|
17
|
+
postTestRunShardEnd(result: FullResult, shard: Shard, errorMessages: string[], attachmentMetadata: UploadMetadata, workers: number): Promise<TestRun>;
|
|
18
|
+
postTestResults(testResults: TestResult[]): Promise<void>;
|
|
19
|
+
createStorageUri(): Promise<StorageUri>;
|
|
20
|
+
private getServiceEndpoint;
|
|
21
|
+
private handleErrorResponse;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=serviceClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serviceClient.d.ts","sourceRoot":"","sources":["../../src/utils/serviceClient.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAEtE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAG5C,qBAAa,aAAa;IACxB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuB;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;gBAGlC,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,aAAa;IAMtE,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA0B9C,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAiB9B,qBAAqB,IAAI,OAAO,CAAC,KAAK,CAAC;IAoBvC,mBAAmB,CACvB,MAAM,EAAE,UAAU,EAElB,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,MAAM,EAAE,EACvB,kBAAkB,EAAE,cAAc,EAClC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC;IA2Bb,eAAe,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBzD,gBAAgB,IAAI,OAAO,CAAC,UAAU,CAAC;IAiB7C,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,mBAAmB;CAK5B"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) Microsoft Corporation.
|
|
3
|
+
// Licensed under the MIT License.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.ServiceClient = void 0;
|
|
6
|
+
const constants_1 = require("../common/constants");
|
|
7
|
+
const httpService_1 = require("../common/httpService");
|
|
8
|
+
class ServiceClient {
|
|
9
|
+
// eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters
|
|
10
|
+
constructor(envVariables, reporterUtils) {
|
|
11
|
+
this.httpService = new httpService_1.HttpService();
|
|
12
|
+
this.envVariables = envVariables;
|
|
13
|
+
this.reporterUtils = reporterUtils;
|
|
14
|
+
}
|
|
15
|
+
async patchTestRun(ciInfo) {
|
|
16
|
+
const testRun = await this.reporterUtils.getTestRunObject(ciInfo);
|
|
17
|
+
const response = await this.httpService.callAPI("PATCH", `${this.getServiceEndpoint()}/${constants_1.Constants.testRunsEndpoint.replace("{workspaceId}", this.envVariables.accountId)}/${this.envVariables.runId}?api-version=${constants_1.Constants.API_VERSION}`, JSON.stringify(testRun), this.envVariables.accessToken, "application/merge-patch+json", this.envVariables.correlationId);
|
|
18
|
+
if (response.status === 200) {
|
|
19
|
+
return JSON.parse(response.bodyAsText);
|
|
20
|
+
}
|
|
21
|
+
else if (response.status === 409) {
|
|
22
|
+
process.stdout.write(`\n${constants_1.Constants.CONFLICT_409_ERROR_MESSAGE.replace("{runId}", this.envVariables.runId)}`);
|
|
23
|
+
}
|
|
24
|
+
else if (response.status === 403) {
|
|
25
|
+
process.stdout.write(`\n${constants_1.Constants.FORBIDDEN_403_ERROR_MESSAGE.replace(new RegExp("{workspaceId}", "g"), this.envVariables.accountId)}`);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
this.handleErrorResponse(response, constants_1.Constants.patchTestRun);
|
|
29
|
+
}
|
|
30
|
+
throw new Error(`Received status ${response.status} from service from PATCH TestRun call.`);
|
|
31
|
+
}
|
|
32
|
+
async getTestRun() {
|
|
33
|
+
const response = await this.httpService.callAPI("GET", `${this.getServiceEndpoint()}/${constants_1.Constants.testRunsEndpoint.replace("{workspaceId}", this.envVariables.accountId).concat(`/${this.envVariables.runId}?api-version=${constants_1.Constants.API_VERSION}`)}`, null, this.envVariables.accessToken, "application/json", this.envVariables.correlationId);
|
|
34
|
+
if (response.status === 200) {
|
|
35
|
+
return JSON.parse(response.bodyAsText);
|
|
36
|
+
}
|
|
37
|
+
this.handleErrorResponse(response, constants_1.Constants.getTestRun);
|
|
38
|
+
throw new Error(`Received status ${response.status} from service from GET TestRun call.`);
|
|
39
|
+
}
|
|
40
|
+
async postTestRunShardStart() {
|
|
41
|
+
const postTestRunShardObject = this.reporterUtils.getTestRunShardStartObject();
|
|
42
|
+
const response = await this.httpService.callAPI("POST", `${this.getServiceEndpoint()}/${constants_1.Constants.testRunsShardEndpoint.replace("{workspaceId}", this.envVariables.accountId).replace("{testRunId}", this.envVariables.runId)}/?api-version=${constants_1.Constants.API_VERSION}`, JSON.stringify(postTestRunShardObject), this.envVariables.accessToken, "application/json", this.envVariables.correlationId);
|
|
43
|
+
if (response.status === 200) {
|
|
44
|
+
return JSON.parse(response.bodyAsText);
|
|
45
|
+
}
|
|
46
|
+
this.handleErrorResponse(response, constants_1.Constants.patchTestRunShardStart);
|
|
47
|
+
throw new Error(`Received status ${response.status} from service from PATCH TestRun Shard Start call.`);
|
|
48
|
+
}
|
|
49
|
+
async postTestRunShardEnd(result,
|
|
50
|
+
// eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters
|
|
51
|
+
shard, errorMessages, attachmentMetadata, workers) {
|
|
52
|
+
const postTestRunShardObject = this.reporterUtils.getTestRunShardEndObject(result, shard, errorMessages, attachmentMetadata, workers);
|
|
53
|
+
const response = await this.httpService.callAPI("POST", `${this.getServiceEndpoint()}/${constants_1.Constants.testRunsShardEndpoint.replace("{workspaceId}", this.envVariables.accountId).replace("{testRunId}", this.envVariables.runId)}/?api-version=${constants_1.Constants.API_VERSION}`, JSON.stringify(postTestRunShardObject), this.envVariables.accessToken, "application/json", this.envVariables.correlationId);
|
|
54
|
+
if (response.status === 200) {
|
|
55
|
+
return JSON.parse(response.bodyAsText);
|
|
56
|
+
}
|
|
57
|
+
this.handleErrorResponse(response, constants_1.Constants.patchTestRunShardEnd);
|
|
58
|
+
throw new Error(`Received status ${response.status} from service from PATCH TestRun Shard End call.`);
|
|
59
|
+
}
|
|
60
|
+
// eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters
|
|
61
|
+
async postTestResults(testResults) {
|
|
62
|
+
const payload = {
|
|
63
|
+
value: testResults,
|
|
64
|
+
};
|
|
65
|
+
const response = await this.httpService.callAPI("POST", `${this.getServiceEndpoint()}/${constants_1.Constants.testResultsEndpoint.replace("{workspaceId}", this.envVariables.accountId)}?api-version=${constants_1.Constants.API_VERSION}`, JSON.stringify(payload), this.envVariables.accessToken, "application/json", this.envVariables.correlationId);
|
|
66
|
+
if (response.status === 200) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
this.handleErrorResponse(response, constants_1.Constants.postTestResults);
|
|
70
|
+
throw new Error(`Received status ${response.status} from service from POST TestResults call.`);
|
|
71
|
+
}
|
|
72
|
+
async createStorageUri() {
|
|
73
|
+
const response = await this.httpService.callAPI("POST", `${this.getServiceEndpoint()}/${constants_1.Constants.storageUriEndpoint.replace("{workspaceId}", this.envVariables.accountId).replace("{testRunId}", this.envVariables.runId)}?api-version=${constants_1.Constants.API_VERSION}`, null, this.envVariables.accessToken, "application/json", this.envVariables.correlationId);
|
|
74
|
+
if (response.status === 200) {
|
|
75
|
+
return JSON.parse(response.bodyAsText);
|
|
76
|
+
}
|
|
77
|
+
this.handleErrorResponse(response, constants_1.Constants.getStorageUri);
|
|
78
|
+
throw new Error(`Received status ${response.status} from service from GET StorageUri call.`);
|
|
79
|
+
}
|
|
80
|
+
getServiceEndpoint() {
|
|
81
|
+
return process.env["PLAYWRIGHT_SERVICE_REPORTING_URL"];
|
|
82
|
+
}
|
|
83
|
+
handleErrorResponse(response, action) {
|
|
84
|
+
var _a, _b;
|
|
85
|
+
const statusCode = response.status;
|
|
86
|
+
const errorMessage = (_b = (_a = constants_1.Constants.ERROR_MESSAGE[action]) === null || _a === void 0 ? void 0 : _a[statusCode]) !== null && _b !== void 0 ? _b : "Unknown error occured.";
|
|
87
|
+
process.stdout.write(`${errorMessage}\n`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.ServiceClient = ServiceClient;
|
|
91
|
+
//# sourceMappingURL=serviceClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serviceClient.js","sourceRoot":"","sources":["../../src/utils/serviceClient.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { FullResult } from \"@playwright/test/reporter\";\nimport { Constants } from \"../common/constants\";\nimport { EnvironmentVariables } from \"../common/environmentVariables\";\nimport { HttpService } from \"../common/httpService\";\nimport { Shard, UploadMetadata } from \"../model/shard\";\nimport { StorageUri } from \"../model/storageUri\";\nimport { TestResult } from \"../model/testResult\";\nimport { TestRun } from \"../model/testRun\";\nimport { CIInfo } from \"./cIInfoProvider\";\nimport ReporterUtils from \"./reporterUtils\";\nimport { PipelineResponse } from \"@azure/core-rest-pipeline\";\n\nexport class ServiceClient {\n private httpService: HttpService;\n private readonly envVariables: EnvironmentVariables;\n private readonly reporterUtils: ReporterUtils;\n\n // eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters\n constructor(envVariables: EnvironmentVariables, reporterUtils: ReporterUtils) {\n this.httpService = new HttpService();\n this.envVariables = envVariables;\n this.reporterUtils = reporterUtils;\n }\n\n async patchTestRun(ciInfo: CIInfo): Promise<TestRun> {\n const testRun = await this.reporterUtils.getTestRunObject(ciInfo);\n const response: PipelineResponse = await this.httpService.callAPI(\n \"PATCH\",\n `${this.getServiceEndpoint()}/${Constants.testRunsEndpoint.replace(\"{workspaceId}\", this.envVariables.accountId!)}/${this.envVariables.runId}?api-version=${Constants.API_VERSION}`,\n JSON.stringify(testRun),\n this.envVariables.accessToken,\n \"application/merge-patch+json\",\n this.envVariables.correlationId!,\n );\n if (response.status === 200) {\n return JSON.parse(response.bodyAsText!) as TestRun;\n } else if (response.status === 409) {\n process.stdout.write(\n `\\n${Constants.CONFLICT_409_ERROR_MESSAGE.replace(\"{runId}\", this.envVariables.runId)}`,\n );\n } else if (response.status === 403) {\n process.stdout.write(\n `\\n${Constants.FORBIDDEN_403_ERROR_MESSAGE.replace(new RegExp(\"{workspaceId}\", \"g\"), this.envVariables.accountId!)}`,\n );\n } else {\n this.handleErrorResponse(response, Constants.patchTestRun);\n }\n throw new Error(`Received status ${response.status} from service from PATCH TestRun call.`);\n }\n\n async getTestRun(): Promise<TestRun> {\n const response: PipelineResponse = await this.httpService.callAPI(\n \"GET\",\n `${this.getServiceEndpoint()}/${Constants.testRunsEndpoint.replace(\"{workspaceId}\", this.envVariables.accountId!).concat(`/${this.envVariables.runId}?api-version=${Constants.API_VERSION}`)}`,\n null,\n this.envVariables.accessToken,\n \"application/json\",\n this.envVariables.correlationId!,\n );\n if (response.status === 200) {\n return JSON.parse(response.bodyAsText!) as TestRun;\n }\n this.handleErrorResponse(response, Constants.getTestRun);\n\n throw new Error(`Received status ${response.status} from service from GET TestRun call.`);\n }\n\n async postTestRunShardStart(): Promise<Shard> {\n const postTestRunShardObject = this.reporterUtils.getTestRunShardStartObject();\n const response: PipelineResponse = await this.httpService.callAPI(\n \"POST\",\n `${this.getServiceEndpoint()}/${Constants.testRunsShardEndpoint.replace(\"{workspaceId}\", this.envVariables.accountId!).replace(\"{testRunId}\", this.envVariables.runId)}/?api-version=${Constants.API_VERSION}`,\n JSON.stringify(postTestRunShardObject),\n this.envVariables.accessToken,\n \"application/json\",\n this.envVariables.correlationId!,\n );\n if (response.status === 200) {\n return JSON.parse(response.bodyAsText!) as Shard;\n }\n this.handleErrorResponse(response, Constants.patchTestRunShardStart);\n\n throw new Error(\n `Received status ${response.status} from service from PATCH TestRun Shard Start call.`,\n );\n }\n\n async postTestRunShardEnd(\n result: FullResult,\n // eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters\n shard: Shard,\n errorMessages: string[],\n attachmentMetadata: UploadMetadata,\n workers: number,\n ): Promise<TestRun> {\n const postTestRunShardObject = this.reporterUtils.getTestRunShardEndObject(\n result,\n shard,\n errorMessages,\n attachmentMetadata,\n workers,\n );\n const response: PipelineResponse = await this.httpService.callAPI(\n \"POST\",\n `${this.getServiceEndpoint()}/${Constants.testRunsShardEndpoint.replace(\"{workspaceId}\", this.envVariables.accountId!).replace(\"{testRunId}\", this.envVariables.runId)}/?api-version=${Constants.API_VERSION}`,\n JSON.stringify(postTestRunShardObject),\n this.envVariables.accessToken,\n \"application/json\",\n this.envVariables.correlationId!,\n );\n if (response.status === 200) {\n return JSON.parse(response.bodyAsText!) as TestRun;\n }\n this.handleErrorResponse(response, Constants.patchTestRunShardEnd);\n\n throw new Error(\n `Received status ${response.status} from service from PATCH TestRun Shard End call.`,\n );\n }\n\n // eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters\n async postTestResults(testResults: TestResult[]): Promise<void> {\n const payload: any = {\n value: testResults,\n };\n const response: PipelineResponse = await this.httpService.callAPI(\n \"POST\",\n `${this.getServiceEndpoint()}/${Constants.testResultsEndpoint.replace(\"{workspaceId}\", this.envVariables.accountId!)}?api-version=${Constants.API_VERSION}`,\n JSON.stringify(payload),\n this.envVariables.accessToken,\n \"application/json\",\n this.envVariables.correlationId!,\n );\n if (response.status === 200) {\n return;\n }\n this.handleErrorResponse(response, Constants.postTestResults);\n\n throw new Error(`Received status ${response.status} from service from POST TestResults call.`);\n }\n\n async createStorageUri(): Promise<StorageUri> {\n const response: PipelineResponse = await this.httpService.callAPI(\n \"POST\",\n `${this.getServiceEndpoint()}/${Constants.storageUriEndpoint.replace(\"{workspaceId}\", this.envVariables.accountId!).replace(\"{testRunId}\", this.envVariables.runId)}?api-version=${Constants.API_VERSION}`,\n null,\n this.envVariables.accessToken,\n \"application/json\",\n this.envVariables.correlationId!,\n );\n if (response.status === 200) {\n return JSON.parse(response.bodyAsText!) as StorageUri;\n }\n this.handleErrorResponse(response, Constants.getStorageUri);\n\n throw new Error(`Received status ${response.status} from service from GET StorageUri call.`);\n }\n\n private getServiceEndpoint(): string {\n return process.env[\"PLAYWRIGHT_SERVICE_REPORTING_URL\"]!;\n }\n\n private handleErrorResponse(response: PipelineResponse, action: string) {\n const statusCode = response.status;\n const errorMessage = Constants.ERROR_MESSAGE[action]?.[statusCode] ?? \"Unknown error occured.\";\n process.stdout.write(`${errorMessage}\\n`);\n }\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare class StorageClient {
|
|
2
|
+
uploadFile(uri: string, filePath: string, fileRelativePath: string): Promise<void>;
|
|
3
|
+
uploadBuffer(uri: string, buffer: string, fileRelativePath: string): Promise<void>;
|
|
4
|
+
private getCloudFilepath;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=storageClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storageClient.d.ts","sourceRoot":"","sources":["../../src/utils/storageClient.ts"],"names":[],"mappings":"AAOA,qBAAa,aAAa;IACX,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAalF,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa/F,OAAO,CAAC,gBAAgB;CAOzB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) Microsoft Corporation.
|
|
3
|
+
// Licensed under the MIT License.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.StorageClient = void 0;
|
|
6
|
+
const storage_blob_1 = require("@azure/storage-blob");
|
|
7
|
+
const logger_1 = require("../common/logger");
|
|
8
|
+
const constants_1 = require("../common/constants");
|
|
9
|
+
class StorageClient {
|
|
10
|
+
async uploadFile(uri, filePath, fileRelativePath) {
|
|
11
|
+
try {
|
|
12
|
+
const cloudFilepath = this.getCloudFilepath(uri, fileRelativePath);
|
|
13
|
+
const blobClient = new storage_blob_1.BlockBlobClient(cloudFilepath);
|
|
14
|
+
await blobClient.uploadFile(filePath, { concurrency: 10 });
|
|
15
|
+
logger_1.reporterLogger.info(`\nUploaded file ${filePath}.`);
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
logger_1.reporterLogger.error(`\nUnable to upload file ${filePath}, Name: ${err.name}, Message: ${err.message}, Stack: ${err.stack}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async uploadBuffer(uri, buffer, fileRelativePath) {
|
|
22
|
+
try {
|
|
23
|
+
const cloudFilepath = this.getCloudFilepath(uri, fileRelativePath);
|
|
24
|
+
const blobClient = new storage_blob_1.BlockBlobClient(cloudFilepath);
|
|
25
|
+
await blobClient.upload(buffer, buffer.length);
|
|
26
|
+
logger_1.reporterLogger.verbose(`\nUploaded buffer to ${fileRelativePath}.`);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
logger_1.reporterLogger.error(`\nUnable to upload buffer ${fileRelativePath}, Name: ${err.name}, Message: ${err.message}, Stack: ${err.stack}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
getCloudFilepath(uri, fileRelativePath) {
|
|
33
|
+
// Split the uri on "?" to get the container uri and sas token
|
|
34
|
+
const parts = uri.split(constants_1.Constants.SAS_URI_SEPARATOR);
|
|
35
|
+
const containerUri = parts[0];
|
|
36
|
+
const sasToken = parts[1];
|
|
37
|
+
return containerUri + "/" + fileRelativePath + "?" + sasToken;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.StorageClient = StorageClient;
|
|
41
|
+
//# sourceMappingURL=storageClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storageClient.js","sourceRoot":"","sources":["../../src/utils/storageClient.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;;AAElC,sDAAsD;AACtD,6CAAkD;AAClD,mDAAgD;AAEhD,MAAa,aAAa;IACjB,KAAK,CAAC,UAAU,CAAC,GAAW,EAAE,QAAgB,EAAE,gBAAwB;QAC7E,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;YACnE,MAAM,UAAU,GAAG,IAAI,8BAAe,CAAC,aAAa,CAAC,CAAC;YACtD,MAAM,UAAU,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;YAC3D,uBAAc,CAAC,IAAI,CAAC,mBAAmB,QAAQ,GAAG,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,uBAAc,CAAC,KAAK,CAClB,2BAA2B,QAAQ,WAAW,GAAG,CAAC,IAAI,cAAc,GAAG,CAAC,OAAO,YAAY,GAAG,CAAC,KAAK,EAAE,CACvG,CAAC;QACJ,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,GAAW,EAAE,MAAc,EAAE,gBAAwB;QAC7E,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;YACnE,MAAM,UAAU,GAAG,IAAI,8BAAe,CAAC,aAAa,CAAC,CAAC;YACtD,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/C,uBAAc,CAAC,OAAO,CAAC,wBAAwB,gBAAgB,GAAG,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,uBAAc,CAAC,KAAK,CAClB,6BAA6B,gBAAgB,WAAW,GAAG,CAAC,IAAI,cAAc,GAAG,CAAC,OAAO,YAAY,GAAG,CAAC,KAAK,EAAE,CACjH,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,GAAW,EAAE,gBAAwB;QAC5D,8DAA8D;QAC9D,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,qBAAS,CAAC,iBAAiB,CAAC,CAAC;QACrD,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,OAAO,YAAY,GAAG,GAAG,GAAG,gBAAgB,GAAG,GAAG,GAAG,QAAQ,CAAC;IAChE,CAAC;CACF;AAlCD,sCAkCC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { BlockBlobClient } from \"@azure/storage-blob\";\nimport { reporterLogger } from \"../common/logger\";\nimport { Constants } from \"../common/constants\";\n\nexport class StorageClient {\n public async uploadFile(uri: string, filePath: string, fileRelativePath: string): Promise<void> {\n try {\n const cloudFilepath = this.getCloudFilepath(uri, fileRelativePath);\n const blobClient = new BlockBlobClient(cloudFilepath);\n await blobClient.uploadFile(filePath, { concurrency: 10 });\n reporterLogger.info(`\\nUploaded file ${filePath}.`);\n } catch (err: any) {\n reporterLogger.error(\n `\\nUnable to upload file ${filePath}, Name: ${err.name}, Message: ${err.message}, Stack: ${err.stack}`,\n );\n }\n }\n\n public async uploadBuffer(uri: string, buffer: string, fileRelativePath: string): Promise<void> {\n try {\n const cloudFilepath = this.getCloudFilepath(uri, fileRelativePath);\n const blobClient = new BlockBlobClient(cloudFilepath);\n await blobClient.upload(buffer, buffer.length);\n reporterLogger.verbose(`\\nUploaded buffer to ${fileRelativePath}.`);\n } catch (err: any) {\n reporterLogger.error(\n `\\nUnable to upload buffer ${fileRelativePath}, Name: ${err.name}, Message: ${err.message}, Stack: ${err.stack}`,\n );\n }\n }\n\n private getCloudFilepath(uri: string, fileRelativePath: string): string {\n // Split the uri on \"?\" to get the container uri and sas token\n const parts = uri.split(Constants.SAS_URI_SEPARATOR);\n const containerUri = parts[0];\n const sasToken = parts[1];\n return containerUri + \"/\" + fileRelativePath + \"?\" + sasToken;\n }\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { JwtPayload, VersionInfo } from "../common/types";
|
|
2
|
+
import type { TokenCredential } from "@azure/identity";
|
|
3
|
+
export declare const exitWithFailureMessage: (message: string) => never;
|
|
4
|
+
export declare const base64UrlDecode: (base64Url: string) => string;
|
|
5
|
+
export declare const parseJwt: <T = JwtPayload>(token: string) => T;
|
|
6
|
+
export declare const getAccessToken: () => string | undefined;
|
|
7
|
+
export declare const getServiceBaseURL: () => string | undefined;
|
|
8
|
+
export declare const getDefaultRunId: () => string;
|
|
9
|
+
export declare const getServiceWSEndpoint: (runId: string, os: string) => string;
|
|
10
|
+
export declare const validateServiceUrl: () => void;
|
|
11
|
+
export declare const validateMptPAT: () => void;
|
|
12
|
+
export declare const fetchOrValidateAccessToken: (credential?: TokenCredential) => Promise<string>;
|
|
13
|
+
export declare const emitReportingUrl: () => void;
|
|
14
|
+
export declare const getPlaywrightVersion: () => string;
|
|
15
|
+
export declare const getVersionInfo: (version: string) => VersionInfo;
|
|
16
|
+
export declare const validatePlaywrightVersion: () => void;
|
|
17
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAU/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAMvD,eAAO,MAAM,sBAAsB,YAAa,MAAM,KAAG,KAIxD,CAAC;AAEF,eAAO,MAAM,eAAe,cAAe,MAAM,KAAG,MAInD,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,CAAC,sBAAsB,MAAM,KAAG,CAOxD,CAAC;AAEF,eAAO,MAAM,cAAc,QAAO,MAAM,GAAG,SAE1C,CAAC;AAEF,eAAO,MAAM,iBAAiB,QAAO,MAAM,GAAG,SAE7C,CAAC;AAEF,eAAO,MAAM,eAAe,QAAO,MAIlC,CAAC;AAEF,eAAO,MAAM,oBAAoB,UAAW,MAAM,MAAM,MAAM,KAAG,MAEhE,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAO,IAKrC,CAAC;AAEF,eAAO,MAAM,cAAc,QAAO,IAiBjC,CAAC;AAEF,eAAO,MAAM,0BAA0B,gBAAuB,eAAe,KAAG,OAAO,CAAC,MAAM,CAS7F,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAO,IAUnC,CAAC;AAEF,eAAO,MAAM,oBAAoB,QAAO,MAcvC,CAAC;AAEF,eAAO,MAAM,cAAc,YAAa,MAAM,KAAG,WAYhD,CAAC;AAEF,eAAO,MAAM,yBAAyB,QAAO,IAa5C,CAAC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) Microsoft Corporation.
|
|
3
|
+
// Licensed under the MIT License.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.validatePlaywrightVersion = exports.getVersionInfo = exports.getPlaywrightVersion = exports.emitReportingUrl = exports.fetchOrValidateAccessToken = exports.validateMptPAT = exports.validateServiceUrl = exports.getServiceWSEndpoint = exports.getDefaultRunId = exports.getServiceBaseURL = exports.getAccessToken = exports.parseJwt = exports.base64UrlDecode = exports.exitWithFailureMessage = void 0;
|
|
6
|
+
const tslib_1 = require("tslib");
|
|
7
|
+
const constants_1 = require("../common/constants");
|
|
8
|
+
const messages_1 = require("../common/messages");
|
|
9
|
+
const entraIdAccessToken_1 = require("../common/entraIdAccessToken");
|
|
10
|
+
const logger_1 = require("../common/logger");
|
|
11
|
+
const reporterUtils_1 = tslib_1.__importDefault(require("./reporterUtils"));
|
|
12
|
+
const cIInfoProvider_1 = require("./cIInfoProvider");
|
|
13
|
+
const packageManager_1 = require("./packageManager");
|
|
14
|
+
const child_process_1 = require("child_process");
|
|
15
|
+
const exitWithFailureMessage = (message) => {
|
|
16
|
+
console.log();
|
|
17
|
+
console.error(message);
|
|
18
|
+
process.exit(1);
|
|
19
|
+
};
|
|
20
|
+
exports.exitWithFailureMessage = exitWithFailureMessage;
|
|
21
|
+
const base64UrlDecode = (base64Url) => {
|
|
22
|
+
const base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/");
|
|
23
|
+
const buffer = Buffer.from(base64, "base64");
|
|
24
|
+
return buffer.toString("utf-8");
|
|
25
|
+
};
|
|
26
|
+
exports.base64UrlDecode = base64UrlDecode;
|
|
27
|
+
const parseJwt = (token) => {
|
|
28
|
+
const parts = token.split(".");
|
|
29
|
+
if (parts.length !== 3) {
|
|
30
|
+
throw new Error("Invalid JWT token.");
|
|
31
|
+
}
|
|
32
|
+
const payload = (0, exports.base64UrlDecode)(parts[1]);
|
|
33
|
+
return JSON.parse(payload);
|
|
34
|
+
};
|
|
35
|
+
exports.parseJwt = parseJwt;
|
|
36
|
+
const getAccessToken = () => {
|
|
37
|
+
return process.env[constants_1.ServiceEnvironmentVariable.PLAYWRIGHT_SERVICE_ACCESS_TOKEN];
|
|
38
|
+
};
|
|
39
|
+
exports.getAccessToken = getAccessToken;
|
|
40
|
+
const getServiceBaseURL = () => {
|
|
41
|
+
return process.env[constants_1.ServiceEnvironmentVariable.PLAYWRIGHT_SERVICE_URL];
|
|
42
|
+
};
|
|
43
|
+
exports.getServiceBaseURL = getServiceBaseURL;
|
|
44
|
+
const getDefaultRunId = () => {
|
|
45
|
+
const runId = reporterUtils_1.default.getRunId(cIInfoProvider_1.CIInfoProvider.getCIInfo());
|
|
46
|
+
process.env[constants_1.ServiceEnvironmentVariable.PLAYWRIGHT_SERVICE_RUN_ID] = runId;
|
|
47
|
+
return runId;
|
|
48
|
+
};
|
|
49
|
+
exports.getDefaultRunId = getDefaultRunId;
|
|
50
|
+
const getServiceWSEndpoint = (runId, os) => {
|
|
51
|
+
return `${(0, exports.getServiceBaseURL)()}?runId=${runId}&os=${os}&api-version=${constants_1.API_VERSION}`;
|
|
52
|
+
};
|
|
53
|
+
exports.getServiceWSEndpoint = getServiceWSEndpoint;
|
|
54
|
+
const validateServiceUrl = () => {
|
|
55
|
+
const serviceUrl = (0, exports.getServiceBaseURL)();
|
|
56
|
+
if (!serviceUrl) {
|
|
57
|
+
(0, exports.exitWithFailureMessage)(messages_1.ServiceErrorMessageConstants.NO_SERVICE_URL_ERROR);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
exports.validateServiceUrl = validateServiceUrl;
|
|
61
|
+
const validateMptPAT = () => {
|
|
62
|
+
try {
|
|
63
|
+
const accessToken = (0, exports.getAccessToken)();
|
|
64
|
+
if (!accessToken) {
|
|
65
|
+
(0, exports.exitWithFailureMessage)(messages_1.ServiceErrorMessageConstants.NO_AUTH_ERROR);
|
|
66
|
+
}
|
|
67
|
+
const claims = (0, exports.parseJwt)(accessToken);
|
|
68
|
+
if (!claims.exp) {
|
|
69
|
+
(0, exports.exitWithFailureMessage)(messages_1.ServiceErrorMessageConstants.INVALID_MPT_PAT_ERROR);
|
|
70
|
+
}
|
|
71
|
+
if (Date.now() >= claims.exp * 1000) {
|
|
72
|
+
(0, exports.exitWithFailureMessage)(messages_1.ServiceErrorMessageConstants.EXPIRED_MPT_PAT_ERROR);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
logger_1.coreLogger.error(err);
|
|
77
|
+
(0, exports.exitWithFailureMessage)(messages_1.ServiceErrorMessageConstants.INVALID_MPT_PAT_ERROR);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
exports.validateMptPAT = validateMptPAT;
|
|
81
|
+
const fetchOrValidateAccessToken = async (credential) => {
|
|
82
|
+
const entraIdAccessToken = new entraIdAccessToken_1.EntraIdAccessToken(credential);
|
|
83
|
+
if (entraIdAccessToken.token && entraIdAccessToken.doesEntraIdAccessTokenNeedRotation()) {
|
|
84
|
+
await entraIdAccessToken.fetchEntraIdAccessToken();
|
|
85
|
+
}
|
|
86
|
+
if (!(0, exports.getAccessToken)()) {
|
|
87
|
+
throw new Error(messages_1.ServiceErrorMessageConstants.NO_AUTH_ERROR);
|
|
88
|
+
}
|
|
89
|
+
return (0, exports.getAccessToken)();
|
|
90
|
+
};
|
|
91
|
+
exports.fetchOrValidateAccessToken = fetchOrValidateAccessToken;
|
|
92
|
+
const emitReportingUrl = () => {
|
|
93
|
+
const regex = /wss:\/\/([\w-]+)\.api\.(playwright(?:-test|-int)?\.io|playwright\.microsoft\.com)\//;
|
|
94
|
+
const url = (0, exports.getServiceBaseURL)();
|
|
95
|
+
const match = url === null || url === void 0 ? void 0 : url.match(regex);
|
|
96
|
+
if (match && match.length >= 3) {
|
|
97
|
+
const [, region, domain] = match;
|
|
98
|
+
process.env[constants_1.ServiceEnvironmentVariable.PLAYWRIGHT_SERVICE_REPORTING_URL] =
|
|
99
|
+
`https://${region}.reporting.api.${domain}`;
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
exports.emitReportingUrl = emitReportingUrl;
|
|
103
|
+
const getPlaywrightVersion = () => {
|
|
104
|
+
if (process.env[constants_1.InternalEnvironmentVariables.MPT_PLAYWRIGHT_VERSION]) {
|
|
105
|
+
return process.env[constants_1.InternalEnvironmentVariables.MPT_PLAYWRIGHT_VERSION];
|
|
106
|
+
}
|
|
107
|
+
const packageManager = (0, packageManager_1.getPackageManager)();
|
|
108
|
+
const command = packageManager.runCommand("playwright", "--version");
|
|
109
|
+
const stdout = (0, child_process_1.execSync)(command).toString().trim();
|
|
110
|
+
const version = packageManager.getVersionFromStdout(stdout);
|
|
111
|
+
process.env[constants_1.InternalEnvironmentVariables.MPT_PLAYWRIGHT_VERSION] = version;
|
|
112
|
+
logger_1.coreLogger.info(`Playwright version being used - ${process.env[constants_1.InternalEnvironmentVariables.MPT_PLAYWRIGHT_VERSION]}`);
|
|
113
|
+
return process.env[constants_1.InternalEnvironmentVariables.MPT_PLAYWRIGHT_VERSION];
|
|
114
|
+
};
|
|
115
|
+
exports.getPlaywrightVersion = getPlaywrightVersion;
|
|
116
|
+
const getVersionInfo = (version) => {
|
|
117
|
+
const regex = /^(\d+)(?:\.(\d+))?(?:\.(\d+))?/;
|
|
118
|
+
const match = version.match(regex);
|
|
119
|
+
const versionInfo = {
|
|
120
|
+
major: 0,
|
|
121
|
+
minor: 0,
|
|
122
|
+
patch: 0,
|
|
123
|
+
};
|
|
124
|
+
versionInfo.major = match && match[1] ? parseInt(match[1], 10) : 0;
|
|
125
|
+
versionInfo.minor = match && match[2] ? parseInt(match[2], 10) : 0;
|
|
126
|
+
versionInfo.patch = match && match[3] ? parseInt(match[3], 10) : 0;
|
|
127
|
+
return versionInfo;
|
|
128
|
+
};
|
|
129
|
+
exports.getVersionInfo = getVersionInfo;
|
|
130
|
+
const validatePlaywrightVersion = () => {
|
|
131
|
+
const minimumSupportedVersion = constants_1.MINIMUM_SUPPORTED_PLAYWRIGHT_VERSION;
|
|
132
|
+
const installedVersion = (0, exports.getPlaywrightVersion)();
|
|
133
|
+
const minimumSupportedVersionInfo = (0, exports.getVersionInfo)(minimumSupportedVersion);
|
|
134
|
+
const installedVersionInfo = (0, exports.getVersionInfo)(installedVersion);
|
|
135
|
+
const isInstalledVersionGreater = installedVersionInfo.major > minimumSupportedVersionInfo.major ||
|
|
136
|
+
(installedVersionInfo.major === minimumSupportedVersionInfo.major &&
|
|
137
|
+
installedVersionInfo.minor >= minimumSupportedVersionInfo.minor);
|
|
138
|
+
if (!isInstalledVersionGreater) {
|
|
139
|
+
(0, exports.exitWithFailureMessage)(messages_1.ServiceErrorMessageConstants.INVALID_PLAYWRIGHT_VERSION_ERROR);
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
exports.validatePlaywrightVersion = validatePlaywrightVersion;
|
|
143
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { JwtPayload, VersionInfo } from \"../common/types\";\nimport {\n API_VERSION,\n InternalEnvironmentVariables,\n MINIMUM_SUPPORTED_PLAYWRIGHT_VERSION,\n ServiceEnvironmentVariable,\n} from \"../common/constants\";\nimport { ServiceErrorMessageConstants } from \"../common/messages\";\nimport { EntraIdAccessToken } from \"../common/entraIdAccessToken\";\nimport { coreLogger } from \"../common/logger\";\nimport type { TokenCredential } from \"@azure/identity\";\nimport ReporterUtils from \"./reporterUtils\";\nimport { CIInfoProvider } from \"./cIInfoProvider\";\nimport { getPackageManager } from \"./packageManager\";\nimport { execSync } from \"child_process\";\n\nexport const exitWithFailureMessage = (message: string): never => {\n console.log();\n console.error(message);\n process.exit(1);\n};\n\nexport const base64UrlDecode = (base64Url: string): string => {\n const base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const buffer = Buffer.from(base64, \"base64\");\n return buffer.toString(\"utf-8\");\n};\n\nexport const parseJwt = <T = JwtPayload>(token: string): T => {\n const parts = token.split(\".\");\n if (parts.length !== 3) {\n throw new Error(\"Invalid JWT token.\");\n }\n const payload = base64UrlDecode(parts[1]!);\n return JSON.parse(payload) as T;\n};\n\nexport const getAccessToken = (): string | undefined => {\n return process.env[ServiceEnvironmentVariable.PLAYWRIGHT_SERVICE_ACCESS_TOKEN];\n};\n\nexport const getServiceBaseURL = (): string | undefined => {\n return process.env[ServiceEnvironmentVariable.PLAYWRIGHT_SERVICE_URL];\n};\n\nexport const getDefaultRunId = (): string => {\n const runId = ReporterUtils.getRunId(CIInfoProvider.getCIInfo());\n process.env[ServiceEnvironmentVariable.PLAYWRIGHT_SERVICE_RUN_ID] = runId;\n return runId;\n};\n\nexport const getServiceWSEndpoint = (runId: string, os: string): string => {\n return `${getServiceBaseURL()}?runId=${runId}&os=${os}&api-version=${API_VERSION}`;\n};\n\nexport const validateServiceUrl = (): void => {\n const serviceUrl = getServiceBaseURL();\n if (!serviceUrl) {\n exitWithFailureMessage(ServiceErrorMessageConstants.NO_SERVICE_URL_ERROR);\n }\n};\n\nexport const validateMptPAT = (): void => {\n try {\n const accessToken = getAccessToken();\n if (!accessToken) {\n exitWithFailureMessage(ServiceErrorMessageConstants.NO_AUTH_ERROR);\n }\n const claims = parseJwt<JwtPayload>(accessToken!);\n if (!claims.exp) {\n exitWithFailureMessage(ServiceErrorMessageConstants.INVALID_MPT_PAT_ERROR);\n }\n if (Date.now() >= claims.exp! * 1000) {\n exitWithFailureMessage(ServiceErrorMessageConstants.EXPIRED_MPT_PAT_ERROR);\n }\n } catch (err) {\n coreLogger.error(err);\n exitWithFailureMessage(ServiceErrorMessageConstants.INVALID_MPT_PAT_ERROR);\n }\n};\n\nexport const fetchOrValidateAccessToken = async (credential?: TokenCredential): Promise<string> => {\n const entraIdAccessToken = new EntraIdAccessToken(credential);\n if (entraIdAccessToken.token && entraIdAccessToken.doesEntraIdAccessTokenNeedRotation()) {\n await entraIdAccessToken.fetchEntraIdAccessToken();\n }\n if (!getAccessToken()) {\n throw new Error(ServiceErrorMessageConstants.NO_AUTH_ERROR);\n }\n return getAccessToken()!;\n};\n\nexport const emitReportingUrl = (): void => {\n const regex =\n /wss:\\/\\/([\\w-]+)\\.api\\.(playwright(?:-test|-int)?\\.io|playwright\\.microsoft\\.com)\\//;\n const url = getServiceBaseURL();\n const match = url?.match(regex);\n if (match && match.length >= 3) {\n const [, region, domain] = match;\n process.env[ServiceEnvironmentVariable.PLAYWRIGHT_SERVICE_REPORTING_URL] =\n `https://${region}.reporting.api.${domain}`;\n }\n};\n\nexport const getPlaywrightVersion = (): string => {\n if (process.env[InternalEnvironmentVariables.MPT_PLAYWRIGHT_VERSION]) {\n return process.env[InternalEnvironmentVariables.MPT_PLAYWRIGHT_VERSION]!;\n }\n\n const packageManager = getPackageManager();\n const command = packageManager.runCommand(\"playwright\", \"--version\");\n const stdout = execSync(command).toString().trim();\n const version = packageManager.getVersionFromStdout(stdout);\n process.env[InternalEnvironmentVariables.MPT_PLAYWRIGHT_VERSION] = version;\n coreLogger.info(\n `Playwright version being used - ${process.env[InternalEnvironmentVariables.MPT_PLAYWRIGHT_VERSION]}`,\n );\n return process.env[InternalEnvironmentVariables.MPT_PLAYWRIGHT_VERSION]!;\n};\n\nexport const getVersionInfo = (version: string): VersionInfo => {\n const regex = /^(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?/;\n const match = version.match(regex);\n const versionInfo = {\n major: 0,\n minor: 0,\n patch: 0,\n };\n versionInfo.major = match && match[1] ? parseInt(match[1], 10) : 0;\n versionInfo.minor = match && match[2] ? parseInt(match[2], 10) : 0;\n versionInfo.patch = match && match[3] ? parseInt(match[3], 10) : 0;\n return versionInfo;\n};\n\nexport const validatePlaywrightVersion = (): void => {\n const minimumSupportedVersion = MINIMUM_SUPPORTED_PLAYWRIGHT_VERSION;\n const installedVersion = getPlaywrightVersion();\n\n const minimumSupportedVersionInfo = getVersionInfo(minimumSupportedVersion);\n const installedVersionInfo = getVersionInfo(installedVersion);\n const isInstalledVersionGreater =\n installedVersionInfo.major > minimumSupportedVersionInfo.major ||\n (installedVersionInfo.major === minimumSupportedVersionInfo.major &&\n installedVersionInfo.minor >= minimumSupportedVersionInfo.minor);\n if (!isInstalledVersionGreater) {\n exitWithFailureMessage(ServiceErrorMessageConstants.INVALID_PLAYWRIGHT_VERSION_ERROR);\n }\n};\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@azure/microsoft-playwright-testing",
|
|
3
|
+
"version": "1.0.0-alpha.20240911.2",
|
|
4
|
+
"description": "Package to integrate your Playwright test suite with Microsoft Playwright Testing service",
|
|
5
|
+
"homepage": "https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/playwrighttesting/microsoft-playwright-testing/README.md",
|
|
6
|
+
"sdk-type": "client",
|
|
7
|
+
"repository": "github:Azure/azure-sdk-for-js",
|
|
8
|
+
"keywords": [
|
|
9
|
+
"azure",
|
|
10
|
+
"cloud",
|
|
11
|
+
"playwright",
|
|
12
|
+
"playwright service",
|
|
13
|
+
"reporting",
|
|
14
|
+
"playwright testing"
|
|
15
|
+
],
|
|
16
|
+
"author": "Microsoft Corporation",
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"bugs": {
|
|
19
|
+
"url": "https://github.com/Azure/azure-sdk-for-js/issues"
|
|
20
|
+
},
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=18.0.0"
|
|
23
|
+
},
|
|
24
|
+
"sideEffects": false,
|
|
25
|
+
"main": "dist/index.js",
|
|
26
|
+
"module": "dist/index.js",
|
|
27
|
+
"types": "types/microsoft-playwright-testing.d.ts",
|
|
28
|
+
"exports": {
|
|
29
|
+
".": {
|
|
30
|
+
"types": "./dist/index.d.ts",
|
|
31
|
+
"require": "./dist/index.js",
|
|
32
|
+
"default": "./dist/index.js"
|
|
33
|
+
},
|
|
34
|
+
"./reporter": {
|
|
35
|
+
"types": "./dist/reporter/index.d.ts",
|
|
36
|
+
"require": "./dist/reporter/index.js",
|
|
37
|
+
"default": "./dist/reporter/index.js"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"files": [
|
|
41
|
+
"dist",
|
|
42
|
+
"README.md",
|
|
43
|
+
"LICENSE",
|
|
44
|
+
"CHANGELOG.md",
|
|
45
|
+
"types"
|
|
46
|
+
],
|
|
47
|
+
"scripts": {
|
|
48
|
+
"audit": "node ../../../common/scripts/rush-audit.js && rimraf node_modules package-lock.json && npm i --package-lock-only 2>&1 && npm audit",
|
|
49
|
+
"build": "npm run clean && tsc -p . && dev-tool run bundle && npm run extract-api",
|
|
50
|
+
"build:test": "tsc -p . && dev-tool run bundle",
|
|
51
|
+
"build:samples": "echo obsolete",
|
|
52
|
+
"check-format": "dev-tool run vendored prettier --list-different --config ../../../.prettierrc.json --ignore-path ../../../.prettierignore \"src/**/*.ts\" \"test/**/*.ts\" \"samples/**/*.ts\" \"*.{js,json}\"",
|
|
53
|
+
"clean": "rimraf --glob dist *.log dist-test temp types *.tgz *.xml samples/**/test-results/",
|
|
54
|
+
"execute:samples": "echo skipped",
|
|
55
|
+
"format": "dev-tool run vendored prettier --write --config ../../../.prettierrc.json --ignore-path ../../../.prettierignore \"src/**/*.ts\" \"test/**/*.ts\" \"samples/**/*.ts\" \"*.{js,json}\"",
|
|
56
|
+
"integration-test:browser": "echo skipped",
|
|
57
|
+
"integration-test:node": "echo skipped",
|
|
58
|
+
"integration-test": "npm run integration-test:node && npm run integration-test:browser",
|
|
59
|
+
"lint:fix": "eslint package.json api-extractor.json CHANGELOG.md README.md src --fix --fix-type [problem,suggestion]",
|
|
60
|
+
"lint": "eslint package.json api-extractor.json CHANGELOG.md README.md src",
|
|
61
|
+
"pack": "npm pack 2>&1",
|
|
62
|
+
"test:browser": "npm run build:test && npm run unit-test:browser && npm run integration-test:browser",
|
|
63
|
+
"test:node": "npm run build:test && npm run unit-test:node && npm run integration-test:node",
|
|
64
|
+
"test": "npm run build:test && npm run unit-test && npm run integration-test",
|
|
65
|
+
"unit-test:browser": "echo skipped",
|
|
66
|
+
"unit-test:node": "dev-tool run test:node-ts-input --no-test-proxy -- --timeout 12000 'test/**/*.spec.ts' --exit",
|
|
67
|
+
"unit-test": "npm run unit-test:node && npm run unit-test:browser",
|
|
68
|
+
"extract-api": "dev-tool run extract-api"
|
|
69
|
+
},
|
|
70
|
+
"dependencies": {
|
|
71
|
+
"@azure/identity": "^4.3.1",
|
|
72
|
+
"@azure/storage-blob": "^12.15.0",
|
|
73
|
+
"@azure/core-rest-pipeline": "^1.16.3",
|
|
74
|
+
"@azure/logger": "^1.1.4",
|
|
75
|
+
"tslib": "^2.6.0"
|
|
76
|
+
},
|
|
77
|
+
"devDependencies": {
|
|
78
|
+
"@types/debug": "^4.1.12",
|
|
79
|
+
"@types/node": "^20.12.12",
|
|
80
|
+
"@playwright/test": "^1.43.1",
|
|
81
|
+
"@azure/dev-tool": ">=1.0.0-alpha <1.0.0-alphb",
|
|
82
|
+
"rimraf": "^5.0.5",
|
|
83
|
+
"typescript": "^5.5.3",
|
|
84
|
+
"@microsoft/api-extractor": "^7.43.0",
|
|
85
|
+
"@azure/eslint-plugin-azure-sdk": ">=3.0.0-alpha <3.0.0-alphb",
|
|
86
|
+
"eslint": "^9.9.0",
|
|
87
|
+
"sinon": "^17.0.0",
|
|
88
|
+
"@types/sinon": "^17.0.0",
|
|
89
|
+
"mocha": "^10.0.0",
|
|
90
|
+
"@types/mocha": "^10.0.0",
|
|
91
|
+
"cross-env": "^7.0.2",
|
|
92
|
+
"@azure-tools/test-utils": "^1.0.1"
|
|
93
|
+
},
|
|
94
|
+
"prettier": "@azure/eslint-plugin-azure-sdk/prettier.json",
|
|
95
|
+
"//sampleConfiguration": {
|
|
96
|
+
"productName": "Microsoft Playwright Testing",
|
|
97
|
+
"productSlugs": [
|
|
98
|
+
"azure"
|
|
99
|
+
],
|
|
100
|
+
"requiredResources": {
|
|
101
|
+
"Microsoft Playwright Testing workspace": "https://learn.microsoft.com/azure/playwright-testing/"
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|