123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- 'use strict';
- Object.defineProperty(exports, '__esModule', {
- value: true
- });
- exports.runAndTransformResultsToJestFormat = exports.initialize = void 0;
- var _testResult = require('@jest/test-result');
- var _expect = require('expect');
- var _jestMessageUtil = require('jest-message-util');
- var _jestSnapshot = require('jest-snapshot');
- var _jestEach = require('jest-each');
- var _throat = _interopRequireDefault(require('throat'));
- var _state = require('../state');
- var _utils = require('../utils');
- var _run = _interopRequireDefault(require('../run'));
- var _testCaseReportHandler = _interopRequireDefault(
- require('../testCaseReportHandler')
- );
- var _ = _interopRequireDefault(require('..'));
- var _jestExpect = _interopRequireDefault(require('./jestExpect'));
- function _interopRequireDefault(obj) {
- return obj && obj.__esModule ? obj : {default: obj};
- }
- /**
- * Copyright (c) Facebook, Inc. and its affiliates. 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 initialize = async ({
- config,
- environment,
- getPrettier,
- getBabelTraverse,
- globalConfig,
- localRequire,
- parentProcess,
- sendMessageToJest,
- setGlobalsForRuntime,
- testPath
- }) => {
- var _config$injectGlobals;
- if (globalConfig.testTimeout) {
- (0, _state.getState)().testTimeout = globalConfig.testTimeout;
- }
- const mutex = (0, _throat.default)(globalConfig.maxConcurrency); // @ts-expect-error
- const globalsObject = {
- ..._.default,
- fdescribe: _.default.describe.only,
- fit: _.default.it.only,
- xdescribe: _.default.describe.skip,
- xit: _.default.it.skip,
- xtest: _.default.it.skip
- };
- globalsObject.test.concurrent = (test => {
- const concurrent = (testName, testFn, timeout) => {
- // For concurrent tests we first run the function that returns promise, and then register a
- // normal test that will be waiting on the returned promise (when we start the test, the promise
- // will already be in the process of execution).
- // Unfortunately at this stage there's no way to know if there are any `.only` tests in the suite
- // that will result in this test to be skipped, so we'll be executing the promise function anyway,
- // even if it ends up being skipped.
- const promise = mutex(() => testFn());
- globalsObject.test(testName, () => promise, timeout);
- };
- const only = (testName, testFn, timeout) => {
- const promise = mutex(() => testFn()); // eslint-disable-next-line jest/no-focused-tests
- test.only(testName, () => promise, timeout);
- };
- concurrent.only = only;
- concurrent.skip = test.skip;
- concurrent.each = (0, _jestEach.bind)(test, false);
- concurrent.skip.each = (0, _jestEach.bind)(test.skip, false);
- only.each = (0, _jestEach.bind)(test.only, false);
- return concurrent;
- })(globalsObject.test);
- (0, _state.addEventHandler)(eventHandler);
- if (environment.handleTestEvent) {
- (0, _state.addEventHandler)(environment.handleTestEvent.bind(environment));
- }
- const runtimeGlobals = {
- ...globalsObject,
- expect: (0, _jestExpect.default)(globalConfig)
- }; // TODO: `jest-circus` might be newer than `jest-runtime` - remove `?.` for Jest 27
- setGlobalsForRuntime === null || setGlobalsForRuntime === void 0
- ? void 0
- : setGlobalsForRuntime(runtimeGlobals); // TODO: `jest-circus` might be newer than `jest-config` - remove `??` for Jest 27
- if (
- (_config$injectGlobals = config.injectGlobals) !== null &&
- _config$injectGlobals !== void 0
- ? _config$injectGlobals
- : true
- ) {
- Object.assign(environment.global, runtimeGlobals);
- }
- await (0, _state.dispatch)({
- name: 'setup',
- parentProcess,
- runtimeGlobals,
- testNamePattern: globalConfig.testNamePattern
- });
- if (config.testLocationInResults) {
- await (0, _state.dispatch)({
- name: 'include_test_location_in_result'
- });
- } // Jest tests snapshotSerializers in order preceding built-in serializers.
- // Therefore, add in reverse because the last added is the first tested.
- config.snapshotSerializers
- .concat()
- .reverse()
- .forEach(path => (0, _jestSnapshot.addSerializer)(localRequire(path)));
- const {expand, updateSnapshot} = globalConfig;
- const snapshotResolver = (0, _jestSnapshot.buildSnapshotResolver)(config);
- const snapshotPath = snapshotResolver.resolveSnapshotPath(testPath);
- const snapshotState = new _jestSnapshot.SnapshotState(snapshotPath, {
- expand,
- getBabelTraverse,
- getPrettier,
- updateSnapshot
- }); // @ts-expect-error: snapshotState is a jest extension of `expect`
- (0, _expect.setState)({
- snapshotState,
- testPath
- });
- (0, _state.addEventHandler)(handleSnapshotStateAfterRetry(snapshotState));
- if (sendMessageToJest) {
- (0, _state.addEventHandler)(
- (0, _testCaseReportHandler.default)(testPath, sendMessageToJest)
- );
- } // Return it back to the outer scope (test runner outside the VM).
- return {
- globals: globalsObject,
- snapshotState
- };
- };
- exports.initialize = initialize;
- const runAndTransformResultsToJestFormat = async ({
- config,
- globalConfig,
- testPath
- }) => {
- const runResult = await (0, _run.default)();
- let numFailingTests = 0;
- let numPassingTests = 0;
- let numPendingTests = 0;
- let numTodoTests = 0;
- const assertionResults = runResult.testResults.map(testResult => {
- let status;
- if (testResult.status === 'skip') {
- status = 'pending';
- numPendingTests += 1;
- } else if (testResult.status === 'todo') {
- status = 'todo';
- numTodoTests += 1;
- } else if (testResult.errors.length) {
- status = 'failed';
- numFailingTests += 1;
- } else {
- status = 'passed';
- numPassingTests += 1;
- }
- const ancestorTitles = testResult.testPath.filter(
- name => name !== _state.ROOT_DESCRIBE_BLOCK_NAME
- );
- const title = ancestorTitles.pop();
- return {
- ancestorTitles,
- duration: testResult.duration,
- failureDetails: testResult.errorsDetailed,
- failureMessages: testResult.errors,
- fullName: title
- ? ancestorTitles.concat(title).join(' ')
- : ancestorTitles.join(' '),
- invocations: testResult.invocations,
- location: testResult.location,
- numPassingAsserts: 0,
- status,
- title: testResult.testPath[testResult.testPath.length - 1]
- };
- });
- let failureMessage = (0, _jestMessageUtil.formatResultsErrors)(
- assertionResults,
- config,
- globalConfig,
- testPath
- );
- let testExecError;
- if (runResult.unhandledErrors.length) {
- testExecError = {
- message: '',
- stack: runResult.unhandledErrors.join('\n')
- };
- failureMessage =
- (failureMessage || '') +
- '\n\n' +
- runResult.unhandledErrors
- .map(err =>
- (0, _jestMessageUtil.formatExecError)(err, config, globalConfig)
- )
- .join('\n');
- }
- await (0, _state.dispatch)({
- name: 'teardown'
- });
- return {
- ...(0, _testResult.createEmptyTestResult)(),
- console: undefined,
- displayName: config.displayName,
- failureMessage,
- numFailingTests,
- numPassingTests,
- numPendingTests,
- numTodoTests,
- sourceMaps: {},
- testExecError,
- testFilePath: testPath,
- testResults: assertionResults
- };
- };
- exports.runAndTransformResultsToJestFormat = runAndTransformResultsToJestFormat;
- const handleSnapshotStateAfterRetry = snapshotState => event => {
- switch (event.name) {
- case 'test_retry': {
- // Clear any snapshot data that occurred in previous test run
- snapshotState.clear();
- }
- }
- };
- const eventHandler = async event => {
- switch (event.name) {
- case 'test_start': {
- (0, _expect.setState)({
- currentTestName: (0, _utils.getTestID)(event.test)
- });
- break;
- }
- case 'test_done': {
- _addSuppressedErrors(event.test);
- _addExpectedAssertionErrors(event.test);
- break;
- }
- }
- };
- const _addExpectedAssertionErrors = test => {
- const failures = (0, _expect.extractExpectedAssertionsErrors)();
- const errors = failures.map(failure => failure.error);
- test.errors = test.errors.concat(errors);
- }; // Get suppressed errors from ``jest-matchers`` that weren't throw during
- // test execution and add them to the test result, potentially failing
- // a passing test.
- const _addSuppressedErrors = test => {
- const {suppressedErrors} = (0, _expect.getState)();
- (0, _expect.setState)({
- suppressedErrors: []
- });
- if (suppressedErrors.length) {
- test.errors = test.errors.concat(suppressedErrors);
- }
- };
|