UNPKG

@honeybook/jest-stare

Version:

jest html reporter (results processor) to view HTML jest results, save raw JSON, and invoke multiple reporters

181 lines 18.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TestSuite = void 0; const Constants_1 = require("../Constants"); const Test_1 = require("../tests/Test"); class TestSuite { static create(results) { const elements = []; results.testResults.forEach((testResult) => { if (testResult.testResults == null) { console.error("Unexpected testResults field missing"); if (testResult.assertionResults != null) { console.warn("Attempting to use assertionResults: results are unpredictable"); testResult.testResults = testResult.assertionResults; } } let testStatusClass; const testSectionStatus = new Map(); for (const result of testResult.testResults) { testStatusClass = TestSuite.asignStatus(testStatusClass, result, testSectionStatus); } if (testStatusClass === undefined) { testStatusClass = Constants_1.Constants.PASSED_TEST; } const accordionCard = TestSuite.buildAccordionCard(testResult, testStatusClass); const divMap = new Map(); testResult.testResults.forEach((test) => { const element = Test_1.Test.create(test); if (test.ancestorTitles.length > 0) { test.ancestorTitles.forEach((title, index) => { const titlesCopy = test.ancestorTitles.slice(); titlesCopy.splice(index + 1); const key = titlesCopy.join(TestSuite.JOIN_CHAR); if (divMap.has(key)) { divMap.get(key).appendChild(element); } else { const nestDiv = document.createElement("div"); const statusClass = testSectionStatus.get(key) || Constants_1.Constants.PASSED_TEST; nestDiv.classList.add("my-3", "p-3", "bg-white", "rounded", "box-shadow", statusClass); const h6 = document.createElement("h6"); h6.classList.add("border-bottom", "pb-2", "mb-0", "display-6"); h6.textContent = title; nestDiv.appendChild(h6); nestDiv.appendChild(element); nestDiv.id = key; divMap.set(key, nestDiv); if (index === 0) { accordionCard .querySelector(".card-body") .appendChild(nestDiv); } else { titlesCopy.pop(); const parentKey = titlesCopy.join(TestSuite.JOIN_CHAR); divMap.get(parentKey).appendChild(nestDiv); } } }); } else { accordionCard .querySelector(".card-body") .appendChild(element); } }); elements.push(accordionCard); }); return elements; } static asignStatus(testStatusClass, result, testSectionStatus) { const currentStatus = TestSuite.getStatusClassFromJestStatus(result.status); if (!testStatusClass) { testStatusClass = currentStatus; } else if (testStatusClass !== currentStatus) { testStatusClass = TestSuite.mixStatus(currentStatus, testStatusClass); } else { testStatusClass = currentStatus; } for (let index = 0; index < result.ancestorTitles.length; index++) { const titlesCopy = result.ancestorTitles.slice(); titlesCopy.splice(index + 1); const key = titlesCopy.join(TestSuite.JOIN_CHAR); if (testSectionStatus.has(key)) { if (testStatusClass !== currentStatus) { testSectionStatus.set(key, TestSuite.mixStatus(currentStatus, testStatusClass)); } else { testSectionStatus.set(key, currentStatus); } } else { testSectionStatus.set(key, currentStatus); } } return testStatusClass; } static getStatusClassFromJestStatus(jestStatus) { if (jestStatus === Constants_1.Constants.TEST_STATUS_PEND) { return Constants_1.Constants.PENDING_TEST; } else if (jestStatus === Constants_1.Constants.TEST_STATUS_FAIL) { return Constants_1.Constants.FAILED_TEST; } else { return Constants_1.Constants.PASSED_TEST; } } static mixStatus(currentStatus, oldStatus) { const statusArray = oldStatus.split(TestSuite.JOIN_CHAR); statusArray.push(currentStatus); const sortedUniqueStatusArray = [...new Set(statusArray)].sort(); return sortedUniqueStatusArray.join(TestSuite.JOIN_CHAR); } static buildAccordionCard(testResult, testStatusClass) { const accordionCard = document.createElement("div"); accordionCard.classList.add("my-3", "p-3", "bg-white", "rounded", "box-shadow", "card", testStatusClass); const cardHeader = TestSuite.buildAccordionCardHeader(testResult.testFilePath, testResult.numPassingTests, testResult.numFailingTests, testResult.numPendingTests, testResult.numTodoTests); accordionCard.appendChild(cardHeader); const cardBody = TestSuite.buildAccordionCardBody(testResult.testFilePath); accordionCard.appendChild(cardBody); return accordionCard; } static buildAccordionCardHeader(testFilePath, passCount, failCount, pendingCount, todoCount) { const fileName = TestSuite.sanitizeFilePath(testFilePath); const cardHeader = document.createElement("div"); cardHeader.classList.add("card-header"); cardHeader.classList.add("text-center"); cardHeader.id = `${fileName}_header`; const h5 = document.createElement("h5"); h5.classList.add("border-bottom", "pb-2", "mb-0", "display-5"); const btn = document.createElement("button"); btn.style.userSelect = "text"; btn.classList.add("btn", "btn-block"); btn.setAttribute("data-bs-toggle", "collapse"); btn.setAttribute("data-bs-target", `#${fileName}_detail`); btn.textContent = testFilePath; const resultCounts = document.createElement("div"); resultCounts.style.userSelect = "none"; const passBadge = document.createElement("span"); passBadge.classList.add("badge", "bg-success", "border"); passBadge.textContent = passCount.toString(); resultCounts.appendChild(passBadge); const failBadge = document.createElement("span"); failBadge.classList.add("badge", "bg-danger", "border"); failBadge.textContent = failCount.toString(); resultCounts.appendChild(failBadge); const skipBadge = document.createElement("span"); skipBadge.classList.add("badge", "bg-warning", "border"); skipBadge.textContent = pendingCount.toString(); resultCounts.appendChild(skipBadge); const todoBadge = document.createElement("span"); todoBadge.classList.add("badge", "bg-info", "border"); todoBadge.textContent = todoCount.toString(); resultCounts.appendChild(todoBadge); btn.appendChild(resultCounts); h5.appendChild(btn); cardHeader.appendChild(h5); return cardHeader; } static buildAccordionCardBody(testFilePath) { const fileName = TestSuite.sanitizeFilePath(testFilePath); const cardContainer = document.createElement("div"); cardContainer.classList.add("collapse"); cardContainer.setAttribute("data-parent", "#accordion"); cardContainer.id = `${fileName}_detail`; const cardBody = document.createElement("div"); cardBody.classList.add("card-body"); cardContainer.appendChild(cardBody); return cardContainer; } static sanitizeFilePath(testFilePath) { return testFilePath.replace(/(\/)|\\|(:)|(\s)|\.|(@)/g, "_"); } } exports.TestSuite = TestSuite; TestSuite.JOIN_CHAR = "."; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVzdFN1aXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JlbmRlci9zdWl0ZXMvVGVzdFN1aXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDRDQUF5QztBQUN6Qyx3Q0FBcUM7QUFZckMsTUFBYSxTQUFTO0lBY1gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUF5QjtRQUMxQyxNQUFNLFFBQVEsR0FBa0IsRUFBRSxDQUFDO1FBRW5DLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFPdkMsSUFBSSxVQUFVLENBQUMsV0FBVyxJQUFJLElBQUksRUFBRTtnQkFFaEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO2dCQUN0RCxJQUFLLFVBQWtCLENBQUMsZ0JBQWdCLElBQUksSUFBSSxFQUFFO29CQUU5QyxPQUFPLENBQUMsSUFBSSxDQUNSLCtEQUErRCxDQUNsRSxDQUFDO29CQUNGLFVBQVUsQ0FBQyxXQUFXLEdBQ2xCLFVBQ0gsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDdEI7YUFDSjtZQUVELElBQUksZUFBZSxDQUFDO1lBRXBCLE1BQU0saUJBQWlCLEdBQXdCLElBQUksR0FBRyxFQUduRCxDQUFDO1lBQ0osS0FBSyxNQUFNLE1BQU0sSUFBSSxVQUFVLENBQUMsV0FBVyxFQUFFO2dCQUN6QyxlQUFlLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FDbkMsZUFBZSxFQUNmLE1BQU0sRUFDTixpQkFBaUIsQ0FDcEIsQ0FBQzthQUNMO1lBRUQsSUFBSSxlQUFlLEtBQUssU0FBUyxFQUFFO2dCQUMvQixlQUFlLEdBQUcscUJBQVMsQ0FBQyxXQUFXLENBQUM7YUFDM0M7WUFHRCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQzlDLFVBQVUsRUFDVixlQUFlLENBQ2xCLENBQUM7WUFPRixNQUFNLE1BQU0sR0FBNkIsSUFBSSxHQUFHLEVBRzdDLENB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