import { BaseReportGenerator, TestReport, ReportGeneratorOptions, } from './base-report-generator'; export class JUnitReportGenerator extends BaseReportGenerator { constructor(options: ReportGeneratorOptions) { super(options); } getExtension(): string { return 'xml'; } generate(report: TestReport): string { const xml = this.generateJUnitXML(report); return this.writeToFile(xml); } private generateJUnitXML(report: TestReport): string { const xmlHeader = '\n'; const testsuites = this.generateTestSuitesXML(report); return xmlHeader + testsuites; } private generateTestSuitesXML(report: TestReport): string { const testsuites = report.testSuites .map(suite => this.generateTestSuiteXML(suite)) .join('\n'); return ` ${testsuites} `; } private generateTestSuiteXML(suite: any): string { const testcases = suite.tests .map((test: any) => this.generateTestCaseXML(test)) .join('\n'); const failedTests = suite.tests.filter((t: any) => t.status === 'failed'); return ` ${testcases} `; } private generateTestCaseXML(test: any): string { const testcase = ` `; } if (test.status === 'failed') { const failureMessage = test.error ? this.escapeXML(test.error) : 'Test failed'; const failureDetails = test.stackTrace ? this.escapeXML(test.stackTrace) : ''; return `${testcase}> ${failureDetails} `; } return `${testcase}/>`; } private escapeXML(str: string): string { return str .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); } }