You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
271 lines
7.0 KiB
271 lines
7.0 KiB
'use strict'; |
|
|
|
Object.defineProperty(exports, '__esModule', { |
|
value: true |
|
}); |
|
exports.default = void 0; |
|
|
|
function _chalk() { |
|
const data = _interopRequireDefault(require('chalk')); |
|
|
|
_chalk = function () { |
|
return data; |
|
}; |
|
|
|
return data; |
|
} |
|
|
|
function _jestUtil() { |
|
const data = require('jest-util'); |
|
|
|
_jestUtil = function () { |
|
return data; |
|
}; |
|
|
|
return data; |
|
} |
|
|
|
var _BaseReporter = _interopRequireDefault(require('./BaseReporter')); |
|
|
|
var _getResultHeader = _interopRequireDefault(require('./getResultHeader')); |
|
|
|
var _getSnapshotSummary = _interopRequireDefault( |
|
require('./getSnapshotSummary') |
|
); |
|
|
|
var _utils = require('./utils'); |
|
|
|
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 {npm_config_user_agent, npm_lifecycle_event, npm_lifecycle_script} = |
|
process.env; |
|
|
|
class SummaryReporter extends _BaseReporter.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, testResults, wasInterrupted} = aggregatedResults; |
|
|
|
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, _getSnapshotSummary.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; |
|
|
|
if (failureMessage) { |
|
this._write( |
|
(0, _getResultHeader.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; |
|
|
|
_defineProperty(SummaryReporter, 'filename', __filename);
|
|
|