UNPKG

jest-stare

Version:

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

174 lines 17.8 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.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"); 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVzdFN1aXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JlbmRlci9zdWl0ZXMvVGVzdFN1aXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDRDQUF5QztBQUN6Qyx3Q0FBcUM7QUFRckMsTUFBYSxTQUFTO0lBZVgsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUF5QjtRQUMxQyxNQUFNLFFBQVEsR0FBa0IsRUFBRSxDQUFDO1FBRW5DLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFRdkMsSUFBSSxVQUFVLENBQUMsV0FBVyxJQUFJLElBQUksRUFBRTtnQkFFaEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO2dCQUN0RCxJQUFLLFVBQWtCLENBQUMsZ0JBQWdCLElBQUksSUFBSSxFQUFFO29CQUU5QyxPQUFPLENBQUMsSUFBSSxDQUFDLCtEQUErRCxDQUFDLENBQUM7b0JBQzlFLFVBQVUsQ0FBQyxXQUFXLEdBQUksVUFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDakU7YUFDSjtZQUVELElBQUksZUFBZSxDQUFDO1lBRXBCLE1BQU0saUJBQWlCLEdBQXdCLElBQUksR0FBRyxFQUFrQixDQUFDO1lBQ3pFLEtBQUssTUFBTSxNQUFNLElBQUksVUFBVSxDQUFDLFdBQVcsRUFBRTtnQkFDekMsZUFBZSxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2FBQ3ZGO1lBRUQsSUFBSSxlQUFlLEtBQUssU0FBUyxFQUFFO2dCQUMvQixlQUFlLEdBQUcscUJBQVMsQ0FBQyxXQUFXLENBQUM7YUFDM0M7WUFHRCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFBO1lBTy9FLE1BQU0sTUFBTSxHQUE2QixJQUFJLEdBQUcsRUFBdUIsQ0FB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