/** * Utils for test suite * * @author d98762625@gmail.com * @author tlwr [toby@toby.codes] * @author n1474335 [n1474335@gmail.com] * @copyright Crown Copyright 2018 * @license Apache-2.0 */ /** * Helper function to convert a status to an icon. * * @param {string} status * @returns {string} */ function statusToIcon(status) { return { erroring: "🔥", failing: "❌", passing: "✔️️", }[status] || "?"; } /** * Counts test statuses. * * @param {Object} testStatus * @param {Object} testResult */ function handleTestResult(testStatus, testResult) { testStatus.allTestsPassing = testStatus.allTestsPassing && testResult.status === "passing"; testStatus.counts[testResult.status] = (testStatus.counts[testResult.status] || 0) + 1; testStatus.counts.total += 1; } /** * Log each test result, count tests and failures. * * @param {Object} testStatus - object describing test run data * @param {Object[]} results - results from TestRegister */ export function logTestReport(testStatus, results) { console.log("Tests completed."); results.forEach(r => handleTestResult(testStatus, r)); console.log(); for (const testStatusCount in testStatus.counts) { const count = testStatus.counts[testStatusCount]; if (count > 0) { console.log(testStatusCount.toUpperCase() + "\t" + count); } } console.log(); // Print error messages for tests that didn't pass results.filter(res => res.status !== "passing").forEach(testResult => { console.log([ statusToIcon(testResult.status), testResult.test.name ].join(" ")); if (testResult.output) { console.log( testResult.output .trim() .replace(/^/, "\t") .replace(/\n/g, "\n\t") ); } }); console.log(); process.exit(testStatus.allTestsPassing ? 0 : 1); } /** * Fail if the process takes longer than 60 seconds. */ export function setLongTestFailure() { setTimeout(function() { console.log("Tests took longer than 60 seconds to run, returning."); process.exit(1); }, 60 * 1000); }