@gullerya/just-test
Version:
JavaScript multiplatform tests runner
97 lines (81 loc) • 3.19 kB
JavaScript
import { STATUS } from '../../common/constants.js';
import { getDOMImplementation } from '../../common/xml/dom-implementation.js';
export default Object.freeze({
type: 'xUnit',
report: report
});
function report(results) {
const DOMImplementation = getDOMImplementation();
const rDoc = DOMImplementation.instance.createDocument(null, 'testsuites');
rDoc.documentElement.setAttribute('timestamp', new Date(results.timestamp).toISOString());
rDoc.documentElement.setAttribute('time', Math.round(parseFloat(results.time)) / 1000);
let sessionTests = 0;
let sessionFailures = 0;
let sessionErrors = 0;
let sessionSkips = 0;
results.errors.forEach(error => {
const eEl = rDoc.createElement('error');
eEl.setAttribute('type', error.type);
eEl.setAttribute('message', error.message);
eEl.textContent = error.stacktrace;
rDoc.documentElement.appendChild(eEl);
sessionErrors++;
});
results.suites.forEach(suite => {
const sEl = rDoc.createElement('testsuite');
sEl.setAttribute('name', suite.name);
sEl.setAttribute('timestamp', new Date(suite.timestamp).toISOString());
sEl.setAttribute('time', Math.round(parseFloat(suite.time)) / 1000);
sEl.setAttribute('tests', suite.tests.length);
let suiteFailures = 0;
let suiteErrors = 0;
let suiteSkips = 0;
suite.tests.forEach(test => {
const lastRun = test.lastRun;
const tEl = rDoc.createElement('testcase');
tEl.setAttribute('name', test.name);
if (lastRun) {
tEl.setAttribute('time', Math.round(lastRun.time) / 1000);
tEl.setAttribute('status', lastRun.status);
if (lastRun.status === STATUS.FAIL) {
suiteFailures++;
const fEl = rDoc.createElement('failure');
console.log(lastRun.error);
if (lastRun.error) {
fEl.setAttribute('type', lastRun.error.type);
fEl.setAttribute('message', lastRun.error.message);
fEl.textContent = lastRun.error.stacktrace;
}
tEl.appendChild(fEl);
} else if (lastRun.status === STATUS.ERROR) {
suiteErrors++;
const eEl = rDoc.createElement('error');
if (lastRun.error) {
eEl.setAttribute('type', lastRun.error.type);
eEl.setAttribute('message', lastRun.error.message);
eEl.textContent = lastRun.error.stacktrace;
}
tEl.appendChild(eEl);
} else if (lastRun.status === STATUS.SKIP) {
suiteSkips++;
const eEl = rDoc.createElement('skipped');
tEl.appendChild(eEl);
}
}
sEl.appendChild(tEl);
});
sEl.setAttribute('failures', suiteFailures);
sEl.setAttribute('errors', suiteErrors);
sEl.setAttribute('skipped', suiteSkips);
sessionTests += suite.tests.length;
sessionFailures += suiteFailures;
sessionErrors += suiteErrors;
sessionSkips += suiteSkips;
rDoc.documentElement.appendChild(sEl);
});
rDoc.documentElement.setAttribute('tests', sessionTests);
rDoc.documentElement.setAttribute('failures', sessionFailures);
rDoc.documentElement.setAttribute('errors', sessionErrors);
rDoc.documentElement.setAttribute('skipped', sessionSkips);
return new DOMImplementation.XMLSerializer().serializeToString(rDoc);
}