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, ''');
}
}