@testream/playwright-reporter 0.4.3 → 0.4.5
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/index.js +1 -14
- package/dist/reporter.d.ts.map +1 -1
- package/dist/uploader.d.ts +3 -6
- package/dist/uploader.d.ts.map +1 -1
- package/package.json +5 -2
- package/dist/index.js.map +0 -1
- package/dist/reporter.js +0 -242
- package/dist/reporter.js.map +0 -1
- package/dist/types.js +0 -3
- package/dist/types.js.map +0 -1
- package/dist/uploader.js +0 -285
- package/dist/uploader.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,14 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* @jira-test-manager/playwright-reporter
|
|
4
|
-
*
|
|
5
|
-
* Playwright reporter that generates CTRF-format test reports and
|
|
6
|
-
* automatically uploads them with artifacts to the Test Manager backend.
|
|
7
|
-
*/
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.PlaywrightCTRFReporterWithUpload = exports.default = void 0;
|
|
10
|
-
var reporter_1 = require("./reporter");
|
|
11
|
-
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return reporter_1.PlaywrightCTRFReporterWithUpload; } });
|
|
12
|
-
var reporter_2 = require("./reporter");
|
|
13
|
-
Object.defineProperty(exports, "PlaywrightCTRFReporterWithUpload", { enumerable: true, get: function () { return reporter_2.PlaywrightCTRFReporterWithUpload; } });
|
|
14
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
(()=>{"use strict";var t={649:function(t,e,r){var o=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:true});const i=o(r(928));const n=o(r(896));const s=o(r(982));class GenerateCtrfReport{constructor(t){var e,r,o,i,n,a,l,u,c,d,f,p,h,m,g,v,_,b,y;this.reporterName="playwright-ctrf-json-reporter";this.defaultOutputFile="ctrf-report.json";this.defaultOutputDir="ctrf";this.reporterConfigOptions={outputFile:(e=t===null||t===void 0?void 0:t.outputFile)!==null&&e!==void 0?e:this.defaultOutputFile,outputDir:(r=t===null||t===void 0?void 0:t.outputDir)!==null&&r!==void 0?r:this.defaultOutputDir,minimal:(o=t===null||t===void 0?void 0:t.minimal)!==null&&o!==void 0?o:false,screenshot:(i=t===null||t===void 0?void 0:t.screenshot)!==null&&i!==void 0?i:false,annotations:(n=t===null||t===void 0?void 0:t.annotations)!==null&&n!==void 0?n:false,testType:(a=t===null||t===void 0?void 0:t.testType)!==null&&a!==void 0?a:"e2e",appName:(l=t===null||t===void 0?void 0:t.appName)!==null&&l!==void 0?l:undefined,appVersion:(u=t===null||t===void 0?void 0:t.appVersion)!==null&&u!==void 0?u:undefined,osPlatform:(c=t===null||t===void 0?void 0:t.osPlatform)!==null&&c!==void 0?c:undefined,osRelease:(d=t===null||t===void 0?void 0:t.osRelease)!==null&&d!==void 0?d:undefined,osVersion:(f=t===null||t===void 0?void 0:t.osVersion)!==null&&f!==void 0?f:undefined,buildName:(p=t===null||t===void 0?void 0:t.buildName)!==null&&p!==void 0?p:undefined,buildNumber:(h=t===null||t===void 0?void 0:t.buildNumber)!==null&&h!==void 0?h:undefined,buildUrl:(m=t===null||t===void 0?void 0:t.buildUrl)!==null&&m!==void 0?m:undefined,repositoryName:(g=t===null||t===void 0?void 0:t.repositoryName)!==null&&g!==void 0?g:undefined,repositoryUrl:(v=t===null||t===void 0?void 0:t.repositoryUrl)!==null&&v!==void 0?v:undefined,branchName:(_=t===null||t===void 0?void 0:t.branchName)!==null&&_!==void 0?_:undefined,commit:(b=t===null||t===void 0?void 0:t.commit)!==null&&b!==void 0?b:undefined,testEnvironment:(y=t===null||t===void 0?void 0:t.testEnvironment)!==null&&y!==void 0?y:undefined};this.ctrfReport={reportFormat:"CTRF",specVersion:"0.0.0",reportId:s.default.randomUUID(),timestamp:(new Date).toISOString(),generatedBy:"playwright-ctrf-json-reporter",results:{tool:{name:"playwright"},summary:{tests:0,passed:0,failed:0,pending:0,skipped:0,other:0,start:0,stop:0},tests:[]}};this.ctrfEnvironment={}}onBegin(t,e){var r,o,i;this.suite=e;this.startTime=Date.now();this.ctrfReport.results.summary.start=this.startTime;if(!n.default.existsSync((r=this.reporterConfigOptions.outputDir)!==null&&r!==void 0?r:this.defaultOutputDir)){n.default.mkdirSync((o=this.reporterConfigOptions.outputDir)!==null&&o!==void 0?o:this.defaultOutputDir,{recursive:true})}this.setEnvironmentDetails(this.reporterConfigOptions);if(this.hasEnvironmentDetails(this.ctrfEnvironment)){this.ctrfReport.results.environment=this.ctrfEnvironment}this.setFilename((i=this.reporterConfigOptions.outputFile)!==null&&i!==void 0?i:this.defaultOutputFile)}onEnd(){this.ctrfReport.results.summary.stop=Date.now();if(this.suite!==undefined){if(this.suite.allTests().length>0){this.processSuite(this.suite);this.ctrfReport.results.summary.suites=this.countSuites(this.suite)}}this.writeReportToFile(this.ctrfReport)}printsToStdio(){return false}processSuite(t){for(const e of t.tests){this.processTest(e)}for(const e of t.suites){this.processSuite(e)}}processTest(t){if(t.results.length===0){return}const e=t.results[t.results.length-1];if(e!==undefined){this.updateCtrfTestResultsFromTestResult(t,e,this.ctrfReport);this.updateSummaryFromTestResult(e,this.ctrfReport)}}setFilename(t){if(t.endsWith(".json")){this.reporterConfigOptions.outputFile=t}else{this.reporterConfigOptions.outputFile=`${t}.json`}}updateCtrfTestResultsFromTestResult(t,e,r){var o,i,n,s,a,l;const u={name:t.title,status:e.status===t.expectedStatus&&e.status!=="skipped"?"passed":this.mapPlaywrightStatusToCtrf(e.status),duration:e.duration};if(this.reporterConfigOptions.minimal===false){u.start=this.updateStart(e.startTime);u.stop=this.calculateStopTime(e.startTime,e.duration);u.message=this.extractFailureDetails(e).message;u.trace=this.extractFailureDetails(e).trace;u.snippet=this.extractFailureDetails(e).snippet;u.rawStatus=e.status;u.tags=(o=t.tags)!==null&&o!==void 0?o:[];u.type=(i=this.reporterConfigOptions.testType)!==null&&i!==void 0?i:"e2e";u.filePath=t.location.file;u.retries=e.retry;u.flaky=e.status==="passed"&&e.retry>0;u.steps=[];if(e.steps.length>0){e.steps.forEach((t=>{this.processStep(u,t)}))}if(this.reporterConfigOptions.screenshot===true){u.screenshot=this.extractScreenshotBase64(e)}u.suite=this.buildSuitePath(t);if(((n=this.extractMetadata(e))===null||n===void 0?void 0:n.name)!==undefined||((s=this.extractMetadata(e))===null||s===void 0?void 0:s.version)!==undefined)u.browser=`${(a=this.extractMetadata(e))===null||a===void 0?void 0:a.name} ${(l=this.extractMetadata(e))===null||l===void 0?void 0:l.version}`;u.attachments=this.filterValidAttachments(e.attachments);u.stdout=e.stdout.map((t=>Buffer.isBuffer(t)?t.toString():String(t)));u.stderr=e.stderr.map((t=>Buffer.isBuffer(t)?t.toString():String(t)));if(this.reporterConfigOptions.annotations!==undefined){u.extra={annotations:t.annotations}}if(t.results.length>1){const e=t.results.slice(0,-1);u.retryAttempts=[];for(const t of e){const e={status:this.mapPlaywrightStatusToCtrf(t.status),duration:t.duration,message:this.extractFailureDetails(t).message,trace:this.extractFailureDetails(t).trace,snippet:this.extractFailureDetails(t).snippet};u.retryAttempts.push(e)}}}r.results.tests.push(u)}updateSummaryFromTestResult(t,e){e.results.summary.tests++;const r=this.mapPlaywrightStatusToCtrf(t.status);if(r in e.results.summary){e.results.summary[r]++}else{e.results.summary.other++}}mapPlaywrightStatusToCtrf(t){switch(t){case"passed":return"passed";case"failed":case"timedOut":case"interrupted":return"failed";case"skipped":return"skipped";case"pending":return"pending";default:return"other"}}setEnvironmentDetails(t){if(t.appName!==undefined){this.ctrfEnvironment.appName=t.appName}if(t.appVersion!==undefined){this.ctrfEnvironment.appVersion=t.appVersion}if(t.osPlatform!==undefined){this.ctrfEnvironment.osPlatform=t.osPlatform}if(t.osRelease!==undefined){this.ctrfEnvironment.osRelease=t.osRelease}if(t.osVersion!==undefined){this.ctrfEnvironment.osVersion=t.osVersion}if(t.buildName!==undefined){this.ctrfEnvironment.buildName=t.buildName}if(t.buildNumber!==undefined){this.ctrfEnvironment.buildNumber=t.buildNumber}if(t.buildUrl!==undefined){this.ctrfEnvironment.buildUrl=t.buildUrl}if(t.repositoryName!==undefined){this.ctrfEnvironment.repositoryName=t.repositoryName}if(t.repositoryUrl!==undefined){this.ctrfEnvironment.repositoryUrl=t.repositoryUrl}if(t.branchName!==undefined){this.ctrfEnvironment.branchName=t.branchName}if(t.commit!==undefined){this.ctrfEnvironment.commit=t.commit}if(t.testEnvironment!==undefined){this.ctrfEnvironment.testEnvironment=t.testEnvironment}}hasEnvironmentDetails(t){return Object.keys(t).length>0}extractMetadata(t){const e=t.attachments.find((t=>t.name==="metadata.json"));if((e===null||e===void 0?void 0:e.body)!==null&&(e===null||e===void 0?void 0:e.body)!==undefined){try{const t=e.body.toString("utf-8");return JSON.parse(t)}catch(t){if(t instanceof Error){console.error(`Error parsing browser metadata: ${t.message}`)}else{console.error("An unknown error occurred in parsing browser metadata")}}}return null}updateStart(t){const e=new Date(t);const r=Math.floor(e.getTime()/1e3);return r}calculateStopTime(t,e){const r=new Date(t);const o=new Date(r.getTime()+e);return Math.floor(o.getTime()/1e3)}buildSuitePath(t){const e=[];let r=t.parent;while(r!==undefined){if(r.title!==""){e.unshift(r.title)}r=r.parent}return e.join(" > ")}extractScreenshotBase64(t){var e;const r=t.attachments.find((t=>t.name==="screenshot"&&(t.contentType==="image/jpeg"||t.contentType==="image/png")));return(e=r===null||r===void 0?void 0:r.body)===null||e===void 0?void 0:e.toString("base64")}extractFailureDetails(t){if((t.status==="failed"||t.status==="timedOut"||t.status==="interrupted")&&t.error!==undefined){const e={};if(t.error.message!==undefined){e.message=t.error.message}if(t.error.stack!==undefined){e.trace=t.error.stack}if(t.error.snippet!==undefined){e.snippet=t.error.snippet}return e}return{}}countSuites(t){let e=0;t.suites.forEach((t=>{e+=this.countSuites(t)}));return e}writeReportToFile(t){var e,r;const o=i.default.join((e=this.reporterConfigOptions.outputDir)!==null&&e!==void 0?e:this.defaultOutputDir,(r=this.reporterConfigOptions.outputFile)!==null&&r!==void 0?r:this.defaultOutputFile);const s=JSON.stringify(t,null,2);try{n.default.writeFileSync(o,s+"\n");console.log(`${this.reporterName}: successfully written ctrf json to %s/%s`,this.reporterConfigOptions.outputDir,this.reporterConfigOptions.outputFile)}catch(t){console.error(`Error writing ctrf json report:, ${String(t)}`)}}processStep(t,e){var r;if(e.category==="test.step"){const o=e.error===undefined?this.mapPlaywrightStatusToCtrf("passed"):this.mapPlaywrightStatusToCtrf("failed");const i={name:e.title,status:o};(r=t.steps)===null||r===void 0?void 0:r.push(i)}const o=e.steps;if(o.length>0){o.forEach((e=>{this.processStep(t,e)}))}}filterValidAttachments(t){return t.filter((t=>t.path!==undefined)).map((t=>{var e;return{name:t.name,contentType:t.contentType,path:(e=t.path)!==null&&e!==void 0?e:""}}))}}e["default"]=GenerateCtrfReport},197:function(t,e,r){var o=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:true});e["default"]=void 0;var i=r(649);Object.defineProperty(e,"default",{enumerable:true,get:function(){return o(i).default}})},406:(t,e)=>{Object.defineProperty(e,"__esModule",{value:true});e.detectCIContext=detectCIContext;function detectCIContext(){const t=process.env;if(t.GITHUB_ACTIONS==="true"){return{branch:t.GITHUB_HEAD_REF||t.GITHUB_REF_NAME||t.GITHUB_REF?.replace("refs/heads/",""),commitSha:t.GITHUB_SHA,repositoryUrl:t.GITHUB_SERVER_URL&&t.GITHUB_REPOSITORY?`${t.GITHUB_SERVER_URL}/${t.GITHUB_REPOSITORY}`:undefined,buildNumber:t.GITHUB_RUN_NUMBER,buildUrl:t.GITHUB_SERVER_URL&&t.GITHUB_REPOSITORY&&t.GITHUB_RUN_ID?`${t.GITHUB_SERVER_URL}/${t.GITHUB_REPOSITORY}/actions/runs/${t.GITHUB_RUN_ID}`:undefined}}if(t.GITLAB_CI==="true"){return{branch:t.CI_COMMIT_BRANCH||t.CI_MERGE_REQUEST_SOURCE_BRANCH_NAME,commitSha:t.CI_COMMIT_SHA,repositoryUrl:t.CI_PROJECT_URL,buildNumber:t.CI_PIPELINE_IID,buildUrl:t.CI_PIPELINE_URL}}if(t.TF_BUILD==="True"){return{branch:t.BUILD_SOURCEBRANCH?.replace("refs/heads/",""),commitSha:t.BUILD_SOURCEVERSION,repositoryUrl:t.BUILD_REPOSITORY_URI,buildNumber:t.BUILD_BUILDNUMBER,buildUrl:t.SYSTEM_TEAMFOUNDATIONCOLLECTIONURI&&t.SYSTEM_TEAMPROJECT&&t.BUILD_BUILDID?`${t.SYSTEM_TEAMFOUNDATIONCOLLECTIONURI}${t.SYSTEM_TEAMPROJECT}/_build/results?buildId=${t.BUILD_BUILDID}`:undefined}}if(t.CIRCLECI==="true"){return{branch:t.CIRCLE_BRANCH,commitSha:t.CIRCLE_SHA1,repositoryUrl:t.CIRCLE_REPOSITORY_URL,buildNumber:t.CIRCLE_BUILD_NUM,buildUrl:t.CIRCLE_BUILD_URL}}if(t.JENKINS_URL){return{branch:t.GIT_BRANCH?.replace("origin/",""),commitSha:t.GIT_COMMIT,repositoryUrl:t.GIT_URL,buildNumber:t.BUILD_NUMBER,buildUrl:t.BUILD_URL}}if(t.BITBUCKET_BUILD_NUMBER){return{branch:t.BITBUCKET_BRANCH,commitSha:t.BITBUCKET_COMMIT,repositoryUrl:t.BITBUCKET_GIT_HTTP_ORIGIN,buildNumber:t.BITBUCKET_BUILD_NUMBER,buildUrl:t.BITBUCKET_REPO_FULL_NAME&&t.BITBUCKET_BUILD_NUMBER?`https://bitbucket.org/${t.BITBUCKET_REPO_FULL_NAME}/pipelines/results/${t.BITBUCKET_BUILD_NUMBER}`:undefined}}return{}}},827:(t,e)=>{Object.defineProperty(e,"__esModule",{value:true})},322:function(t,e,r){var o=this&&this.__createBinding||(Object.create?function(t,e,r,o){if(o===undefined)o=r;var i=Object.getOwnPropertyDescriptor(e,r);if(!i||("get"in i?!e.__esModule:i.writable||i.configurable)){i={enumerable:true,get:function(){return e[r]}}}Object.defineProperty(t,o,i)}:function(t,e,r,o){if(o===undefined)o=r;t[o]=e[r]});var i=this&&this.__exportStar||function(t,e){for(var r in t)if(r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r))o(e,t,r)};Object.defineProperty(e,"__esModule",{value:true});e.detectCIContext=void 0;i(r(827),e);var n=r(406);Object.defineProperty(e,"detectCIContext",{enumerable:true,get:function(){return n.detectCIContext}})},665:function(t,e,r){var o=this&&this.__createBinding||(Object.create?function(t,e,r,o){if(o===undefined)o=r;var i=Object.getOwnPropertyDescriptor(e,r);if(!i||("get"in i?!e.__esModule:i.writable||i.configurable)){i={enumerable:true,get:function(){return e[r]}}}Object.defineProperty(t,o,i)}:function(t,e,r,o){if(o===undefined)o=r;t[o]=e[r]});var i=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:true,value:e})}:function(t,e){t["default"]=e});var n=this&&this.__importStar||function(){var ownKeys=function(t){ownKeys=Object.getOwnPropertyNames||function(t){var e=[];for(var r in t)if(Object.prototype.hasOwnProperty.call(t,r))e[e.length]=r;return e};return ownKeys(t)};return function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r=ownKeys(t),n=0;n<r.length;n++)if(r[n]!=="default")o(e,t,r[n]);i(e,t);return e}}();var s=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:true});e.PlaywrightCTRFReporterWithUpload=void 0;const a=n(r(943));const l=n(r(928));const u=r(10);const c=s(r(197));class PlaywrightCTRFReporterWithUpload{constructor(t){this.uploader=null;if(!t.apiKey){throw new Error("PlaywrightCTRFReporter: apiKey is required")}if(!t.projectKey){throw new Error("PlaywrightCTRFReporter: projectKey is required")}this.config={uploadEnabled:true,outputFile:"ctrf-report.json",outputDir:"ctrf",failOnUploadError:false,screenshot:true,annotations:false,testType:"e2e",...t};const e=(0,u.detectGitContext)();if(!this.config.branch&&e.branch){this.config.branch=e.branch}if(!this.config.commitSha&&e.commitSha){this.config.commitSha=e.commitSha}if(!this.config.repositoryUrl&&e.repositoryUrl){this.config.repositoryUrl=e.repositoryUrl}this.reportPath=l.join(this.config.outputDir,this.config.outputFile);const r={outputFile:this.config.outputFile,outputDir:this.config.outputDir,screenshot:this.config.screenshot,annotations:this.config.annotations,testType:this.config.testType};if(this.config.appName)r.appName=this.config.appName;if(this.config.appVersion)r.appVersion=this.config.appVersion;if(this.config.buildName)r.buildName=this.config.buildName;if(this.config.buildNumber)r.buildNumber=this.config.buildNumber;if(this.config.buildUrl)r.buildUrl=this.config.buildUrl;if(this.config.testEnvironment)r.testEnvironment=this.config.testEnvironment;if(this.config.branch)r.branchName=this.config.branch;if(this.config.commitSha)r.commit=this.config.commitSha;this.ctrfReporter=new c.default(r);if(this.config.uploadEnabled){this.uploader=new u.ReportUploader(this.config)}}onBegin(t,e){if(this.ctrfReporter.onBegin){this.ctrfReporter.onBegin(t,e)}console.log("");console.log("=".repeat(60));console.log("Playwright Test Manager Reporter");console.log("=".repeat(60));if(this.config.uploadEnabled){console.log(`Project: ${this.config.projectKey}`);if(this.config.branch)console.log(`Branch: ${this.config.branch}`);if(this.config.commitSha)console.log(`Commit: ${this.config.commitSha.substring(0,7)}`);if(this.config.repositoryUrl)console.log(`Repository: ${this.config.repositoryUrl}`)}else{console.log("Upload: Disabled")}console.log(`Report: ${this.reportPath}`);console.log("=".repeat(60));console.log("")}onTestBegin(t,e){if(this.ctrfReporter.onTestBegin){this.ctrfReporter.onTestBegin(t,e)}}onTestEnd(t,e){if(this.ctrfReporter.onTestEnd){this.ctrfReporter.onTestEnd(t,e)}}onError(t){if(this.ctrfReporter.onError){this.ctrfReporter.onError(t)}}onStepBegin(t,e,r){if(this.ctrfReporter.onStepBegin){this.ctrfReporter.onStepBegin(t,e,r)}}onStepEnd(t,e,r){if(this.ctrfReporter.onStepEnd){this.ctrfReporter.onStepEnd(t,e,r)}}async onEnd(t){if(this.ctrfReporter.onEnd){await this.ctrfReporter.onEnd(t)}if(!this.config.uploadEnabled||!this.uploader){console.log("");console.log("CTRF report generated");console.log(` ${this.reportPath}`);return}console.log("");console.log("=".repeat(60));console.log("Uploading Test Results");console.log("=".repeat(60));try{const t=await a.readFile(this.reportPath,"utf-8");const e=JSON.parse(t);e.results.tool.name="playwright";if(!e.extra){e.extra={}}if(this.config.branch&&!e.extra.branch){e.extra.branch=this.config.branch}if(this.config.commitSha&&!e.extra.commitSha){e.extra.commitSha=this.config.commitSha}const r=await this.uploader.uploadReport(e);if(r.success){console.log("=".repeat(60));console.log("Upload Complete");console.log("=".repeat(60));console.log("")}else{console.error("Upload completed with errors");console.error("")}}catch(t){const e=t instanceof Error?t.message:String(t);console.error("");console.error("=".repeat(60));console.error("Upload Failed");console.error("=".repeat(60));console.error(`Error: ${e}`);console.error("");if(this.config.failOnUploadError){throw t}}}}e.PlaywrightCTRFReporterWithUpload=PlaywrightCTRFReporterWithUpload;e["default"]=PlaywrightCTRFReporterWithUpload},10:function(t,e,r){var o=this&&this.__createBinding||(Object.create?function(t,e,r,o){if(o===undefined)o=r;var i=Object.getOwnPropertyDescriptor(e,r);if(!i||("get"in i?!e.__esModule:i.writable||i.configurable)){i={enumerable:true,get:function(){return e[r]}}}Object.defineProperty(t,o,i)}:function(t,e,r,o){if(o===undefined)o=r;t[o]=e[r]});var i=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:true,value:e})}:function(t,e){t["default"]=e});var n=this&&this.__importStar||function(){var ownKeys=function(t){ownKeys=Object.getOwnPropertyNames||function(t){var e=[];for(var r in t)if(Object.prototype.hasOwnProperty.call(t,r))e[e.length]=r;return e};return ownKeys(t)};return function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r=ownKeys(t),n=0;n<r.length;n++)if(r[n]!=="default")o(e,t,r[n]);i(e,t);return e}}();Object.defineProperty(e,"__esModule",{value:true});e.detectGitContext=e.ReportUploader=void 0;const s=n(r(943));const a=n(r(928));const l=r(982);const u=r(322);class ReportUploader{constructor(t){this.apiUrl="https://test-manager-backend.fly.dev";this.config={apiKey:t.apiKey,projectKey:t.projectKey,branch:t.branch,commitSha:t.commitSha,repositoryUrl:t.repositoryUrl,failOnUploadError:t.failOnUploadError??false}}async uploadReport(t){if(!t.reportId){t.reportId=(0,l.randomUUID)();console.log(`Generated reportId: ${t.reportId}`)}try{console.log("Uploading test results to backend...");const e={reportId:t.reportId,report:t,commitSha:this.config.commitSha,branch:this.config.branch,repositoryUrl:this.config.repositoryUrl};const r=await fetch(`${this.apiUrl}/api/v1/ingest`,{method:"POST",headers:{"X-API-KEY":this.config.apiKey,"Content-Type":"application/json"},body:JSON.stringify(e)});if(r.status===409){const e=await r.json();console.warn(`Report already exists: ${e.reportId}`);return{success:true,reportId:e.reportId||t.reportId}}if(!r.ok){let t;try{const e=await r.json();t=e.error||`HTTP ${r.status}`;if(e.details){t+=`: ${e.details}`}}catch{t=await r.text()}throw new Error(`API ingest failed: ${t}`)}const o=await r.json();console.log(`Report uploaded successfully`);console.log(` Report ID: ${o.reportId}`);console.log(` Test Run ID: ${o.testRunId}`);console.log(` Summary: ${o.summary.passed}/${o.summary.total} passed`);await this.uploadArtifacts(t,o);return{success:true,reportId:o.reportId,testRunId:o.testRunId,summary:o.summary}}catch(e){const r=e instanceof Error?e.message:String(e);const o=`Failed to upload report: ${r}`;if(this.config.failOnUploadError){throw new Error(o)}else{console.error(`${o}`);return{success:false,reportId:t.reportId,error:r}}}}async uploadArtifacts(t,e){try{const r=t.results.tests.reduce(((t,e)=>t+(e.attachments?.length||0)),0);if(r===0){console.log("--- Artifact Upload: No artifacts found to upload. ---");return 0}console.log(`--- Artifact Upload: Starting (${r} artifact(s)) ---`);let o=0;for(const r of t.results.tests){if(!r.attachments||r.attachments.length===0){continue}const t=e.testResults.find((t=>t.name===r.name));if(!t){console.warn(`[Artifact] Could not find test result for: ${r.name}`);continue}for(const i of r.attachments){console.log(`[Artifact] Preparing to upload: ${i.path}`);try{const r=await this.uploadSingleArtifact(t.id,i,e.reportId);if(r){o++}}catch(t){const e=t instanceof Error?t.message:String(t);if(e.includes("File not found")){console.error(`[Artifact] File not found: ${i.path}`)}else{console.error(`[Artifact] Failed to upload: ${i.path}`);console.error(`[Artifact] Error:`,e)}}}}console.log(`--- Artifact Upload: Completed. Total artifacts attempted: ${r}, uploaded: ${o} ---`);return o}catch(t){const e=t instanceof Error?t.message:String(t);const r=`Failed to upload artifacts: ${e}`;if(this.config.failOnUploadError){throw new Error(r)}else{console.error(`${r}`);return 0}}}async uploadSingleArtifact(t,e,r){const o=a.resolve(e.path);try{await s.access(o)}catch{console.warn(` File not found: ${o}`);return false}let i;try{i=await s.readFile(o)}catch(t){const e=t instanceof Error?t.message:String(t);throw new Error(`Failed to read file: ${e}`)}const n=new Blob([i],{type:e.contentType});const l=new FormData;l.append("testResultId",t);l.append("ctrfAttachmentName",e.name);l.append("file",n,a.basename(o));const u=`${this.apiUrl}/api/v1/artifacts/${r}`;const c=await fetch(u,{method:"POST",headers:{"X-API-KEY":this.config.apiKey},body:l});if(!c.ok){const t=await c.text();throw new Error(`HTTP ${c.status}: ${t}`)}return true}}e.ReportUploader=ReportUploader;e.detectGitContext=u.detectCIContext},982:t=>{t.exports=require("crypto")},896:t=>{t.exports=require("fs")},943:t=>{t.exports=require("fs/promises")},928:t=>{t.exports=require("path")}};var e={};function __nccwpck_require__(r){var o=e[r];if(o!==undefined){return o.exports}var i=e[r]={exports:{}};var n=true;try{t[r].call(i.exports,i,i.exports,__nccwpck_require__);n=false}finally{if(n)delete e[r]}return i.exports}if(typeof __nccwpck_require__!=="undefined")__nccwpck_require__.ab=__dirname+"/";var r={};(()=>{var t=r;Object.defineProperty(t,"__esModule",{value:true});t.PlaywrightCTRFReporterWithUpload=t["default"]=void 0;var e=__nccwpck_require__(665);Object.defineProperty(t,"default",{enumerable:true,get:function(){return e.PlaywrightCTRFReporterWithUpload}});var o=__nccwpck_require__(665);Object.defineProperty(t,"PlaywrightCTRFReporterWithUpload",{enumerable:true,get:function(){return o.PlaywrightCTRFReporterWithUpload}})})();module.exports=r})();
|
package/dist/reporter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,UAAU,EACV,KAAK,EACL,QAAQ,EACR,UAAU,EACV,UAAU,EACX,MAAM,2BAA2B,CAAC;AAInC,OAAO,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAC;AAMvD;;GAEG;AACH,qBAAa,gCAAiC,YAAW,QAAQ;IAC/D,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,YAAY,CAAW;IAC/B,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,EAAE,4BAA4B;IA+DhD;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAsB/C;;OAEG;IACH,WAAW,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAMtD;;OAEG;IACH,SAAS,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAMpD;;OAEG;IACH,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAM5B;;OAEG;IACH,WAAW,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI;IAMjE;;OAEG;IACH,SAAS,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI;IAM/D;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,UAAU,EACV,KAAK,EACL,QAAQ,EACR,UAAU,EACV,UAAU,EACX,MAAM,2BAA2B,CAAC;AAInC,OAAO,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAC;AAMvD;;GAEG;AACH,qBAAa,gCAAiC,YAAW,QAAQ;IAC/D,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,YAAY,CAAW;IAC/B,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,EAAE,4BAA4B;IA+DhD;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAsB/C;;OAEG;IACH,WAAW,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAMtD;;OAEG;IACH,SAAS,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAMpD;;OAEG;IACH,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAM5B;;OAEG;IACH,WAAW,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI;IAMjE;;OAEG;IACH,SAAS,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI;IAM/D;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAgE/C;AAED,eAAe,gCAAgC,CAAC"}
|
package/dist/uploader.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CTRFReport, UploadResult } from '@jira-test-manager/shared-types';
|
|
1
|
+
import { CTRFReport, UploadResult, detectCIContext } from '@jira-test-manager/shared-types';
|
|
2
2
|
import { PlaywrightCTRFReporterConfig } from './types';
|
|
3
3
|
/**
|
|
4
4
|
* Upload CTRF report and artifacts to the backend API
|
|
@@ -22,10 +22,7 @@ export declare class ReportUploader {
|
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
24
|
* Detect git context from environment variables
|
|
25
|
+
* @deprecated Use detectCIContext from @jira-test-manager/shared-types instead
|
|
25
26
|
*/
|
|
26
|
-
export declare
|
|
27
|
-
branch?: string;
|
|
28
|
-
commitSha?: string;
|
|
29
|
-
repositoryUrl?: string;
|
|
30
|
-
};
|
|
27
|
+
export declare const detectGitContext: typeof detectCIContext;
|
|
31
28
|
//# sourceMappingURL=uploader.d.ts.map
|
package/dist/uploader.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploader.d.ts","sourceRoot":"","sources":["../src/uploader.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,UAAU,EAIV,YAAY,
|
|
1
|
+
{"version":3,"file":"uploader.d.ts","sourceRoot":"","sources":["../src/uploader.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,UAAU,EAIV,YAAY,EACZ,eAAe,EAChB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAC;AAEvD;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAGiE;IAE/E,OAAO,CAAC,MAAM,CAAkD;gBAEpD,MAAM,EAAE,4BAA4B;IAWhD;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAoF7D;;OAEG;YACW,eAAe;IAyE7B;;OAEG;YACW,oBAAoB;CAmDnC;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,wBAAkB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@testream/playwright-reporter",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.5",
|
|
4
4
|
"description": "Playwright CTRF reporter with automatic upload to Testream",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"scripts": {
|
|
8
|
-
"build": "
|
|
8
|
+
"build": "npm run build:bundle && npm run build:types",
|
|
9
|
+
"build:bundle": "ncc build src/index.ts -o dist --minify",
|
|
10
|
+
"build:types": "tsc --declaration --emitDeclarationOnly --outDir dist",
|
|
9
11
|
"format": "prettier --write '**/*.ts'",
|
|
10
12
|
"lint": "eslint src/**/*.ts",
|
|
11
13
|
"prepublishOnly": "npm run build",
|
|
@@ -42,6 +44,7 @@
|
|
|
42
44
|
"@types/node": "^20.10.6",
|
|
43
45
|
"@typescript-eslint/eslint-plugin": "^6.17.0",
|
|
44
46
|
"@typescript-eslint/parser": "^6.17.0",
|
|
47
|
+
"@vercel/ncc": "^0.38.1",
|
|
45
48
|
"dotenv": "^17.2.3",
|
|
46
49
|
"eslint": "^8.56.0",
|
|
47
50
|
"prettier": "^3.1.1",
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,uCAAyE;AAAhE,mGAAA,gCAAgC,OAAW;AACpD,uCAA8D;AAArD,4HAAA,gCAAgC,OAAA"}
|
package/dist/reporter.js
DELETED
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.PlaywrightCTRFReporterWithUpload = void 0;
|
|
40
|
-
const fs = __importStar(require("fs/promises"));
|
|
41
|
-
const path = __importStar(require("path"));
|
|
42
|
-
const uploader_1 = require("./uploader");
|
|
43
|
-
// Import the underlying CTRF reporter
|
|
44
|
-
const playwright_ctrf_json_reporter_1 = __importDefault(require("playwright-ctrf-json-reporter"));
|
|
45
|
-
/**
|
|
46
|
-
* Playwright Reporter that generates CTRF reports and uploads them to a backend API
|
|
47
|
-
*/
|
|
48
|
-
class PlaywrightCTRFReporterWithUpload {
|
|
49
|
-
constructor(config) {
|
|
50
|
-
this.uploader = null;
|
|
51
|
-
// Validate required configuration (apiUrl is now internal)
|
|
52
|
-
if (!config.apiKey) {
|
|
53
|
-
throw new Error('PlaywrightCTRFReporter: apiKey is required');
|
|
54
|
-
}
|
|
55
|
-
if (!config.projectKey) {
|
|
56
|
-
throw new Error('PlaywrightCTRFReporter: projectKey is required');
|
|
57
|
-
}
|
|
58
|
-
// Set defaults and inject internalApiUrl
|
|
59
|
-
this.config = {
|
|
60
|
-
uploadEnabled: true,
|
|
61
|
-
outputFile: 'ctrf-report.json',
|
|
62
|
-
outputDir: 'ctrf',
|
|
63
|
-
failOnUploadError: false,
|
|
64
|
-
screenshot: true,
|
|
65
|
-
annotations: false,
|
|
66
|
-
testType: 'e2e',
|
|
67
|
-
...config
|
|
68
|
-
};
|
|
69
|
-
// Auto-detect git context if not provided
|
|
70
|
-
const gitContext = (0, uploader_1.detectGitContext)();
|
|
71
|
-
if (!this.config.branch && gitContext.branch) {
|
|
72
|
-
this.config.branch = gitContext.branch;
|
|
73
|
-
}
|
|
74
|
-
if (!this.config.commitSha && gitContext.commitSha) {
|
|
75
|
-
this.config.commitSha = gitContext.commitSha;
|
|
76
|
-
}
|
|
77
|
-
if (!this.config.repositoryUrl && gitContext.repositoryUrl) {
|
|
78
|
-
this.config.repositoryUrl = gitContext.repositoryUrl;
|
|
79
|
-
}
|
|
80
|
-
// Calculate full report path
|
|
81
|
-
this.reportPath = path.join(this.config.outputDir, this.config.outputFile);
|
|
82
|
-
// Initialize the underlying CTRF reporter
|
|
83
|
-
const ctrfConfig = {
|
|
84
|
-
outputFile: this.config.outputFile,
|
|
85
|
-
outputDir: this.config.outputDir,
|
|
86
|
-
screenshot: this.config.screenshot,
|
|
87
|
-
annotations: this.config.annotations,
|
|
88
|
-
testType: this.config.testType,
|
|
89
|
-
};
|
|
90
|
-
// Add optional environment configuration
|
|
91
|
-
if (this.config.appName)
|
|
92
|
-
ctrfConfig.appName = this.config.appName;
|
|
93
|
-
if (this.config.appVersion)
|
|
94
|
-
ctrfConfig.appVersion = this.config.appVersion;
|
|
95
|
-
if (this.config.buildName)
|
|
96
|
-
ctrfConfig.buildName = this.config.buildName;
|
|
97
|
-
if (this.config.buildNumber)
|
|
98
|
-
ctrfConfig.buildNumber = this.config.buildNumber;
|
|
99
|
-
if (this.config.buildUrl)
|
|
100
|
-
ctrfConfig.buildUrl = this.config.buildUrl;
|
|
101
|
-
if (this.config.testEnvironment)
|
|
102
|
-
ctrfConfig.testEnvironment = this.config.testEnvironment;
|
|
103
|
-
if (this.config.branch)
|
|
104
|
-
ctrfConfig.branchName = this.config.branch;
|
|
105
|
-
if (this.config.commitSha)
|
|
106
|
-
ctrfConfig.commit = this.config.commitSha;
|
|
107
|
-
this.ctrfReporter = new playwright_ctrf_json_reporter_1.default(ctrfConfig);
|
|
108
|
-
// Initialize uploader if upload is enabled
|
|
109
|
-
if (this.config.uploadEnabled) {
|
|
110
|
-
this.uploader = new uploader_1.ReportUploader(this.config);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Called once before running tests
|
|
115
|
-
*/
|
|
116
|
-
onBegin(config, suite) {
|
|
117
|
-
if (this.ctrfReporter.onBegin) {
|
|
118
|
-
this.ctrfReporter.onBegin(config, suite);
|
|
119
|
-
}
|
|
120
|
-
console.log('');
|
|
121
|
-
console.log('='.repeat(60));
|
|
122
|
-
console.log('Playwright Test Manager Reporter');
|
|
123
|
-
console.log('='.repeat(60));
|
|
124
|
-
if (this.config.uploadEnabled) {
|
|
125
|
-
console.log(`Project: ${this.config.projectKey}`);
|
|
126
|
-
if (this.config.branch)
|
|
127
|
-
console.log(`Branch: ${this.config.branch}`);
|
|
128
|
-
if (this.config.commitSha)
|
|
129
|
-
console.log(`Commit: ${this.config.commitSha.substring(0, 7)}`);
|
|
130
|
-
if (this.config.repositoryUrl)
|
|
131
|
-
console.log(`Repository: ${this.config.repositoryUrl}`);
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
console.log('Upload: Disabled');
|
|
135
|
-
}
|
|
136
|
-
console.log(`Report: ${this.reportPath}`);
|
|
137
|
-
console.log('='.repeat(60));
|
|
138
|
-
console.log('');
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Called after a test has been started
|
|
142
|
-
*/
|
|
143
|
-
onTestBegin(test, result) {
|
|
144
|
-
if (this.ctrfReporter.onTestBegin) {
|
|
145
|
-
this.ctrfReporter.onTestBegin(test, result);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Called after a test has been finished
|
|
150
|
-
*/
|
|
151
|
-
onTestEnd(test, result) {
|
|
152
|
-
if (this.ctrfReporter.onTestEnd) {
|
|
153
|
-
this.ctrfReporter.onTestEnd(test, result);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Called on some global error
|
|
158
|
-
*/
|
|
159
|
-
onError(error) {
|
|
160
|
-
if (this.ctrfReporter.onError) {
|
|
161
|
-
this.ctrfReporter.onError(error);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Called after a step has been started
|
|
166
|
-
*/
|
|
167
|
-
onStepBegin(test, result, step) {
|
|
168
|
-
if (this.ctrfReporter.onStepBegin) {
|
|
169
|
-
this.ctrfReporter.onStepBegin(test, result, step);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Called after a step has been finished
|
|
174
|
-
*/
|
|
175
|
-
onStepEnd(test, result, step) {
|
|
176
|
-
if (this.ctrfReporter.onStepEnd) {
|
|
177
|
-
this.ctrfReporter.onStepEnd(test, result, step);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Called after all tests have been run
|
|
182
|
-
*/
|
|
183
|
-
async onEnd(result) {
|
|
184
|
-
// Let the underlying CTRF reporter finish writing the report
|
|
185
|
-
if (this.ctrfReporter.onEnd) {
|
|
186
|
-
await this.ctrfReporter.onEnd(result);
|
|
187
|
-
}
|
|
188
|
-
// If upload is disabled, we're done
|
|
189
|
-
if (!this.config.uploadEnabled || !this.uploader) {
|
|
190
|
-
console.log('');
|
|
191
|
-
console.log('CTRF report generated');
|
|
192
|
-
console.log(` ${this.reportPath}`);
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
console.log('');
|
|
196
|
-
console.log('='.repeat(60));
|
|
197
|
-
console.log('Uploading Test Results');
|
|
198
|
-
console.log('='.repeat(60));
|
|
199
|
-
try {
|
|
200
|
-
// Read the generated CTRF report
|
|
201
|
-
const reportContent = await fs.readFile(this.reportPath, 'utf-8');
|
|
202
|
-
const report = JSON.parse(reportContent);
|
|
203
|
-
// Add git context to report if not already present
|
|
204
|
-
if (!report.extra) {
|
|
205
|
-
report.extra = {};
|
|
206
|
-
}
|
|
207
|
-
if (this.config.branch && !report.extra.branch) {
|
|
208
|
-
report.extra.branch = this.config.branch;
|
|
209
|
-
}
|
|
210
|
-
if (this.config.commitSha && !report.extra.commitSha) {
|
|
211
|
-
report.extra.commitSha = this.config.commitSha;
|
|
212
|
-
}
|
|
213
|
-
// Upload report (artifacts are uploaded internally)
|
|
214
|
-
const uploadResult = await this.uploader.uploadReport(report);
|
|
215
|
-
if (uploadResult.success) {
|
|
216
|
-
console.log('='.repeat(60));
|
|
217
|
-
console.log('Upload Complete');
|
|
218
|
-
console.log('='.repeat(60));
|
|
219
|
-
console.log('');
|
|
220
|
-
}
|
|
221
|
-
else {
|
|
222
|
-
console.error('Upload completed with errors');
|
|
223
|
-
console.error('');
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
catch (error) {
|
|
227
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
228
|
-
console.error('');
|
|
229
|
-
console.error('='.repeat(60));
|
|
230
|
-
console.error('Upload Failed');
|
|
231
|
-
console.error('='.repeat(60));
|
|
232
|
-
console.error(`Error: ${errorMessage}`);
|
|
233
|
-
console.error('');
|
|
234
|
-
if (this.config.failOnUploadError) {
|
|
235
|
-
throw error;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
exports.PlaywrightCTRFReporterWithUpload = PlaywrightCTRFReporterWithUpload;
|
|
241
|
-
exports.default = PlaywrightCTRFReporterWithUpload;
|
|
242
|
-
//# sourceMappingURL=reporter.js.map
|
package/dist/reporter.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
DELETED
package/dist/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/dist/uploader.js
DELETED
|
@@ -1,285 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.ReportUploader = void 0;
|
|
37
|
-
exports.detectGitContext = detectGitContext;
|
|
38
|
-
const fs = __importStar(require("fs/promises"));
|
|
39
|
-
const path = __importStar(require("path"));
|
|
40
|
-
const crypto_1 = require("crypto");
|
|
41
|
-
/**
|
|
42
|
-
* Upload CTRF report and artifacts to the backend API
|
|
43
|
-
*/
|
|
44
|
-
class ReportUploader {
|
|
45
|
-
constructor(config) {
|
|
46
|
-
this.apiUrl = 'https://test-manager-backend.fly.dev';
|
|
47
|
-
this.config = {
|
|
48
|
-
apiKey: config.apiKey,
|
|
49
|
-
projectKey: config.projectKey,
|
|
50
|
-
branch: config.branch,
|
|
51
|
-
commitSha: config.commitSha,
|
|
52
|
-
repositoryUrl: config.repositoryUrl,
|
|
53
|
-
failOnUploadError: config.failOnUploadError ?? false,
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Upload CTRF report to the backend
|
|
58
|
-
*/
|
|
59
|
-
async uploadReport(report) {
|
|
60
|
-
// Ensure reportId exists
|
|
61
|
-
if (!report.reportId) {
|
|
62
|
-
report.reportId = (0, crypto_1.randomUUID)();
|
|
63
|
-
console.log(`Generated reportId: ${report.reportId}`);
|
|
64
|
-
}
|
|
65
|
-
try {
|
|
66
|
-
console.log('Uploading test results to backend...');
|
|
67
|
-
const ingestPayload = {
|
|
68
|
-
reportId: report.reportId,
|
|
69
|
-
report,
|
|
70
|
-
commitSha: this.config.commitSha,
|
|
71
|
-
branch: this.config.branch,
|
|
72
|
-
repositoryUrl: this.config.repositoryUrl,
|
|
73
|
-
};
|
|
74
|
-
const response = await fetch(`${this.apiUrl}/api/v1/ingest`, {
|
|
75
|
-
method: 'POST',
|
|
76
|
-
headers: {
|
|
77
|
-
'X-API-KEY': this.config.apiKey,
|
|
78
|
-
'Content-Type': 'application/json',
|
|
79
|
-
},
|
|
80
|
-
body: JSON.stringify(ingestPayload),
|
|
81
|
-
});
|
|
82
|
-
// Handle idempotent duplicate reports
|
|
83
|
-
if (response.status === 409) {
|
|
84
|
-
const errorData = (await response.json());
|
|
85
|
-
console.warn(`Report already exists: ${errorData.reportId}`);
|
|
86
|
-
return {
|
|
87
|
-
success: true,
|
|
88
|
-
reportId: errorData.reportId || report.reportId,
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
if (!response.ok) {
|
|
92
|
-
let errorMessage;
|
|
93
|
-
try {
|
|
94
|
-
const errorData = (await response.json());
|
|
95
|
-
errorMessage = errorData.error || `HTTP ${response.status}`;
|
|
96
|
-
if (errorData.details) {
|
|
97
|
-
errorMessage += `: ${errorData.details}`;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
catch {
|
|
101
|
-
errorMessage = await response.text();
|
|
102
|
-
}
|
|
103
|
-
throw new Error(`API ingest failed: ${errorMessage}`);
|
|
104
|
-
}
|
|
105
|
-
const result = (await response.json());
|
|
106
|
-
console.log(`Report uploaded successfully`);
|
|
107
|
-
console.log(` Report ID: ${result.reportId}`);
|
|
108
|
-
console.log(` Test Run ID: ${result.testRunId}`);
|
|
109
|
-
console.log(` Summary: ${result.summary.passed}/${result.summary.total} passed`);
|
|
110
|
-
// Upload artifacts if present
|
|
111
|
-
await this.uploadArtifacts(report, result);
|
|
112
|
-
return {
|
|
113
|
-
success: true,
|
|
114
|
-
reportId: result.reportId,
|
|
115
|
-
testRunId: result.testRunId,
|
|
116
|
-
summary: result.summary,
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
catch (error) {
|
|
120
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
121
|
-
const message = `Failed to upload report: ${errorMessage}`;
|
|
122
|
-
if (this.config.failOnUploadError) {
|
|
123
|
-
throw new Error(message);
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
console.error(`${message}`);
|
|
127
|
-
return {
|
|
128
|
-
success: false,
|
|
129
|
-
reportId: report.reportId,
|
|
130
|
-
error: errorMessage,
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Upload all artifacts from the CTRF report (internal method)
|
|
137
|
-
*/
|
|
138
|
-
async uploadArtifacts(report, ingestResponse) {
|
|
139
|
-
try {
|
|
140
|
-
const totalAttachments = report.results.tests.reduce((sum, test) => sum + (test.attachments?.length || 0), 0);
|
|
141
|
-
if (totalAttachments === 0) {
|
|
142
|
-
console.log('--- Artifact Upload: No artifacts found to upload. ---');
|
|
143
|
-
return 0;
|
|
144
|
-
}
|
|
145
|
-
console.log(`--- Artifact Upload: Starting (${totalAttachments} artifact(s)) ---`);
|
|
146
|
-
let uploadedCount = 0;
|
|
147
|
-
// Iterate through all tests
|
|
148
|
-
for (const test of report.results.tests) {
|
|
149
|
-
if (!test.attachments || test.attachments.length === 0) {
|
|
150
|
-
continue;
|
|
151
|
-
}
|
|
152
|
-
// Find matching test result from ingest response
|
|
153
|
-
const testResult = ingestResponse.testResults.find((tr) => tr.name === test.name);
|
|
154
|
-
if (!testResult) {
|
|
155
|
-
console.warn(`[Artifact] Could not find test result for: ${test.name}`);
|
|
156
|
-
continue;
|
|
157
|
-
}
|
|
158
|
-
// Upload each attachment
|
|
159
|
-
for (const attachment of test.attachments) {
|
|
160
|
-
console.log(`[Artifact] Preparing to upload: ${attachment.path}`);
|
|
161
|
-
try {
|
|
162
|
-
const uploaded = await this.uploadSingleArtifact(testResult.id, attachment, ingestResponse.reportId);
|
|
163
|
-
if (uploaded) {
|
|
164
|
-
uploadedCount++;
|
|
165
|
-
// console.log(`[Artifact] Successfully uploaded: ${attachment.path}`);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
catch (error) {
|
|
169
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
170
|
-
if (errorMessage.includes('File not found')) {
|
|
171
|
-
console.error(`[Artifact] File not found: ${attachment.path}`);
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
console.error(`[Artifact] Failed to upload: ${attachment.path}`);
|
|
175
|
-
console.error(`[Artifact] Error:`, errorMessage);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
console.log(`--- Artifact Upload: Completed. Total artifacts attempted: ${totalAttachments}, uploaded: ${uploadedCount} ---`);
|
|
181
|
-
return uploadedCount;
|
|
182
|
-
}
|
|
183
|
-
catch (error) {
|
|
184
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
185
|
-
const message = `Failed to upload artifacts: ${errorMessage}`;
|
|
186
|
-
if (this.config.failOnUploadError) {
|
|
187
|
-
throw new Error(message);
|
|
188
|
-
}
|
|
189
|
-
else {
|
|
190
|
-
console.error(`${message}`);
|
|
191
|
-
return 0;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Upload a single artifact file
|
|
197
|
-
*/
|
|
198
|
-
async uploadSingleArtifact(testResultId, attachment, reportId) {
|
|
199
|
-
// Resolve file path
|
|
200
|
-
const filePath = path.resolve(attachment.path);
|
|
201
|
-
// Check if file exists
|
|
202
|
-
try {
|
|
203
|
-
await fs.access(filePath);
|
|
204
|
-
}
|
|
205
|
-
catch {
|
|
206
|
-
console.warn(` File not found: ${filePath}`);
|
|
207
|
-
return false;
|
|
208
|
-
}
|
|
209
|
-
// Read file
|
|
210
|
-
let fileBuffer;
|
|
211
|
-
try {
|
|
212
|
-
fileBuffer = await fs.readFile(filePath);
|
|
213
|
-
}
|
|
214
|
-
catch (error) {
|
|
215
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
216
|
-
throw new Error(`Failed to read file: ${errorMessage}`);
|
|
217
|
-
}
|
|
218
|
-
// Create native FormData with Blob (compatible with native fetch)
|
|
219
|
-
const blob = new Blob([fileBuffer], { type: attachment.contentType });
|
|
220
|
-
const formData = new FormData();
|
|
221
|
-
formData.append('testResultId', testResultId);
|
|
222
|
-
formData.append('ctrfAttachmentName', attachment.name);
|
|
223
|
-
formData.append('file', blob, path.basename(filePath));
|
|
224
|
-
// Upload to API
|
|
225
|
-
const uploadUrl = `${this.apiUrl}/api/v1/artifacts/${reportId}`;
|
|
226
|
-
const response = await fetch(uploadUrl, {
|
|
227
|
-
method: 'POST',
|
|
228
|
-
headers: {
|
|
229
|
-
'X-API-KEY': this.config.apiKey,
|
|
230
|
-
// Note: Don't set Content-Type - fetch sets it automatically with boundary
|
|
231
|
-
},
|
|
232
|
-
body: formData,
|
|
233
|
-
});
|
|
234
|
-
if (!response.ok) {
|
|
235
|
-
const errorText = await response.text();
|
|
236
|
-
throw new Error(`HTTP ${response.status}: ${errorText}`);
|
|
237
|
-
}
|
|
238
|
-
return true;
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
exports.ReportUploader = ReportUploader;
|
|
242
|
-
/**
|
|
243
|
-
* Detect git context from environment variables
|
|
244
|
-
*/
|
|
245
|
-
function detectGitContext() {
|
|
246
|
-
// Try GitHub Actions
|
|
247
|
-
if (process.env.GITHUB_REF && process.env.GITHUB_SHA) {
|
|
248
|
-
const ref = process.env.GITHUB_REF;
|
|
249
|
-
const branch = ref.replace('refs/heads/', '').replace('refs/tags/', '');
|
|
250
|
-
const repositoryUrl = process.env.GITHUB_SERVER_URL && process.env.GITHUB_REPOSITORY
|
|
251
|
-
? `${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}`
|
|
252
|
-
: undefined;
|
|
253
|
-
return {
|
|
254
|
-
branch,
|
|
255
|
-
commitSha: process.env.GITHUB_SHA,
|
|
256
|
-
repositoryUrl,
|
|
257
|
-
};
|
|
258
|
-
}
|
|
259
|
-
// Try GitLab CI
|
|
260
|
-
if (process.env.CI_COMMIT_BRANCH && process.env.CI_COMMIT_SHA) {
|
|
261
|
-
return {
|
|
262
|
-
branch: process.env.CI_COMMIT_BRANCH,
|
|
263
|
-
commitSha: process.env.CI_COMMIT_SHA,
|
|
264
|
-
repositoryUrl: process.env.CI_PROJECT_URL,
|
|
265
|
-
};
|
|
266
|
-
}
|
|
267
|
-
// Try CircleCI
|
|
268
|
-
if (process.env.CIRCLE_BRANCH && process.env.CIRCLE_SHA1) {
|
|
269
|
-
return {
|
|
270
|
-
branch: process.env.CIRCLE_BRANCH,
|
|
271
|
-
commitSha: process.env.CIRCLE_SHA1,
|
|
272
|
-
repositoryUrl: process.env.CIRCLE_REPOSITORY_URL,
|
|
273
|
-
};
|
|
274
|
-
}
|
|
275
|
-
// Try Jenkins
|
|
276
|
-
if (process.env.GIT_BRANCH && process.env.GIT_COMMIT) {
|
|
277
|
-
return {
|
|
278
|
-
branch: process.env.GIT_BRANCH,
|
|
279
|
-
commitSha: process.env.GIT_COMMIT,
|
|
280
|
-
repositoryUrl: process.env.GIT_URL,
|
|
281
|
-
};
|
|
282
|
-
}
|
|
283
|
-
return {};
|
|
284
|
-
}
|
|
285
|
-
//# sourceMappingURL=uploader.js.map
|
package/dist/uploader.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"uploader.js","sourceRoot":"","sources":["../src/uploader.ts"],"names":[],"mappings":"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"}
|