jest-to-sonar
Version:
Convert the Jest test case report to a Sonar generic test execution report.
60 lines (45 loc) • 1.77 kB
text/typescript
import path from 'path';
import * as fs from 'fs';
import { ITestCase } from '../types/SonarReporter';
function generateXML(testFileResults: Map<string, ITestCase[]>): string {
const lines: string[] = ['<testExecutions version="1">'];
for (const [path, testCases] of testFileResults.entries()) {
lines.push(` <file path="${path}">`);
for (const test of testCases) {
const testName = test.name.replace(/"/g, "'");
const failureMessage = test.failureMessages?.toString() ?? 'Error';
lines.push(
` <testCase name="${testName}" duration="${test.duration}"${test.status === 'passed' ? ' /' : ''}>`,
);
if (test.status === 'skipped' || test.status === 'pending') {
lines.push(` <skipped message="${testName}" />`);
} else if (test.status === 'failed') {
lines.push(` <failure message="Error">${failureMessage}</failure>`);
} else if (test.status === 'disabled') {
lines.push(' <disabled message="Error" />');
}
if (test.status !== 'passed') lines.push(' </testCase>');
}
lines.push(' </file>');
}
lines.push('</testExecutions>');
return lines.join('\n');
}
function getRelativePath(fullPath: string): string {
const basePath = process.cwd();
const relativePath = fullPath.replace(`${basePath}/`, '');
return relativePath;
}
function createFile(fullPath: string, data: string): void {
const dir = path.dirname(fullPath);
// Create folders if they don't exist
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
}
try {
fs.writeFileSync(fullPath, data);
} catch (err) {
console.error(`Error creating file at ${fullPath}:`, err);
}
}
export { generateXML, getRelativePath, createFile };