"use strict"; /** * Allure reporter. * * @module */ require("colors"); const allure = require("../allure"); const CONF = require("../config"); const TestCase = require("../testing").TestCase; module.exports = { start: () => { allure.startSuite(CONF.allure.suiteName); }, end: () => { reportSkippedTests(); allure.endSuite(); console.log(); const reportMsg = "Allure report is " + CONF.allure.dir; console.log(Array(reportMsg.length + 1).join("-").yellow); console.log(reportMsg.yellow); }, suite: suite => { allure.startSuite(suite.title); }, suiteEnd: () => { allure.endSuite(); }, scope: scope => { if (!allure.isTestStarted()) return; allure.startStep(scope.title); allure.getCurrentSuite().currentStep.isScope = true; // small hack }, scopeEnd: () => { if (allure.isTestStarted()) allure.endStep(); }, test: test => { allure.startCase(test.title); }, testEnd: () => { if (CONF.test.curCase.status === TestCase.PASSED) { allure.endCase(allure.PASSED); } if (CONF.test.curCase.status === TestCase.FAILED) { allure.endCase(allure.FAILED, getErrors(CONF.test.curCase)); } }, chunk: chunk => { allure.startStep(chunk.title); }, skip: () => { while (allureNotScope()) allure.endStep(allure.SKIPPED); }, pass: () => { while (allureNotScope()) allure.endStep(allure.PASSED); }, fail: () => { while (allureNotScope()) allure.endStep(allure.FAILED); }, }; const allureNotScope = () => allure.hasSteps() && !allure.getCurrentSuite().currentStep.isScope; const getErrors = testCase => { const result = {}; const errMsgs = getErrMsgs(testCase.errors); if (errMsgs.length === 0) { result.message = "Show details ➤"; } else if (errMsgs.length === 1) { result.message = errMsgs[0]; } else { let n = 0; result.message = errMsgs.map(i => `${++n}. ${i}`).join("\r"); } result.stack = testCase.errors.map(e => e.split("\n").join("\r")).join("\n\r"); return result; }; const getErrMsgs = errs => { const result = []; for (const err of errs) { for (const line of err.split("\n")) { if (line.startsWith("message: ")) { result.push(line.substr(9)); break; }; } } return result; }; const reportSkippedTests = () => { const skipped = CONF.test.cases.filter(t => t.status === TestCase.SKIPPED); for (const skip of skipped) { allure.startCase(skip.name); if (skip.rawInfo[0]) { allure.endCase(allure.SKIPPED, { message: skip.rawInfo[0] }); } else { allure.endCase(allure.SKIPPED); } } };