UNPKG

only-changed-jest-watch-plugin

Version:

Jest watch plugin for running either only the modified test (for TDD), or tests of dependant modules

289 lines (249 loc) 7.75 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var _chalk; function _load_chalk() { return (_chalk = _interopRequireDefault(require('chalk'))); } var _base_reporter; function _load_base_reporter() { return (_base_reporter = _interopRequireDefault(require('./base_reporter'))); } var _utils; function _load_utils() { return (_utils = require('./utils')); } var _get_result_header; function _load_get_result_header() { return (_get_result_header = _interopRequireDefault( require('./get_result_header') )); } var _get_snapshot_summary; function _load_get_snapshot_summary() { return (_get_snapshot_summary = _interopRequireDefault( require('./get_snapshot_summary') )); } var _testPathPatternToRegexp; function _load_testPathPatternToRegexp() { return (_testPathPatternToRegexp = _interopRequireDefault( require('../testPathPatternToRegexp') )); } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : {default: obj}; } /** * Copyright (c) 2014-present, Facebook, Inc. All rights reserved. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * */ 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' ]); class SummaryReporter extends (_base_reporter || _load_base_reporter()) .default { constructor(globalConfig) { super(); 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 || _load_utils()).getSummary)( aggregatedResults, { estimatedTime: this._estimatedTime } ); if (!this._globalConfig.silent) { message += '\n' + (wasInterrupted ? (_chalk || _load_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 = process.env.npm_lifecycle_event; const prefix = NPM_EVENTS.has(event) ? '' : 'run '; const isYarn = typeof process.env.npm_config_user_agent === 'string' && process.env.npm_config_user_agent.match('yarn') !== null; const client = isYarn ? 'yarn' : 'npm'; const scriptUsesJest = typeof process.env.npm_lifecycle_script === 'string' && process.env.npm_lifecycle_script.indexOf('jest') !== -1; if (globalConfig.watch) { 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 || _load_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 || _load_chalk()).default.bold('Summary of all failing tests') ); aggregatedResults.testResults.forEach(testResult => { const failureMessage = testResult.failureMessage; if (failureMessage) { this._write( (0, (_get_result_header || _load_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 || _load_chalk()).default.dim(prefix) + (0, (_testPathPatternToRegexp || _load_testPathPatternToRegexp()).default)( globalConfig.testPathPattern ).toString() ); }; let testInfo = ''; if (globalConfig.runTestsByPath) { testInfo = (_chalk || _load_chalk()).default.dim(' within paths'); } else if (globalConfig.onlyChanged) { testInfo = (_chalk || _load_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 || _load_chalk()).default.dim(' with tests matching ') + `"${globalConfig.testNamePattern}"`; } const contextInfo = contexts.size > 1 ? (_chalk || _load_chalk()).default.dim(' in ') + contexts.size + (_chalk || _load_chalk()).default.dim(' projects') : ''; return ( (_chalk || _load_chalk()).default.dim('Ran all test suites') + testInfo + nameInfo + contextInfo + (_chalk || _load_chalk()).default.dim('.') ); } } exports.default = SummaryReporter;