301 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			301 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| Object.defineProperty(exports, '__esModule', {
 | |
|   value: true
 | |
| });
 | |
| exports.runAndTransformResultsToJestFormat = exports.initialize = void 0;
 | |
| 
 | |
| var _expect = require('expect');
 | |
| 
 | |
| var _jestMessageUtil = require('jest-message-util');
 | |
| 
 | |
| var _jestSnapshot = require('jest-snapshot');
 | |
| 
 | |
| var _throat = _interopRequireDefault(require('throat'));
 | |
| 
 | |
| var _state = require('../state');
 | |
| 
 | |
| var _utils = require('../utils');
 | |
| 
 | |
| var _run = _interopRequireDefault(require('../run'));
 | |
| 
 | |
| var _ = _interopRequireDefault(require('..'));
 | |
| 
 | |
| function _interopRequireDefault(obj) {
 | |
|   return obj && obj.__esModule ? obj : {default: obj};
 | |
| }
 | |
| 
 | |
| var Symbol = global['jest-symbol-do-not-touch'] || global.Symbol;
 | |
| var Symbol = global['jest-symbol-do-not-touch'] || global.Symbol;
 | |
| var Promise = global[Symbol.for('jest-native-promise')] || global.Promise;
 | |
| 
 | |
| function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
 | |
|   try {
 | |
|     var info = gen[key](arg);
 | |
|     var value = info.value;
 | |
|   } catch (error) {
 | |
|     reject(error);
 | |
|     return;
 | |
|   }
 | |
|   if (info.done) {
 | |
|     resolve(value);
 | |
|   } else {
 | |
|     Promise.resolve(value).then(_next, _throw);
 | |
|   }
 | |
| }
 | |
| 
 | |
| function _asyncToGenerator(fn) {
 | |
|   return function() {
 | |
|     var self = this,
 | |
|       args = arguments;
 | |
|     return new Promise(function(resolve, reject) {
 | |
|       var gen = fn.apply(self, args);
 | |
|       function _next(value) {
 | |
|         asyncGeneratorStep(gen, resolve, reject, _next, _throw, 'next', value);
 | |
|       }
 | |
|       function _throw(err) {
 | |
|         asyncGeneratorStep(gen, resolve, reject, _next, _throw, 'throw', err);
 | |
|       }
 | |
|       _next(undefined);
 | |
|     });
 | |
|   };
 | |
| }
 | |
| 
 | |
| const initialize = ({
 | |
|   config,
 | |
|   environment,
 | |
|   getPrettier,
 | |
|   getBabelTraverse,
 | |
|   globalConfig,
 | |
|   localRequire,
 | |
|   parentProcess,
 | |
|   testPath
 | |
| }) => {
 | |
|   const mutex = (0, _throat.default)(globalConfig.maxConcurrency);
 | |
|   Object.assign(global, _.default);
 | |
|   global.xit = global.it.skip;
 | |
|   global.xtest = global.it.skip;
 | |
|   global.xdescribe = global.describe.skip;
 | |
|   global.fit = global.it.only;
 | |
|   global.fdescribe = global.describe.only;
 | |
| 
 | |
|   global.test.concurrent = (test => {
 | |
|     const concurrent = (testName, testFn, timeout) => {
 | |
|       // For concurrent tests we first run the function that returns promise, and then register a
 | |
|       // nomral 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());
 | |
|       global.test(testName, () => promise, timeout);
 | |
|     };
 | |
| 
 | |
|     concurrent.only = (testName, testFn, timeout) => {
 | |
|       const promise = mutex(() => testFn()); // eslint-disable-next-line jest/no-focused-tests
 | |
| 
 | |
|       test.only(testName, () => promise, timeout);
 | |
|     };
 | |
| 
 | |
|     concurrent.skip = test.skip;
 | |
|     return concurrent;
 | |
|   })(global.test);
 | |
| 
 | |
|   (0, _state.addEventHandler)(eventHandler);
 | |
| 
 | |
|   if (environment.handleTestEvent) {
 | |
|     (0, _state.addEventHandler)(environment.handleTestEvent.bind(environment));
 | |
|   }
 | |
| 
 | |
|   (0, _state.dispatch)({
 | |
|     name: 'setup',
 | |
|     parentProcess,
 | |
|     testNamePattern: globalConfig.testNamePattern
 | |
|   });
 | |
| 
 | |
|   if (config.testLocationInResults) {
 | |
|     (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 = globalConfig.expand,
 | |
|     updateSnapshot = globalConfig.updateSnapshot;
 | |
|   const snapshotResolver = (0, _jestSnapshot.buildSnapshotResolver)(config);
 | |
|   const snapshotPath = snapshotResolver.resolveSnapshotPath(testPath);
 | |
|   const snapshotState = new _jestSnapshot.SnapshotState(snapshotPath, {
 | |
|     expand,
 | |
|     getBabelTraverse,
 | |
|     getPrettier,
 | |
|     updateSnapshot
 | |
|   });
 | |
|   (0, _expect.setState)({
 | |
|     snapshotState,
 | |
|     testPath
 | |
|   }); // Return it back to the outer scope (test runner outside the VM).
 | |
| 
 | |
|   return {
 | |
|     globals: _.default,
 | |
|     snapshotState
 | |
|   };
 | |
| };
 | |
| 
 | |
| exports.initialize = initialize;
 | |
| 
 | |
| const runAndTransformResultsToJestFormat =
 | |
|   /*#__PURE__*/
 | |
|   (function() {
 | |
|     var _ref = _asyncToGenerator(function*({config, globalConfig, testPath}) {
 | |
|       const runResult = yield (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,
 | |
|           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');
 | |
|       }
 | |
| 
 | |
|       (0, _state.dispatch)({
 | |
|         name: 'teardown'
 | |
|       });
 | |
|       return {
 | |
|         console: undefined,
 | |
|         displayName: config.displayName,
 | |
|         failureMessage,
 | |
|         leaks: false,
 | |
|         // That's legacy code, just adding it so Flow is happy.
 | |
|         numFailingTests,
 | |
|         numPassingTests,
 | |
|         numPendingTests,
 | |
|         numTodoTests,
 | |
|         openHandles: [],
 | |
|         perfStats: {
 | |
|           // populated outside
 | |
|           end: 0,
 | |
|           start: 0
 | |
|         },
 | |
|         skipped: false,
 | |
|         snapshot: {
 | |
|           added: 0,
 | |
|           fileDeleted: false,
 | |
|           matched: 0,
 | |
|           unchecked: 0,
 | |
|           uncheckedKeys: [],
 | |
|           unmatched: 0,
 | |
|           updated: 0
 | |
|         },
 | |
|         sourceMaps: {},
 | |
|         testExecError,
 | |
|         testFilePath: testPath,
 | |
|         testResults: assertionResults
 | |
|       };
 | |
|     });
 | |
| 
 | |
|     return function runAndTransformResultsToJestFormat(_x) {
 | |
|       return _ref.apply(this, arguments);
 | |
|     };
 | |
|   })();
 | |
| 
 | |
| exports.runAndTransformResultsToJestFormat = runAndTransformResultsToJestFormat;
 | |
| 
 | |
| const eventHandler = 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 _getState = (0, _expect.getState)(),
 | |
|     suppressedErrors = _getState.suppressedErrors;
 | |
| 
 | |
|   (0, _expect.setState)({
 | |
|     suppressedErrors: []
 | |
|   });
 | |
| 
 | |
|   if (suppressedErrors.length) {
 | |
|     test.errors = test.errors.concat(suppressedErrors);
 | |
|   }
 | |
| };
 |