433 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			433 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | 
 | ||
|  | Object.defineProperty(exports, '__esModule', { | ||
|  |   value: true | ||
|  | }); | ||
|  | exports.default = void 0; | ||
|  | 
 | ||
|  | var _types = require('./types'); | ||
|  | 
 | ||
|  | var _state = require('./state'); | ||
|  | 
 | ||
|  | var _utils = require('./utils'); | ||
|  | 
 | ||
|  | var Symbol = global['jest-symbol-do-not-touch'] || global.Symbol; | ||
|  | var Promise = global[Symbol.for('jest-native-promise')] || global.Promise; | ||
|  | var Symbol = global['jest-symbol-do-not-touch'] || global.Symbol; | ||
|  | 
 | ||
|  | 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 run = | ||
|  |   /*#__PURE__*/ | ||
|  |   (function() { | ||
|  |     var _ref = _asyncToGenerator(function*() { | ||
|  |       const _getState = (0, _state.getState)(), | ||
|  |         rootDescribeBlock = _getState.rootDescribeBlock; | ||
|  | 
 | ||
|  |       (0, _state.dispatch)({ | ||
|  |         name: 'run_start' | ||
|  |       }); | ||
|  |       yield _runTestsForDescribeBlock(rootDescribeBlock); | ||
|  |       (0, _state.dispatch)({ | ||
|  |         name: 'run_finish' | ||
|  |       }); | ||
|  |       return (0, | ||
|  |       _utils.makeRunResult)((0, _state.getState)().rootDescribeBlock, (0, _state.getState)().unhandledErrors); | ||
|  |     }); | ||
|  | 
 | ||
|  |     return function run() { | ||
|  |       return _ref.apply(this, arguments); | ||
|  |     }; | ||
|  |   })(); | ||
|  | 
 | ||
|  | const _runTestsForDescribeBlock = | ||
|  |   /*#__PURE__*/ | ||
|  |   (function() { | ||
|  |     var _ref2 = _asyncToGenerator(function*(describeBlock) { | ||
|  |       (0, _state.dispatch)({ | ||
|  |         describeBlock, | ||
|  |         name: 'run_describe_start' | ||
|  |       }); | ||
|  | 
 | ||
|  |       const _getAllHooksForDescri = (0, _utils.getAllHooksForDescribe)( | ||
|  |           describeBlock | ||
|  |         ), | ||
|  |         beforeAll = _getAllHooksForDescri.beforeAll, | ||
|  |         afterAll = _getAllHooksForDescri.afterAll; | ||
|  | 
 | ||
|  |       var _iteratorNormalCompletion = true; | ||
|  |       var _didIteratorError = false; | ||
|  |       var _iteratorError = undefined; | ||
|  | 
 | ||
|  |       try { | ||
|  |         for ( | ||
|  |           var _iterator = beforeAll[Symbol.iterator](), _step; | ||
|  |           !(_iteratorNormalCompletion = (_step = _iterator.next()).done); | ||
|  |           _iteratorNormalCompletion = true | ||
|  |         ) { | ||
|  |           const hook = _step.value; | ||
|  |           yield _callCircusHook({ | ||
|  |             describeBlock, | ||
|  |             hook | ||
|  |           }); | ||
|  |         } // Tests that fail and are retried we run after other tests
 | ||
|  |       } catch (err) { | ||
|  |         _didIteratorError = true; | ||
|  |         _iteratorError = err; | ||
|  |       } finally { | ||
|  |         try { | ||
|  |           if (!_iteratorNormalCompletion && _iterator.return != null) { | ||
|  |             _iterator.return(); | ||
|  |           } | ||
|  |         } finally { | ||
|  |           if (_didIteratorError) { | ||
|  |             throw _iteratorError; | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  | 
 | ||
|  |       const retryTimes = parseInt(global[_types.RETRY_TIMES], 10) || 0; | ||
|  |       const deferredRetryTests = []; | ||
|  |       var _iteratorNormalCompletion2 = true; | ||
|  |       var _didIteratorError2 = false; | ||
|  |       var _iteratorError2 = undefined; | ||
|  | 
 | ||
|  |       try { | ||
|  |         for ( | ||
|  |           var _iterator2 = describeBlock.tests[Symbol.iterator](), _step2; | ||
|  |           !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); | ||
|  |           _iteratorNormalCompletion2 = true | ||
|  |         ) { | ||
|  |           const test = _step2.value; | ||
|  |           const hasErrorsBeforeTestRun = test.errors.length > 0; | ||
|  |           yield _runTest(test); | ||
|  | 
 | ||
|  |           if ( | ||
|  |             hasErrorsBeforeTestRun === false && | ||
|  |             retryTimes > 0 && | ||
|  |             test.errors.length > 0 | ||
|  |           ) { | ||
|  |             deferredRetryTests.push(test); | ||
|  |           } | ||
|  |         } // Re-run failed tests n-times if configured
 | ||
|  |       } catch (err) { | ||
|  |         _didIteratorError2 = true; | ||
|  |         _iteratorError2 = err; | ||
|  |       } finally { | ||
|  |         try { | ||
|  |           if (!_iteratorNormalCompletion2 && _iterator2.return != null) { | ||
|  |             _iterator2.return(); | ||
|  |           } | ||
|  |         } finally { | ||
|  |           if (_didIteratorError2) { | ||
|  |             throw _iteratorError2; | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  | 
 | ||
|  |       for (var _i = 0; _i < deferredRetryTests.length; _i++) { | ||
|  |         const test = deferredRetryTests[_i]; | ||
|  |         let numRetriesAvailable = retryTimes; | ||
|  | 
 | ||
|  |         while (numRetriesAvailable > 0 && test.errors.length > 0) { | ||
|  |           // Clear errors so retries occur
 | ||
|  |           (0, _state.dispatch)({ | ||
|  |             name: 'test_retry', | ||
|  |             test | ||
|  |           }); | ||
|  |           yield _runTest(test); | ||
|  |           numRetriesAvailable--; | ||
|  |         } | ||
|  |       } | ||
|  | 
 | ||
|  |       var _iteratorNormalCompletion3 = true; | ||
|  |       var _didIteratorError3 = false; | ||
|  |       var _iteratorError3 = undefined; | ||
|  | 
 | ||
|  |       try { | ||
|  |         for ( | ||
|  |           var _iterator3 = describeBlock.children[Symbol.iterator](), _step3; | ||
|  |           !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); | ||
|  |           _iteratorNormalCompletion3 = true | ||
|  |         ) { | ||
|  |           const child = _step3.value; | ||
|  |           yield _runTestsForDescribeBlock(child); | ||
|  |         } | ||
|  |       } catch (err) { | ||
|  |         _didIteratorError3 = true; | ||
|  |         _iteratorError3 = err; | ||
|  |       } finally { | ||
|  |         try { | ||
|  |           if (!_iteratorNormalCompletion3 && _iterator3.return != null) { | ||
|  |             _iterator3.return(); | ||
|  |           } | ||
|  |         } finally { | ||
|  |           if (_didIteratorError3) { | ||
|  |             throw _iteratorError3; | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  | 
 | ||
|  |       var _iteratorNormalCompletion4 = true; | ||
|  |       var _didIteratorError4 = false; | ||
|  |       var _iteratorError4 = undefined; | ||
|  | 
 | ||
|  |       try { | ||
|  |         for ( | ||
|  |           var _iterator4 = afterAll[Symbol.iterator](), _step4; | ||
|  |           !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); | ||
|  |           _iteratorNormalCompletion4 = true | ||
|  |         ) { | ||
|  |           const hook = _step4.value; | ||
|  |           yield _callCircusHook({ | ||
|  |             describeBlock, | ||
|  |             hook | ||
|  |           }); | ||
|  |         } | ||
|  |       } catch (err) { | ||
|  |         _didIteratorError4 = true; | ||
|  |         _iteratorError4 = err; | ||
|  |       } finally { | ||
|  |         try { | ||
|  |           if (!_iteratorNormalCompletion4 && _iterator4.return != null) { | ||
|  |             _iterator4.return(); | ||
|  |           } | ||
|  |         } finally { | ||
|  |           if (_didIteratorError4) { | ||
|  |             throw _iteratorError4; | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  | 
 | ||
|  |       (0, _state.dispatch)({ | ||
|  |         describeBlock, | ||
|  |         name: 'run_describe_finish' | ||
|  |       }); | ||
|  |     }); | ||
|  | 
 | ||
|  |     return function _runTestsForDescribeBlock(_x) { | ||
|  |       return _ref2.apply(this, arguments); | ||
|  |     }; | ||
|  |   })(); | ||
|  | 
 | ||
|  | const _runTest = | ||
|  |   /*#__PURE__*/ | ||
|  |   (function() { | ||
|  |     var _ref3 = _asyncToGenerator(function*(test) { | ||
|  |       (0, _state.dispatch)({ | ||
|  |         name: 'test_start', | ||
|  |         test | ||
|  |       }); | ||
|  |       const testContext = Object.create(null); | ||
|  | 
 | ||
|  |       const _getState2 = (0, _state.getState)(), | ||
|  |         hasFocusedTests = _getState2.hasFocusedTests, | ||
|  |         testNamePattern = _getState2.testNamePattern; | ||
|  | 
 | ||
|  |       const isSkipped = | ||
|  |         test.mode === 'skip' || | ||
|  |         (hasFocusedTests && test.mode !== 'only') || | ||
|  |         (testNamePattern && !testNamePattern.test((0, _utils.getTestID)(test))); | ||
|  | 
 | ||
|  |       if (isSkipped) { | ||
|  |         (0, _state.dispatch)({ | ||
|  |           name: 'test_skip', | ||
|  |           test | ||
|  |         }); | ||
|  |         return; | ||
|  |       } | ||
|  | 
 | ||
|  |       if (test.mode === 'todo') { | ||
|  |         (0, _state.dispatch)({ | ||
|  |           name: 'test_todo', | ||
|  |           test | ||
|  |         }); | ||
|  |         return; | ||
|  |       } | ||
|  | 
 | ||
|  |       const _getEachHooksForTest = (0, _utils.getEachHooksForTest)(test), | ||
|  |         afterEach = _getEachHooksForTest.afterEach, | ||
|  |         beforeEach = _getEachHooksForTest.beforeEach; | ||
|  | 
 | ||
|  |       var _iteratorNormalCompletion5 = true; | ||
|  |       var _didIteratorError5 = false; | ||
|  |       var _iteratorError5 = undefined; | ||
|  | 
 | ||
|  |       try { | ||
|  |         for ( | ||
|  |           var _iterator5 = beforeEach[Symbol.iterator](), _step5; | ||
|  |           !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); | ||
|  |           _iteratorNormalCompletion5 = true | ||
|  |         ) { | ||
|  |           const hook = _step5.value; | ||
|  | 
 | ||
|  |           if (test.errors.length) { | ||
|  |             // If any of the before hooks failed already, we don't run any
 | ||
|  |             // hooks after that.
 | ||
|  |             break; | ||
|  |           } | ||
|  | 
 | ||
|  |           yield _callCircusHook({ | ||
|  |             hook, | ||
|  |             test, | ||
|  |             testContext | ||
|  |           }); | ||
|  |         } | ||
|  |       } catch (err) { | ||
|  |         _didIteratorError5 = true; | ||
|  |         _iteratorError5 = err; | ||
|  |       } finally { | ||
|  |         try { | ||
|  |           if (!_iteratorNormalCompletion5 && _iterator5.return != null) { | ||
|  |             _iterator5.return(); | ||
|  |           } | ||
|  |         } finally { | ||
|  |           if (_didIteratorError5) { | ||
|  |             throw _iteratorError5; | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  | 
 | ||
|  |       yield _callCircusTest(test, testContext); | ||
|  |       var _iteratorNormalCompletion6 = true; | ||
|  |       var _didIteratorError6 = false; | ||
|  |       var _iteratorError6 = undefined; | ||
|  | 
 | ||
|  |       try { | ||
|  |         for ( | ||
|  |           var _iterator6 = afterEach[Symbol.iterator](), _step6; | ||
|  |           !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); | ||
|  |           _iteratorNormalCompletion6 = true | ||
|  |         ) { | ||
|  |           const hook = _step6.value; | ||
|  |           yield _callCircusHook({ | ||
|  |             hook, | ||
|  |             test, | ||
|  |             testContext | ||
|  |           }); | ||
|  |         } // `afterAll` hooks should not affect test status (pass or fail), because if
 | ||
|  |         // we had a global `afterAll` hook it would block all existing tests until
 | ||
|  |         // this hook is executed. So we dispatch `test_done` right away.
 | ||
|  |       } catch (err) { | ||
|  |         _didIteratorError6 = true; | ||
|  |         _iteratorError6 = err; | ||
|  |       } finally { | ||
|  |         try { | ||
|  |           if (!_iteratorNormalCompletion6 && _iterator6.return != null) { | ||
|  |             _iterator6.return(); | ||
|  |           } | ||
|  |         } finally { | ||
|  |           if (_didIteratorError6) { | ||
|  |             throw _iteratorError6; | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  | 
 | ||
|  |       (0, _state.dispatch)({ | ||
|  |         name: 'test_done', | ||
|  |         test | ||
|  |       }); | ||
|  |     }); | ||
|  | 
 | ||
|  |     return function _runTest(_x2) { | ||
|  |       return _ref3.apply(this, arguments); | ||
|  |     }; | ||
|  |   })(); | ||
|  | 
 | ||
|  | const _callCircusHook = ({hook, test, describeBlock, testContext}) => { | ||
|  |   (0, _state.dispatch)({ | ||
|  |     hook, | ||
|  |     name: 'hook_start' | ||
|  |   }); | ||
|  |   const timeout = hook.timeout || (0, _state.getState)().testTimeout; | ||
|  |   return (0, _utils.callAsyncCircusFn)(hook.fn, testContext, { | ||
|  |     isHook: true, | ||
|  |     timeout | ||
|  |   }) | ||
|  |     .then(() => | ||
|  |       (0, _state.dispatch)({ | ||
|  |         describeBlock, | ||
|  |         hook, | ||
|  |         name: 'hook_success', | ||
|  |         test | ||
|  |       }) | ||
|  |     ) | ||
|  |     .catch(error => | ||
|  |       (0, _state.dispatch)({ | ||
|  |         describeBlock, | ||
|  |         error, | ||
|  |         hook, | ||
|  |         name: 'hook_failure', | ||
|  |         test | ||
|  |       }) | ||
|  |     ); | ||
|  | }; | ||
|  | 
 | ||
|  | const _callCircusTest = (test, testContext) => { | ||
|  |   (0, _state.dispatch)({ | ||
|  |     name: 'test_fn_start', | ||
|  |     test | ||
|  |   }); | ||
|  |   const timeout = test.timeout || (0, _state.getState)().testTimeout; | ||
|  |   (0, _utils.invariant)( | ||
|  |     test.fn, | ||
|  |     `Tests with no 'fn' should have 'mode' set to 'skipped'` | ||
|  |   ); | ||
|  | 
 | ||
|  |   if (test.errors.length) { | ||
|  |     // We don't run the test if there's already an error in before hooks.
 | ||
|  |     return Promise.resolve(); | ||
|  |   } | ||
|  | 
 | ||
|  |   return (0, _utils.callAsyncCircusFn)(test.fn, testContext, { | ||
|  |     isHook: false, | ||
|  |     timeout | ||
|  |   }) | ||
|  |     .then(() => | ||
|  |       (0, _state.dispatch)({ | ||
|  |         name: 'test_fn_success', | ||
|  |         test | ||
|  |       }) | ||
|  |     ) | ||
|  |     .catch(error => | ||
|  |       (0, _state.dispatch)({ | ||
|  |         error, | ||
|  |         name: 'test_fn_failure', | ||
|  |         test | ||
|  |       }) | ||
|  |     ); | ||
|  | }; | ||
|  | 
 | ||
|  | var _default = run; | ||
|  | exports.default = _default; |