UNPKG

mocha8allure

Version:

Allure mocha reporter

246 lines 20.2 kB
"use strict"; 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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