| 
									
										
										
										
											2024-07-11 14:32:36 +10:00
										 |  |  | import { readFileSync } from 'fs' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const data = readFileSync('./test-results/report.json', 'utf8') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-21 13:54:56 -04:00
										 |  |  | // We need this until Playwright's JSON reporter supports `stripANSIControlSequences`
 | 
					
						
							|  |  |  | // https://github.com/microsoft/playwright/issues/33670#issuecomment-2487941649
 | 
					
						
							|  |  |  | const ansiRegex = new RegExp('([\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~])))', 'g'); | 
					
						
							|  |  |  | export function stripAnsiEscapes(str) { | 
					
						
							|  |  |  |   return str ? str.replace(ansiRegex, '') : ''; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-11 14:32:36 +10:00
										 |  |  | // types, but was easier to store and run as normal js
 | 
					
						
							|  |  |  | // interface FailedTest {
 | 
					
						
							|  |  |  | //     name: string;
 | 
					
						
							|  |  |  | //     projectName: string;
 | 
					
						
							|  |  |  | //     error: string;
 | 
					
						
							|  |  |  | // }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // interface Spec {
 | 
					
						
							|  |  |  | //     title: string;
 | 
					
						
							|  |  |  | //     tests: Test[];
 | 
					
						
							|  |  |  | // }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // interface Test {
 | 
					
						
							|  |  |  | //     expectedStatus: 'passed' | 'failed' | 'pending';
 | 
					
						
							|  |  |  | //     projectName: string;
 | 
					
						
							|  |  |  | //     title: string;
 | 
					
						
							|  |  |  | //     results: {
 | 
					
						
							|  |  |  | //         status: 'passed' | 'failed' | 'pending';
 | 
					
						
							|  |  |  | //         error: {stack: string}
 | 
					
						
							|  |  |  | //     }[]
 | 
					
						
							|  |  |  | // }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // interface Suite {
 | 
					
						
							|  |  |  | //     title: string
 | 
					
						
							|  |  |  | //     suites: Suite[];
 | 
					
						
							|  |  |  | //     specs: Spec[];
 | 
					
						
							|  |  |  | // }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // const processReport = (suites: Suite[]): FailedTest[] => {
 | 
					
						
							|  |  |  | //     const failedTests: FailedTest[] = []
 | 
					
						
							|  |  |  | //     const loopSuites = (suites: Suite[], previousName = '') => {
 | 
					
						
							|  |  |  | const processReport = (suites) => { | 
					
						
							|  |  |  |   const failedTests = [] | 
					
						
							|  |  |  |   const loopSuites = (suites, previousName = '') => { | 
					
						
							|  |  |  |     if (!suites) return | 
					
						
							|  |  |  |     for (const suite of suites) { | 
					
						
							|  |  |  |       const name = (previousName ? `${previousName} -- ` : '') + suite.title | 
					
						
							|  |  |  |       for (const spec of suite.specs) { | 
					
						
							|  |  |  |         for (const test of spec.tests) { | 
					
						
							|  |  |  |           for (const result of test.results) { | 
					
						
							|  |  |  |             if ((result.status !== 'passed') && test.expectedStatus === 'passed') { | 
					
						
							|  |  |  |               failedTests.push({ | 
					
						
							|  |  |  |                 name: (name + ' -- ' + spec.title) + (test.title ? ` -- ${test.title}` : ''), | 
					
						
							|  |  |  |                 status: result.status, | 
					
						
							|  |  |  |                 projectName: test.projectName, | 
					
						
							| 
									
										
										
										
											2025-03-21 13:54:56 -04:00
										 |  |  |                 error: stripAnsiEscapes(result.error?.stack), | 
					
						
							| 
									
										
										
										
											2024-07-11 14:32:36 +10:00
										 |  |  |               }) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       loopSuites(suite.suites, name) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   loopSuites(suites) | 
					
						
							|  |  |  |   return failedTests.map(line => JSON.stringify(line)).join('\n') | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | const failedTests = processReport(JSON.parse(data).suites) | 
					
						
							|  |  |  | // log to stdout to be piped to axiom
 | 
					
						
							|  |  |  | console.log(failedTests) | 
					
						
							|  |  |  | 
 |