276 lines
7.2 KiB
JavaScript
276 lines
7.2 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
Object.defineProperty(exports, '__esModule', {
|
||
|
value: true
|
||
|
});
|
||
|
exports.default = void 0;
|
||
|
|
||
|
function _chalk() {
|
||
|
const data = _interopRequireDefault(require('chalk'));
|
||
|
|
||
|
_chalk = function _chalk() {
|
||
|
return data;
|
||
|
};
|
||
|
|
||
|
return data;
|
||
|
}
|
||
|
|
||
|
function _jestUtil() {
|
||
|
const data = require('jest-util');
|
||
|
|
||
|
_jestUtil = function _jestUtil() {
|
||
|
return data;
|
||
|
};
|
||
|
|
||
|
return data;
|
||
|
}
|
||
|
|
||
|
var _base_reporter = _interopRequireDefault(require('./base_reporter'));
|
||
|
|
||
|
var _utils = require('./utils');
|
||
|
|
||
|
var _get_result_header = _interopRequireDefault(require('./get_result_header'));
|
||
|
|
||
|
var _get_snapshot_summary = _interopRequireDefault(
|
||
|
require('./get_snapshot_summary')
|
||
|
);
|
||
|
|
||
|
function _interopRequireDefault(obj) {
|
||
|
return obj && obj.__esModule ? obj : {default: obj};
|
||
|
}
|
||
|
|
||
|
function _defineProperty(obj, key, value) {
|
||
|
if (key in obj) {
|
||
|
Object.defineProperty(obj, key, {
|
||
|
value: value,
|
||
|
enumerable: true,
|
||
|
configurable: true,
|
||
|
writable: true
|
||
|
});
|
||
|
} else {
|
||
|
obj[key] = value;
|
||
|
}
|
||
|
return obj;
|
||
|
}
|
||
|
|
||
|
const TEST_SUMMARY_THRESHOLD = 20;
|
||
|
const NPM_EVENTS = new Set([
|
||
|
'prepublish',
|
||
|
'publish',
|
||
|
'postpublish',
|
||
|
'preinstall',
|
||
|
'install',
|
||
|
'postinstall',
|
||
|
'preuninstall',
|
||
|
'uninstall',
|
||
|
'postuninstall',
|
||
|
'preversion',
|
||
|
'version',
|
||
|
'postversion',
|
||
|
'pretest',
|
||
|
'test',
|
||
|
'posttest',
|
||
|
'prestop',
|
||
|
'stop',
|
||
|
'poststop',
|
||
|
'prestart',
|
||
|
'start',
|
||
|
'poststart',
|
||
|
'prerestart',
|
||
|
'restart',
|
||
|
'postrestart'
|
||
|
]);
|
||
|
const _process$env = process.env,
|
||
|
npm_config_user_agent = _process$env.npm_config_user_agent,
|
||
|
npm_lifecycle_event = _process$env.npm_lifecycle_event,
|
||
|
npm_lifecycle_script = _process$env.npm_lifecycle_script;
|
||
|
|
||
|
class SummaryReporter extends _base_reporter.default {
|
||
|
constructor(globalConfig) {
|
||
|
super();
|
||
|
|
||
|
_defineProperty(this, '_estimatedTime', void 0);
|
||
|
|
||
|
_defineProperty(this, '_globalConfig', void 0);
|
||
|
|
||
|
this._globalConfig = globalConfig;
|
||
|
this._estimatedTime = 0;
|
||
|
} // If we write more than one character at a time it is possible that
|
||
|
// Node.js exits in the middle of printing the result. This was first observed
|
||
|
// in Node.js 0.10 and still persists in Node.js 6.7+.
|
||
|
// Let's print the test failure summary character by character which is safer
|
||
|
// when hundreds of tests are failing.
|
||
|
|
||
|
_write(string) {
|
||
|
for (let i = 0; i < string.length; i++) {
|
||
|
process.stderr.write(string.charAt(i));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
onRunStart(aggregatedResults, options) {
|
||
|
super.onRunStart(aggregatedResults, options);
|
||
|
this._estimatedTime = options.estimatedTime;
|
||
|
}
|
||
|
|
||
|
onRunComplete(contexts, aggregatedResults) {
|
||
|
const numTotalTestSuites = aggregatedResults.numTotalTestSuites,
|
||
|
testResults = aggregatedResults.testResults,
|
||
|
wasInterrupted = aggregatedResults.wasInterrupted;
|
||
|
|
||
|
if (numTotalTestSuites) {
|
||
|
const lastResult = testResults[testResults.length - 1]; // Print a newline if the last test did not fail to line up newlines
|
||
|
// similar to when an error would have been thrown in the test.
|
||
|
|
||
|
if (
|
||
|
!this._globalConfig.verbose &&
|
||
|
lastResult &&
|
||
|
!lastResult.numFailingTests &&
|
||
|
!lastResult.testExecError
|
||
|
) {
|
||
|
this.log('');
|
||
|
}
|
||
|
|
||
|
this._printSummary(aggregatedResults, this._globalConfig);
|
||
|
|
||
|
this._printSnapshotSummary(
|
||
|
aggregatedResults.snapshot,
|
||
|
this._globalConfig
|
||
|
);
|
||
|
|
||
|
if (numTotalTestSuites) {
|
||
|
let message = (0, _utils.getSummary)(aggregatedResults, {
|
||
|
estimatedTime: this._estimatedTime
|
||
|
});
|
||
|
|
||
|
if (!this._globalConfig.silent) {
|
||
|
message +=
|
||
|
'\n' +
|
||
|
(wasInterrupted
|
||
|
? _chalk().default.bold.red('Test run was interrupted.')
|
||
|
: this._getTestSummary(contexts, this._globalConfig));
|
||
|
}
|
||
|
|
||
|
this.log(message);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
_printSnapshotSummary(snapshots, globalConfig) {
|
||
|
if (
|
||
|
snapshots.added ||
|
||
|
snapshots.filesRemoved ||
|
||
|
snapshots.unchecked ||
|
||
|
snapshots.unmatched ||
|
||
|
snapshots.updated
|
||
|
) {
|
||
|
let updateCommand;
|
||
|
const event = npm_lifecycle_event || '';
|
||
|
const prefix = NPM_EVENTS.has(event) ? '' : 'run ';
|
||
|
const isYarn =
|
||
|
typeof npm_config_user_agent === 'string' &&
|
||
|
npm_config_user_agent.includes('yarn');
|
||
|
const client = isYarn ? 'yarn' : 'npm';
|
||
|
const scriptUsesJest =
|
||
|
typeof npm_lifecycle_script === 'string' &&
|
||
|
npm_lifecycle_script.includes('jest');
|
||
|
|
||
|
if (globalConfig.watch || globalConfig.watchAll) {
|
||
|
updateCommand = 'press `u`';
|
||
|
} else if (event && scriptUsesJest) {
|
||
|
updateCommand = `run \`${client +
|
||
|
' ' +
|
||
|
prefix +
|
||
|
event +
|
||
|
(isYarn ? '' : ' --')} -u\``;
|
||
|
} else {
|
||
|
updateCommand = 're-run jest with `-u`';
|
||
|
}
|
||
|
|
||
|
const snapshotSummary = (0, _get_snapshot_summary.default)(
|
||
|
snapshots,
|
||
|
globalConfig,
|
||
|
updateCommand
|
||
|
);
|
||
|
snapshotSummary.forEach(this.log);
|
||
|
this.log(''); // print empty line
|
||
|
}
|
||
|
}
|
||
|
|
||
|
_printSummary(aggregatedResults, globalConfig) {
|
||
|
// If there were any failing tests and there was a large number of tests
|
||
|
// executed, re-print the failing results at the end of execution output.
|
||
|
const failedTests = aggregatedResults.numFailedTests;
|
||
|
const runtimeErrors = aggregatedResults.numRuntimeErrorTestSuites;
|
||
|
|
||
|
if (
|
||
|
failedTests + runtimeErrors > 0 &&
|
||
|
aggregatedResults.numTotalTestSuites > TEST_SUMMARY_THRESHOLD
|
||
|
) {
|
||
|
this.log(_chalk().default.bold('Summary of all failing tests'));
|
||
|
aggregatedResults.testResults.forEach(testResult => {
|
||
|
const failureMessage = testResult.failureMessage;
|
||
|
|
||
|
if (failureMessage) {
|
||
|
this._write(
|
||
|
(0, _get_result_header.default)(testResult, globalConfig) +
|
||
|
'\n' +
|
||
|
failureMessage +
|
||
|
'\n'
|
||
|
);
|
||
|
}
|
||
|
});
|
||
|
this.log(''); // print empty line
|
||
|
}
|
||
|
}
|
||
|
|
||
|
_getTestSummary(contexts, globalConfig) {
|
||
|
const getMatchingTestsInfo = () => {
|
||
|
const prefix = globalConfig.findRelatedTests
|
||
|
? ' related to files matching '
|
||
|
: ' matching ';
|
||
|
return (
|
||
|
_chalk().default.dim(prefix) +
|
||
|
(0, _jestUtil().testPathPatternToRegExp)(
|
||
|
globalConfig.testPathPattern
|
||
|
).toString()
|
||
|
);
|
||
|
};
|
||
|
|
||
|
let testInfo = '';
|
||
|
|
||
|
if (globalConfig.runTestsByPath) {
|
||
|
testInfo = _chalk().default.dim(' within paths');
|
||
|
} else if (globalConfig.onlyChanged) {
|
||
|
testInfo = _chalk().default.dim(' related to changed files');
|
||
|
} else if (globalConfig.testPathPattern) {
|
||
|
testInfo = getMatchingTestsInfo();
|
||
|
}
|
||
|
|
||
|
let nameInfo = '';
|
||
|
|
||
|
if (globalConfig.runTestsByPath) {
|
||
|
nameInfo = ' ' + globalConfig.nonFlagArgs.map(p => `"${p}"`).join(', ');
|
||
|
} else if (globalConfig.testNamePattern) {
|
||
|
nameInfo =
|
||
|
_chalk().default.dim(' with tests matching ') +
|
||
|
`"${globalConfig.testNamePattern}"`;
|
||
|
}
|
||
|
|
||
|
const contextInfo =
|
||
|
contexts.size > 1
|
||
|
? _chalk().default.dim(' in ') +
|
||
|
contexts.size +
|
||
|
_chalk().default.dim(' projects')
|
||
|
: '';
|
||
|
return (
|
||
|
_chalk().default.dim('Ran all test suites') +
|
||
|
testInfo +
|
||
|
nameInfo +
|
||
|
contextInfo +
|
||
|
_chalk().default.dim('.')
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
exports.default = SummaryReporter;
|