mocha8allure
Version:
Allure mocha reporter
246 lines • 20.2 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.startItem = exports.passedItem = exports.failedTest = exports.failedHook = exports.skippedTest = exports.generateFolder = exports.suiteStart = exports.suiteEnd = exports.getHookType = void 0;
const context_1 = require("./context");
const logger_1 = __importDefault(require("./logger"));
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const xml_js_1 = __importDefault(require("xml-js"));
const lodash_1 = __importDefault(require("lodash"));
const constants_1 = require("./constants");
const mocha_1 = __importDefault(require("mocha"));
const ansi_up_1 = __importDefault(require("ansi_up"));
const uuid_1 = require("uuid");
function getHookType(hook) {
let hType;
const title = hook.title;
switch (true) {
case title.startsWith('"before each"'):
hType = "before test";
break;
case title.startsWith('"after each"'):
hType = "after test";
break;
case title.startsWith('"before all"'):
hType = "before suite";
break;
case title.startsWith('"after all"'):
hType = "after suite";
break;
default:
hType = null;
}
return hType;
}
exports.getHookType = getHookType;
function suiteEnd(suite) {
if (suite.title !== "") {
const currentSuite = lodash_1.default.cloneDeep(context_1.suites.find((s) => s.suiteId === suite.id));
delete currentSuite.suiteId;
for (const test of currentSuite["test-suite"]["test-cases"]["test-case"]) {
delete test.testId;
for (const step of test.steps.step) {
delete step.stepId;
}
}
const result = xml_js_1.default.js2xml(currentSuite, {
compact: true,
spaces: 2,
fullTagEmptyElement: false,
});
fs_1.default.writeFileSync(path_1.default.join(process.env.resultsPath, uuid_1.v4() + "-testsuite.xml"), result);
}
}
exports.suiteEnd = suiteEnd;
function suiteStart(suite) {
if (suite.title !== "") {
const currentSuite = {
suiteId: suite.id,
"test-suite": {
_attributes: {
start: Date.now(),
stop: null,
},
name: suite.title,
title: suite.title,
"test-cases": {
"test-case": [],
},
},
};
context_1.suites.push(currentSuite);
}
}
exports.suiteStart = suiteStart;
function generateFolder() {
fs_1.default.mkdirSync(process.env.resultsPath, { recursive: true });
}
exports.generateFolder = generateFolder;
function skippedTest(test) {
const currentTest = {
testId: "",
_attributes: {
start: Date.now(),
stop: Date.now(),
status: "skipped",
},
name: test.title,
title: test.title,
labels: {
label: [],
},
parameters: {
parameter: [],
},
steps: {
step: [],
},
attachments: {
attachment: [],
},
};
context_1.suites
.find((s) => s.suiteId === test.parent.__mocha_id__)["test-suite"]["test-cases"]["test-case"].push(currentTest);
}
exports.skippedTest = skippedTest;
function failedHook(hook, err) {
let parent;
if (hook.type === "hook" &&
(getHookType(hook) === "before test" || getHookType(hook) === "after test")) {
parent = hook.ctx.currentTest.parent;
}
else {
parent = hook.parent;
}
if (process.env.SHOW_HOOKS && process.env.SHOW_HOOKS === "true") {
const currentHook = context_1.suites
.find((s) => s.suiteId === parent.__mocha_id__)["test-suite"]["test-cases"]["test-case"].find((t) => t.testId === hook.__mocha_id__);
currentHook._attributes.stop = Date.now();
currentHook._attributes.status = "failed";
currentHook.failure = {
message: err.message,
"stack-trace": err.stack,
};
currentHook.testId = "";
}
if (getHookType(hook) === "before test") {
const currentTest = context_1.suites
.find((s) => s.suiteId === hook.ctx.currentTest.parent.__mocha_id__)["test-suite"]["test-cases"]["test-case"].find((t) => t.testId === hook.ctx.currentTest.__mocha_id__);
currentTest._attributes.stop = Date.now();
currentTest._attributes.status = "skipped";
const index = hook.parent.tests.findIndex((test) => test.__mocha_id__ ===
hook.ctx.currentTest.__mocha_id__);
if (hook.parent.tests.length - (index + 1) > 0) {
for (let elem = index + 1; elem < hook.parent.tests.length; elem++) {
skippedTest(hook.parent.tests[elem]);
}
}
skipSuites(hook.parent.suites);
}
if (getHookType(hook) === "before suite") {
for (const test of hook.parent.tests) {
skippedTest(test);
}
skipSuites(hook.parent.suites);
}
}
exports.failedHook = failedHook;
function skipSuites(skippedSuites) {
for (const suite of skippedSuites) {
suiteStart(suite);
for (const test of suite.tests) {
skippedTest(test);
}
suiteEnd(suite);
if (suite.suites.length > 0) {
skipSuites(suite.suites);
}
}
}
function failedTest(test, err) {
const currentTest = context_1.suites
.find((s) => s.suiteId === test.parent.__mocha_id__)["test-suite"]["test-cases"]["test-case"].find((t) => t.testId === test.__mocha_id__);
currentTest._attributes.stop = Date.now();
const isAssertionError = err.name === "AssertionError" || err.code === "ERR_ASSERTION";
const status = isAssertionError ? "failed" : "broken";
currentTest._attributes.status = status;
if (err.actual && err.expected) {
const actual = typeof err.actual === "object"
? JSON.stringify(err.actual, null, 2)
: String(err.actual);
const expected = typeof err.expected === "object"
? JSON.stringify(err.expected, null, 2)
: String(err.expected);
currentTest.attachments.attachment.push(logger_1.default.addAttachment("Actual:\n", actual, constants_1.AllureMimeTypes.txt));
currentTest.attachments.attachment.push(logger_1.default.addAttachment("Expected:\n", expected, constants_1.AllureMimeTypes.txt));
const diff = mocha_1.default.reporters.Base.generateDiff(actual, expected);
const ansi_up = new ansi_up_1.default();
currentTest.attachments.attachment.push(logger_1.default.addAttachment("Diff:\n", `<pre>${ansi_up.ansi_to_html(diff)}</pre>`, constants_1.AllureMimeTypes.html));
}
currentTest.failure = {
message: err.message,
"stack-trace": err.stack,
};
currentTest.testId = "";
}
exports.failedTest = failedTest;
function passedItem(item) {
let parent;
if (item.type === "hook" &&
(getHookType(item) === "before test" || getHookType(item) === "after test")) {
parent = item.ctx.currentTest.parent;
}
else {
parent = item.parent;
}
const currentItem = context_1.suites
.find((s) => s.suiteId === parent.__mocha_id__)["test-suite"]["test-cases"]["test-case"].find((t) => t.testId === item.__mocha_id__);
currentItem._attributes.stop = Date.now();
currentItem._attributes.status = "passed";
currentItem.testId = "";
}
exports.passedItem = passedItem;
function startItem(item) {
let parent;
let itemName;
if (item.type === "hook" &&
(getHookType(item) === "before test" || getHookType(item) === "after test")) {
parent = item.ctx.currentTest.parent;
itemName = `${item.title} - ${item.parent.title}`;
}
else {
parent = item.parent;
itemName = item.title;
}
const currentTest = {
testId: item.__mocha_id__,
_attributes: {
start: item.type === "hook" && getHookType(item) === "before test"
? Date.now() - 1
: Date.now(),
stop: null,
status: "",
},
name: itemName,
title: itemName,
labels: {
label: [],
},
parameters: {
parameter: [],
},
steps: {
step: [],
},
attachments: {
attachment: [],
},
};
const testCases = context_1.suites.find((s) => s.suiteId === parent.__mocha_id__)["test-suite"]["test-cases"]["test-case"];
testCases.push(currentTest);
}
exports.startItem = startItem;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsdUNBQW1DO0FBRW5DLHNEQUE4QjtBQUM5Qiw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLG9EQUE2QjtBQUM3QixvREFBdUI7QUFDdkIsMkNBQThDO0FBQzlDLGtEQUEwQjtBQUMxQixzREFBNEM7QUFDNUMsK0JBQW9DO0FBRXBDLFNBQWdCLFdBQVcsQ0FDekIsSUFBOEM7SUFFOUMsSUFBSSxLQUFLLENBQUM7SUFDVixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3pCLFFBQVEsSUFBSSxFQUFFO1FBQ1osS0FBSyxLQUFLLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztZQUNwQyxLQUFLLEdBQUcsYUFBYSxDQUFDO1lBQ3RCLE1BQU07UUFDUixLQUFLLEtBQUssQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDO1lBQ25DLEtBQUssR0FBRyxZQUFZLENBQUM7WUFDckIsTUFBTTtRQUNSLEtBQUssS0FBSyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUM7WUFDbkMsS0FBSyxHQUFHLGNBQWMsQ0FBQztZQUN2QixNQUFNO1FBQ1IsS0FBSyxLQUFLLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztZQUNsQyxLQUFLLEdBQUcsYUFBYSxDQUFDO1lBQ3RCLE1BQU07UUFDUjtZQUNFLEtBQUssR0FBRyxJQUFJLENBQUM7S0FDaEI7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUF0QkQsa0NBc0JDO0FBRUQsU0FBZ0IsUUFBUSxDQUFDLEtBQWtCO0lBQ3pDLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxFQUFFLEVBQUU7UUFDdEIsTUFBTSxZQUFZLEdBQUcsZ0JBQUMsQ0FBQyxTQUFTLENBQzlCLGdCQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMs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