73 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import { readFileSync } from 'fs'
 | 
						|
 | 
						|
const data = readFileSync('./test-results/report.json', 'utf8')
 | 
						|
 | 
						|
// 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, '') : '';
 | 
						|
}
 | 
						|
 | 
						|
// 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,
 | 
						|
                error: stripAnsiEscapes(result.error?.stack),
 | 
						|
              })
 | 
						|
            }
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
      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)
 | 
						|
 |