248 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			248 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| Object.defineProperty(exports, '__esModule', {
 | |
|   value: true
 | |
| });
 | |
| exports.default = void 0;
 | |
| 
 | |
| var _types = require('./types');
 | |
| 
 | |
| var _utils = require('./utils');
 | |
| 
 | |
| var _globalErrorHandlers = require('./globalErrorHandlers');
 | |
| 
 | |
| var Symbol = global['jest-symbol-do-not-touch'] || global.Symbol;
 | |
| var Symbol = global['jest-symbol-do-not-touch'] || global.Symbol;
 | |
| var jestNow = global[Symbol.for('jest-native-now')] || global.Date.now;
 | |
| 
 | |
| const eventHandler = (event, state) => {
 | |
|   switch (event.name) {
 | |
|     case 'include_test_location_in_result': {
 | |
|       state.includeTestLocationInResult = true;
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     case 'hook_start': {
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     case 'start_describe_definition': {
 | |
|       const blockName = event.blockName,
 | |
|         mode = event.mode;
 | |
|       const currentDescribeBlock = state.currentDescribeBlock;
 | |
|       const describeBlock = (0, _utils.makeDescribe)(
 | |
|         blockName,
 | |
|         currentDescribeBlock,
 | |
|         mode
 | |
|       );
 | |
|       currentDescribeBlock.children.push(describeBlock);
 | |
|       state.currentDescribeBlock = describeBlock;
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     case 'finish_describe_definition': {
 | |
|       const currentDescribeBlock = state.currentDescribeBlock;
 | |
|       (0, _utils.invariant)(
 | |
|         currentDescribeBlock,
 | |
|         `currentDescribeBlock must be there`
 | |
|       );
 | |
| 
 | |
|       if (!(0, _utils.describeBlockHasTests)(currentDescribeBlock)) {
 | |
|         currentDescribeBlock.hooks.forEach(hook => {
 | |
|           hook.asyncError.message = `Invalid: ${
 | |
|             hook.type
 | |
|           }() may not be used in a describe block containing no tests.`;
 | |
|           state.unhandledErrors.push(hook.asyncError);
 | |
|         });
 | |
|       } // inherit mode from its parent describe but
 | |
|       // do not inherit "only" mode when there is already tests with "only" mode
 | |
| 
 | |
|       const shouldInheritMode = !(
 | |
|         currentDescribeBlock.mode === 'only' &&
 | |
|         currentDescribeBlock.tests.find(test => test.mode === 'only')
 | |
|       );
 | |
| 
 | |
|       if (shouldInheritMode) {
 | |
|         currentDescribeBlock.tests.forEach(test => {
 | |
|           if (!test.mode) {
 | |
|             test.mode = currentDescribeBlock.mode;
 | |
|           }
 | |
|         });
 | |
|       }
 | |
| 
 | |
|       if (
 | |
|         !state.hasFocusedTests &&
 | |
|         currentDescribeBlock.tests.some(test => test.mode === 'only')
 | |
|       ) {
 | |
|         state.hasFocusedTests = true;
 | |
|       }
 | |
| 
 | |
|       if (currentDescribeBlock.parent) {
 | |
|         state.currentDescribeBlock = currentDescribeBlock.parent;
 | |
|       }
 | |
| 
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     case 'add_hook': {
 | |
|       const currentDescribeBlock = state.currentDescribeBlock;
 | |
|       const asyncError = event.asyncError,
 | |
|         fn = event.fn,
 | |
|         type = event.hookType,
 | |
|         timeout = event.timeout;
 | |
|       const parent = currentDescribeBlock;
 | |
|       currentDescribeBlock.hooks.push({
 | |
|         asyncError,
 | |
|         fn,
 | |
|         parent,
 | |
|         timeout,
 | |
|         type
 | |
|       });
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     case 'add_test': {
 | |
|       const currentDescribeBlock = state.currentDescribeBlock;
 | |
|       const asyncError = event.asyncError,
 | |
|         fn = event.fn,
 | |
|         mode = event.mode,
 | |
|         name = event.testName,
 | |
|         timeout = event.timeout;
 | |
|       const test = (0, _utils.makeTest)(
 | |
|         fn,
 | |
|         mode,
 | |
|         name,
 | |
|         currentDescribeBlock,
 | |
|         timeout,
 | |
|         asyncError
 | |
|       );
 | |
| 
 | |
|       if (test.mode === 'only') {
 | |
|         state.hasFocusedTests = true;
 | |
|       }
 | |
| 
 | |
|       currentDescribeBlock.tests.push(test);
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     case 'hook_failure': {
 | |
|       const test = event.test,
 | |
|         describeBlock = event.describeBlock,
 | |
|         error = event.error,
 | |
|         hook = event.hook;
 | |
|       const asyncError = hook.asyncError,
 | |
|         type = hook.type;
 | |
| 
 | |
|       if (type === 'beforeAll') {
 | |
|         (0, _utils.invariant)(describeBlock, 'always present for `*All` hooks');
 | |
|         (0, _utils.addErrorToEachTestUnderDescribe)(
 | |
|           describeBlock,
 | |
|           error,
 | |
|           asyncError
 | |
|         );
 | |
|       } else if (type === 'afterAll') {
 | |
|         // Attaching `afterAll` errors to each test makes execution flow
 | |
|         // too complicated, so we'll consider them to be global.
 | |
|         state.unhandledErrors.push([error, asyncError]);
 | |
|       } else {
 | |
|         (0, _utils.invariant)(test, 'always present for `*Each` hooks');
 | |
|         test.errors.push([error, asyncError]);
 | |
|       }
 | |
| 
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     case 'test_skip': {
 | |
|       event.test.status = 'skip';
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     case 'test_todo': {
 | |
|       event.test.status = 'todo';
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     case 'test_done': {
 | |
|       event.test.duration = (0, _utils.getTestDuration)(event.test);
 | |
|       event.test.status = 'done';
 | |
|       state.currentlyRunningTest = null;
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     case 'test_start': {
 | |
|       state.currentlyRunningTest = event.test;
 | |
|       event.test.startedAt = jestNow();
 | |
|       event.test.invocations += 1;
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     case 'test_fn_failure': {
 | |
|       const error = event.error,
 | |
|         asyncError = event.test.asyncError;
 | |
|       event.test.errors.push([error, asyncError]);
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     case 'test_retry': {
 | |
|       event.test.errors = [];
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     case 'run_start': {
 | |
|       global[_types.TEST_TIMEOUT_SYMBOL] &&
 | |
|         (state.testTimeout = global[_types.TEST_TIMEOUT_SYMBOL]);
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     case 'run_finish': {
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     case 'setup': {
 | |
|       // Uncaught exception handlers should be defined on the parent process
 | |
|       // object. If defined on the VM's process object they just no op and let
 | |
|       // the parent process crash. It might make sense to return a `dispatch`
 | |
|       // function to the parent process and register handlers there instead, but
 | |
|       // i'm not sure if this is works. For now i just replicated whatever
 | |
|       // jasmine was doing -- dabramov
 | |
|       state.parentProcess = event.parentProcess;
 | |
|       (0, _utils.invariant)(state.parentProcess);
 | |
|       state.originalGlobalErrorHandlers = (0,
 | |
|       _globalErrorHandlers.injectGlobalErrorHandlers)(state.parentProcess);
 | |
| 
 | |
|       if (event.testNamePattern) {
 | |
|         state.testNamePattern = new RegExp(event.testNamePattern, 'i');
 | |
|       }
 | |
| 
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     case 'teardown': {
 | |
|       (0, _utils.invariant)(state.originalGlobalErrorHandlers);
 | |
|       (0, _utils.invariant)(state.parentProcess);
 | |
|       (0, _globalErrorHandlers.restoreGlobalErrorHandlers)(
 | |
|         state.parentProcess,
 | |
|         state.originalGlobalErrorHandlers
 | |
|       );
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     case 'error': {
 | |
|       // It's very likely for long-running async tests to throw errors. In this
 | |
|       // case we want to catch them and fail the current test. At the same time
 | |
|       // there's a possibility that one test sets a long timeout, that will
 | |
|       // eventually throw after this test finishes but during some other test
 | |
|       // execution, which will result in one test's error failing another test.
 | |
|       // In any way, it should be possible to track where the error was thrown
 | |
|       // from.
 | |
|       state.currentlyRunningTest
 | |
|         ? state.currentlyRunningTest.errors.push(event.error)
 | |
|         : state.unhandledErrors.push(event.error);
 | |
|       break;
 | |
|     }
 | |
|   }
 | |
| };
 | |
| 
 | |
| var _default = eventHandler;
 | |
| exports.default = _default;
 |