176 lines
4.9 KiB
JavaScript
176 lines
4.9 KiB
JavaScript
|
'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 _DefaultReporter = _interopRequireDefault(require('./DefaultReporter'));
|
||
|
function _interopRequireDefault(obj) {
|
||
|
return obj && obj.__esModule ? obj : {default: obj};
|
||
|
}
|
||
|
/**
|
||
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||
|
*
|
||
|
* This source code is licensed under the MIT license found in the
|
||
|
* LICENSE file in the root directory of this source tree.
|
||
|
*/
|
||
|
|
||
|
const {ICONS} = _jestUtil().specialChars;
|
||
|
class VerboseReporter extends _DefaultReporter.default {
|
||
|
_globalConfig;
|
||
|
static filename = __filename;
|
||
|
constructor(globalConfig) {
|
||
|
super(globalConfig);
|
||
|
this._globalConfig = globalConfig;
|
||
|
}
|
||
|
|
||
|
// Verbose mode is for debugging. Buffering of output is undesirable.
|
||
|
// See https://github.com/jestjs/jest/issues/8208
|
||
|
__wrapStdio(stream) {
|
||
|
const write = stream.write.bind(stream);
|
||
|
stream.write = chunk => {
|
||
|
this.__clearStatus();
|
||
|
write(chunk);
|
||
|
this.__printStatus();
|
||
|
return true;
|
||
|
};
|
||
|
}
|
||
|
static filterTestResults(testResults) {
|
||
|
return testResults.filter(({status}) => status !== 'pending');
|
||
|
}
|
||
|
static groupTestsBySuites(testResults) {
|
||
|
const root = {
|
||
|
suites: [],
|
||
|
tests: [],
|
||
|
title: ''
|
||
|
};
|
||
|
testResults.forEach(testResult => {
|
||
|
let targetSuite = root;
|
||
|
|
||
|
// Find the target suite for this test,
|
||
|
// creating nested suites as necessary.
|
||
|
for (const title of testResult.ancestorTitles) {
|
||
|
let matchingSuite = targetSuite.suites.find(s => s.title === title);
|
||
|
if (!matchingSuite) {
|
||
|
matchingSuite = {
|
||
|
suites: [],
|
||
|
tests: [],
|
||
|
title
|
||
|
};
|
||
|
targetSuite.suites.push(matchingSuite);
|
||
|
}
|
||
|
targetSuite = matchingSuite;
|
||
|
}
|
||
|
targetSuite.tests.push(testResult);
|
||
|
});
|
||
|
return root;
|
||
|
}
|
||
|
onTestResult(test, result, aggregatedResults) {
|
||
|
super.testFinished(test.context.config, result, aggregatedResults);
|
||
|
if (!result.skipped) {
|
||
|
this.printTestFileHeader(
|
||
|
result.testFilePath,
|
||
|
test.context.config,
|
||
|
result
|
||
|
);
|
||
|
if (!result.testExecError && !result.skipped) {
|
||
|
this._logTestResults(result.testResults);
|
||
|
}
|
||
|
this.printTestFileFailureMessage(
|
||
|
result.testFilePath,
|
||
|
test.context.config,
|
||
|
result
|
||
|
);
|
||
|
}
|
||
|
super.forceFlushBufferedOutput();
|
||
|
}
|
||
|
_logTestResults(testResults) {
|
||
|
this._logSuite(VerboseReporter.groupTestsBySuites(testResults), 0);
|
||
|
this._logLine();
|
||
|
}
|
||
|
_logSuite(suite, indentLevel) {
|
||
|
if (suite.title) {
|
||
|
this._logLine(suite.title, indentLevel);
|
||
|
}
|
||
|
this._logTests(suite.tests, indentLevel + 1);
|
||
|
suite.suites.forEach(suite => this._logSuite(suite, indentLevel + 1));
|
||
|
}
|
||
|
_getIcon(status) {
|
||
|
if (status === 'failed') {
|
||
|
return _chalk().default.red(ICONS.failed);
|
||
|
} else if (status === 'pending') {
|
||
|
return _chalk().default.yellow(ICONS.pending);
|
||
|
} else if (status === 'todo') {
|
||
|
return _chalk().default.magenta(ICONS.todo);
|
||
|
} else {
|
||
|
return _chalk().default.green(ICONS.success);
|
||
|
}
|
||
|
}
|
||
|
_logTest(test, indentLevel) {
|
||
|
const status = this._getIcon(test.status);
|
||
|
const time = test.duration
|
||
|
? ` (${(0, _jestUtil().formatTime)(Math.round(test.duration))})`
|
||
|
: '';
|
||
|
this._logLine(
|
||
|
`${status} ${_chalk().default.dim(test.title + time)}`,
|
||
|
indentLevel
|
||
|
);
|
||
|
}
|
||
|
_logTests(tests, indentLevel) {
|
||
|
if (this._globalConfig.expand) {
|
||
|
tests.forEach(test => this._logTest(test, indentLevel));
|
||
|
} else {
|
||
|
const summedTests = tests.reduce(
|
||
|
(result, test) => {
|
||
|
if (test.status === 'pending') {
|
||
|
result.pending.push(test);
|
||
|
} else if (test.status === 'todo') {
|
||
|
result.todo.push(test);
|
||
|
} else {
|
||
|
this._logTest(test, indentLevel);
|
||
|
}
|
||
|
return result;
|
||
|
},
|
||
|
{
|
||
|
pending: [],
|
||
|
todo: []
|
||
|
}
|
||
|
);
|
||
|
if (summedTests.pending.length > 0) {
|
||
|
summedTests.pending.forEach(this._logTodoOrPendingTest(indentLevel));
|
||
|
}
|
||
|
if (summedTests.todo.length > 0) {
|
||
|
summedTests.todo.forEach(this._logTodoOrPendingTest(indentLevel));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
_logTodoOrPendingTest(indentLevel) {
|
||
|
return test => {
|
||
|
const printedTestStatus =
|
||
|
test.status === 'pending' ? 'skipped' : test.status;
|
||
|
const icon = this._getIcon(test.status);
|
||
|
const text = _chalk().default.dim(`${printedTestStatus} ${test.title}`);
|
||
|
this._logLine(`${icon} ${text}`, indentLevel);
|
||
|
};
|
||
|
}
|
||
|
_logLine(str, indentLevel) {
|
||
|
const indentation = ' '.repeat(indentLevel || 0);
|
||
|
this.log(indentation + (str || ''));
|
||
|
}
|
||
|
}
|
||
|
exports.default = VerboseReporter;
|