UNPKG

danger-plugin-jest

Version:
90 lines (89 loc) 4.51 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var fs = require("fs"); var path = require("path"); var stripANSI = require("strip-ansi"); function jest(config) { if (config === void 0) { config = {}; } var _a = config.testResultsJsonPath, testResultsJsonPath = _a === void 0 ? 'test-results.json' : _a, _b = config.showSuccessMessage, showSuccessMessage = _b === void 0 ? false : _b; try { var jsonFileContents = fs.readFileSync(testResultsJsonPath, 'utf8'); var jsonResults = JSON.parse(jsonFileContents); if (jsonResults.success) { jestSuccessFeedback(jsonResults, showSuccessMessage); return; } var isModernFormatResults = jsonResults.testResults[0].testResults; if (isModernFormatResults) { presentErrorsForNewStyleResults(jsonResults); } else { presentErrorsForOldStyleResults(jsonResults); } } catch (e) { // tslint:disable-next-line:no-console console.error(e); fail('[danger-plugin-jest] Could not read test results. Danger cannot pass or fail the build.'); } } exports.default = jest; var jestSuccessFeedback = function (jsonResults, showSuccessMessage) { if (!showSuccessMessage) { // tslint:disable-next-line:no-console console.log(':+1: Jest tests passed'); } else { message(":+1: Jest tests passed: " + jsonResults.numPassedTests + "/" + jsonResults.numTotalTests + " (" + jsonResults.numPendingTests + " skipped)"); } }; var presentErrorsForOldStyleResults = function (jsonResults) { var failing = jsonResults.testResults.filter(function (tr) { return tr.status === 'failed'; }); failing.forEach(function (results) { var relativeFilePath = path.relative(process.cwd(), results.name); var failedAssertions = results.assertionResults.filter(function (r) { return r.status === 'failed'; }); var failMessage = fileToFailString(relativeFilePath, failedAssertions); fail(failMessage); }); }; var presentErrorsForNewStyleResults = function (jsonResults) { var failing = jsonResults.testResults.filter(function (tr) { return tr.numFailingTests > 0; }); failing.forEach(function (results) { var relativeFilePath = path.relative(process.cwd(), results.testFilePath); var failedAssertions = results.testResults.filter(function (r) { return r.status === 'failed'; }); var failMessage = fileToFailString(relativeFilePath, failedAssertions); fail(failMessage); }); }; // e.g. https://github.com/orta/danger-plugin-jest/blob/master/src/__tests__/fails.test.ts var linkToTest = function (file, msg, title) { var line = lineOfError(msg, file); var githubRoot = danger.github.pr.head.repo.html_url.split(danger.github.pr.head.repo.owner.login)[0]; var repo = danger.github.pr.head.repo; var url = "" + githubRoot + repo.full_name + "/blob/" + danger.github.pr.head.ref + "/" + file + (line ? "#L" + line : ''); return "<a href='" + url + "'>" + title + "</a>"; }; var assertionFailString = function (file, status) { return "\n<li>\n" + linkToTest(file, status.failureMessages && status.failureMessages[0], status.title) + "\n<br/>\n" + sanitizeShortErrorMessage(status.failureMessages && stripANSI(status.failureMessages[0])) + "\n\n<details>\n<summary>Full message</summary>\n<pre><code>\n" + (status.failureMessages && stripANSI(status.failureMessages.join('\n'))) + "\n</code></pre>\n</details>\n</li>\n<br/>\n"; }; var fileToFailString = function ( // tslint:disable-next-line:no-shadowed-variable path, failedAssertions) { return "\n<b>\uD83C\uDCCF FAIL</b> in " + danger.github.utils.fileLinks([path]) + "\n\n" + failedAssertions.map(function (a) { return assertionFailString(path, a); }).join('\n\n') + "\n"; }; var lineOfError = function (msg, filePath) { var filename = path.basename(filePath); var restOfTrace = msg.split(filename, 2)[1]; return restOfTrace ? parseInt(restOfTrace.split(':')[1], 10) : null; }; var sanitizeShortErrorMessage = function (msg) { if (msg.includes('does not match stored snapshot')) { return 'Snapshot has changed'; } return msg .split(' at', 1)[0] .trim() .split('\n') .splice(2) .join('') .replace(/\s\s+/g, ' ') .replace('Received:', ', received:') .replace('., received', ', received') .split('Difference:')[0]; };