From 122c182bec0c95e136c15fed0e783c47f7523d86 Mon Sep 17 00:00:00 2001 From: Yaroslav Serhieiev Date: Thu, 5 Mar 2020 16:18:19 +0200 Subject: [PATCH 01/11] feat(circus): async handleTestEvent --- CHANGELOG.md | 1 + docs/Configuration.md | 4 +- e2e/__tests__/testEnvironmentCircus.test.ts | 75 ++++++++++++++++--- .../CircusAsyncHandleTestEventEnvironment.js | 39 ++++++++++ .../CircusHandleTestEventEnvironment.js | 10 ++- .../__tests__/circusHandleTestEvent.test.js | 5 +- .../testEnvironment.js | 12 +++ packages/jest-circus/README.md | 4 +- .../src/__mocks__/testEventHandler.ts | 5 +- packages/jest-circus/src/eventHandler.ts | 5 +- .../jest-circus/src/globalErrorHandlers.ts | 4 +- packages/jest-circus/src/index.ts | 10 +-- .../legacy-code-todo-rewrite/jestAdapter.ts | 2 +- .../jestAdapterInit.ts | 12 +-- packages/jest-circus/src/run.ts | 53 +++++++------ packages/jest-circus/src/state.ts | 8 +- packages/jest-environment/src/index.ts | 5 +- packages/jest-types/src/Circus.ts | 41 +++++----- 18 files changed, 218 insertions(+), 77 deletions(-) create mode 100644 e2e/test-environment-circus/CircusAsyncHandleTestEventEnvironment.js create mode 100644 e2e/test-environment-circus/testEnvironment.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 169c2270b0f7..8d85c3e600ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - `[jest-haste-map]` [**BREAKING**] Remove `mapper` option ([#9581](https://github.com/facebook/jest/pull/9581)) - `[*]` Support array of paths for `moduleNameMapper` aliases ([#9465](https://github.com/facebook/jest/pull/9465)) - `[jest-reporters]` Adds ability to pass options to the istanbul-reporter through `coverageReporters` ([#9572](https://github.com/facebook/jest/pull/9572)) +- `[jest-circus]` Enable writing async test event handlers ([#9392](https://github.com/facebook/jest/pull/9392)) ### Fixes diff --git a/docs/Configuration.md b/docs/Configuration.md index 5339a82b1c5a..acf7d57bb77a 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -900,7 +900,7 @@ test('use jsdom in this test file', () => { You can create your own module that will be used for setting up the test environment. The module must export a class with `setup`, `teardown` and `runScript` methods. You can also pass variables from this module to your test suites by assigning them to `this.global` object – this will make them available in your test suites as global variables. -The class may optionally expose a `handleTestEvent` method to bind to events fired by [`jest-circus`](https://github.com/facebook/jest/tree/master/packages/jest-circus). +The class may optionally expose an asynchronous `handleTestEvent` method to bind to events fired by [`jest-circus`](https://github.com/facebook/jest/tree/master/packages/jest-circus). Normally, `jest-circus` test runner would pause until a promise returned from `handleTestEvent` gets fulfilled, **except for the next events**: `start_describe_definition`, `finish_describe_definition`, `add_hook`, `add_test` or `error` (for the up-to-date list you can look at [SyncEvent type in the types definitions](https://github.com/facebook/jest/tree/master/packages/jest-types/src/Circus.ts)). That is caused by backward compatibility reasons and `process.on('unhandledRejection', callback)` signature, but that usually should not be a problem for most of the use cases. Any docblock pragmas in test files will be passed to the environment constructor and can be used for per-test configuration. If the pragma does not have a value, it will be present in the object with it's value set to an empty string. If the pragma is not present, it will not be present in the object. @@ -940,7 +940,7 @@ class CustomEnvironment extends NodeEnvironment { return super.runScript(script); } - handleTestEvent(event, state) { + async handleTestEvent(event, state) { if (event.name === 'test_start') { // ... } diff --git a/e2e/__tests__/testEnvironmentCircus.test.ts b/e2e/__tests__/testEnvironmentCircus.test.ts index 12ff9e833ab8..73fa49d4c830 100644 --- a/e2e/__tests__/testEnvironmentCircus.test.ts +++ b/e2e/__tests__/testEnvironmentCircus.test.ts @@ -11,32 +11,85 @@ import runJest from '../runJest'; skipSuiteOnJasmine(); it('calls testEnvironment handleTestEvent', () => { + process.env.ASYNC_HANDLE_TEST_EVENT = ''; + const result = runJest('test-environment-circus'); - expect(result.failed).toEqual(false); - expect(result.stdout.split('\n')).toMatchInlineSnapshot(` + expect(result.failed).toEqual(true); + + const lines = result.stdout.split('\n'); + expect(lines).toMatchInlineSnapshot(` Array [ "setup", "add_hook", "add_hook", + "add_hook", + "add_test", + "add_test", + "run_start", + "run_describe_start", + "test_start: test name here", + "hook_start: beforeEach", + "hook_success: beforeEach", + "hook_start: beforeEach", + "hook_success: beforeEach", + "test_fn_start: test name here", + "test_fn_success: test name here", + "hook_start: afterEach", + "hook_success: afterEach", + "test_done: test name here", + "test_start: second test name here", + "hook_start: beforeEach", + "hook_success: beforeEach", + "hook_start: beforeEach", + "hook_success: beforeEach", + "test_fn_start: second test name here", + "test_fn_failure: second test name here", + "hook_start: afterEach", + "hook_success: afterEach", + "test_done: second test name here", + "run_describe_finish", + "run_finish", + "teardown", + ] + `); +}); + +it('calls testEnvironment handleTestEvent (async)', () => { + process.env.ASYNC_HANDLE_TEST_EVENT = '1'; + + const result = runJest('test-environment-circus'); + expect(result.failed).toEqual(true); + + const lines = result.stdout.split('\n'); + expect(lines).toMatchInlineSnapshot(` + Array [ + "setup", + "add_hook", + "add_hook", + "add_hook", "add_test", "add_test", "run_start", "run_describe_start", "test_start: test name here", - "hook_start", - "hook_success: test name here", - "hook_start", - "hook_success: test name here", + "hook_start: beforeEach", + "hook_success: beforeEach", + "hook_start: beforeEach", + "hook_success: beforeEach", "test_fn_start: test name here", "test_fn_success: test name here", + "hook_start: afterEach", + "hook_success: afterEach", "test_done: test name here", "test_start: second test name here", - "hook_start", - "hook_success: second test name here", - "hook_start", - "hook_success: second test name here", + "hook_start: beforeEach", + "hook_success: beforeEach", + "hook_start: beforeEach", + "hook_success: beforeEach", "test_fn_start: second test name here", - "test_fn_success: second test name here", + "test_fn_failure: second test name here", + "hook_start: afterEach", + "hook_success: afterEach", "test_done: second test name here", "run_describe_finish", "run_finish", diff --git a/e2e/test-environment-circus/CircusAsyncHandleTestEventEnvironment.js b/e2e/test-environment-circus/CircusAsyncHandleTestEventEnvironment.js new file mode 100644 index 000000000000..cd703c5d5426 --- /dev/null +++ b/e2e/test-environment-circus/CircusAsyncHandleTestEventEnvironment.js @@ -0,0 +1,39 @@ +/** + * 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. + */ + +'use strict'; + +const BaseTestEnvironment = require('./CircusHandleTestEventEnvironment'); + +const SYNC_EVENTS = [ + 'start_describe_definition', + 'finish_describe_definition', + 'add_hook', + 'add_test', + 'error', +]; + +const isAsyncEvent = e => SYNC_EVENTS.indexOf(e.name) === -1; +const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); + +class TestEnvironment extends BaseTestEnvironment { + async handleTestEvent(event) { + this.pendingEvents = this.pendingEvents || new Set(); + if (this.pendingEvents.size > 0) { + console.log('async handleTestEvent is not respected'); + } + + if (isAsyncEvent(event)) { + this.pendingEvents.add(event); + await sleep(0).then(() => this.pendingEvents.delete(event)); + } + + super.handleTestEvent(event); + } +} + +module.exports = TestEnvironment; diff --git a/e2e/test-environment-circus/CircusHandleTestEventEnvironment.js b/e2e/test-environment-circus/CircusHandleTestEventEnvironment.js index 6bd6f2191adf..13910cb33238 100644 --- a/e2e/test-environment-circus/CircusHandleTestEventEnvironment.js +++ b/e2e/test-environment-circus/CircusHandleTestEventEnvironment.js @@ -10,8 +10,14 @@ const JSDOMEnvironment = require('jest-environment-jsdom'); class TestEnvironment extends JSDOMEnvironment { - handleTestEvent(event) { - console.log(event.name + (event.test ? ': ' + event.test.name : '')); + async handleTestEvent(event) { + if (event.hook) { + console.log(event.name + ': ' + event.hook.type); + } else if (event.test) { + console.log(event.name + ': ' + event.test.name); + } else { + console.log(event.name); + } } } diff --git a/e2e/test-environment-circus/__tests__/circusHandleTestEvent.test.js b/e2e/test-environment-circus/__tests__/circusHandleTestEvent.test.js index 0ac805527147..c0d4d7323399 100644 --- a/e2e/test-environment-circus/__tests__/circusHandleTestEvent.test.js +++ b/e2e/test-environment-circus/__tests__/circusHandleTestEvent.test.js @@ -4,15 +4,16 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @jest-environment ./CircusHandleTestEventEnvironment.js + * @jest-environment ./testEnvironment.js */ beforeEach(() => {}); +afterEach(() => {}); test('test name here', () => { expect(true).toBe(true); }); test('second test name here', () => { - expect(true).toBe(true); + expect(true).toBe(false); }); diff --git a/e2e/test-environment-circus/testEnvironment.js b/e2e/test-environment-circus/testEnvironment.js new file mode 100644 index 000000000000..62a130ff7642 --- /dev/null +++ b/e2e/test-environment-circus/testEnvironment.js @@ -0,0 +1,12 @@ +/** + * 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. + */ + +'use strict'; + +module.exports = process.env.ASYNC_HANDLE_TEST_EVENT + ? require('./CircusAsyncHandleTestEventEnvironment') + : require('./CircusHandleTestEventEnvironment'); diff --git a/packages/jest-circus/README.md b/packages/jest-circus/README.md index 142c17ab6437..45f7218d64e9 100644 --- a/packages/jest-circus/README.md +++ b/packages/jest-circus/README.md @@ -18,7 +18,7 @@ import {Event, State} from 'jest-circus'; class MyCustomEnvironment extends NodeEnvironment { //... - handleTestEvent(event: Event, state: State) { + async handleTestEvent(event: Event, state: State) { if (event.name === 'test_start') { // ... } @@ -28,6 +28,8 @@ class MyCustomEnvironment extends NodeEnvironment { Mutating event or state data is currently unsupported and may cause unexpected behavior or break in a future release without warning. New events, event data, and/or state data will not be considered a breaking change and may be added in any minor release. +Note, that `jest-circus` test runner would pause until a promise returned from `handleTestEvent` gets fulfilled. **However, there are a few events that do not conform to this rule, namely**: `start_describe_definition`, `finish_describe_definition`, `add_hook`, `add_test` or `error` (for the up-to-date list you can look at [SyncEvent type in the types definitions](https://github.com/facebook/jest/tree/master/packages/jest-types/src/Circus.ts)). That is caused by backward compatibility reasons and `process.on('unhandledRejection', callback)` signature, but that usually should not be a problem for most of the use cases. + ## Installation Install `jest-circus` using yarn: diff --git a/packages/jest-circus/src/__mocks__/testEventHandler.ts b/packages/jest-circus/src/__mocks__/testEventHandler.ts index 23dfe2bed22f..ad948f8d6bb5 100644 --- a/packages/jest-circus/src/__mocks__/testEventHandler.ts +++ b/packages/jest-circus/src/__mocks__/testEventHandler.ts @@ -7,7 +7,10 @@ import {Circus} from '@jest/types'; -const testEventHandler: Circus.EventHandler = (event, state) => { +const testEventHandler: Circus.EventHandler = ( + event: Circus.Event, + state: Circus.State, +) => { switch (event.name) { case 'start_describe_definition': case 'finish_describe_definition': { diff --git a/packages/jest-circus/src/eventHandler.ts b/packages/jest-circus/src/eventHandler.ts index 7b059983dfb9..b947bc7d9735 100644 --- a/packages/jest-circus/src/eventHandler.ts +++ b/packages/jest-circus/src/eventHandler.ts @@ -21,7 +21,10 @@ import { restoreGlobalErrorHandlers, } from './globalErrorHandlers'; -const eventHandler: Circus.EventHandler = (event, state): void => { +const eventHandler: Circus.EventHandler = ( + event: Circus.Event, + state: Circus.State, +): void => { switch (event.name) { case 'include_test_location_in_result': { state.includeTestLocationInResult = true; diff --git a/packages/jest-circus/src/globalErrorHandlers.ts b/packages/jest-circus/src/globalErrorHandlers.ts index c3e7b7228f5e..3780eaa34e27 100644 --- a/packages/jest-circus/src/globalErrorHandlers.ts +++ b/packages/jest-circus/src/globalErrorHandlers.ts @@ -6,11 +6,11 @@ */ import {Circus} from '@jest/types'; -import {dispatch} from './state'; +import {dispatchSync} from './state'; const uncaught: NodeJS.UncaughtExceptionListener & NodeJS.UnhandledRejectionListener = (error: unknown) => { - dispatch({error, name: 'error'}); + dispatchSync({error, name: 'error'}); }; export const injectGlobalErrorHandlers = ( diff --git a/packages/jest-circus/src/index.ts b/packages/jest-circus/src/index.ts index 10056acc358b..6c25edd010d0 100644 --- a/packages/jest-circus/src/index.ts +++ b/packages/jest-circus/src/index.ts @@ -10,7 +10,7 @@ import {bind as bindEach} from 'jest-each'; import {formatExecError} from 'jest-message-util'; import {ErrorWithStack, isPromise} from 'jest-util'; import {Circus, Global} from '@jest/types'; -import {dispatch} from './state'; +import {dispatchSync} from './state'; type THook = (fn: Circus.HookFn, timeout?: number) => void; type DescribeFn = ( @@ -52,7 +52,7 @@ const _dispatchDescribe = ( asyncError.message = `Invalid second argument, ${blockFn}. It must be a callback function.`; throw asyncError; } - dispatch({ + dispatchSync({ asyncError, blockName, mode, @@ -91,7 +91,7 @@ const _dispatchDescribe = ( ); } - dispatch({blockName, mode, name: 'finish_describe_definition'}); + dispatchSync({blockName, mode, name: 'finish_describe_definition'}); }; const _addHook = ( @@ -109,7 +109,7 @@ const _addHook = ( throw asyncError; } - dispatch({asyncError, fn, hookType, name: 'add_hook', timeout}); + dispatchSync({asyncError, fn, hookType, name: 'add_hook', timeout}); }; // Hooks have to pass themselves to the HOF in order for us to trim stack traces. @@ -179,7 +179,7 @@ const test: Global.It = (() => { throw asyncError; } - return dispatch({ + return dispatchSync({ asyncError, fn, mode, diff --git a/packages/jest-circus/src/legacy-code-todo-rewrite/jestAdapter.ts b/packages/jest-circus/src/legacy-code-todo-rewrite/jestAdapter.ts index 814bb2976bc8..8864b9f28e72 100644 --- a/packages/jest-circus/src/legacy-code-todo-rewrite/jestAdapter.ts +++ b/packages/jest-circus/src/legacy-code-todo-rewrite/jestAdapter.ts @@ -38,7 +38,7 @@ const jestAdapter = async ( config.prettierPath ? require(config.prettierPath) : null; const getBabelTraverse = () => require('@babel/traverse').default; - const {globals, snapshotState} = initialize({ + const {globals, snapshotState} = await initialize({ config, environment, getBabelTraverse, diff --git a/packages/jest-circus/src/legacy-code-todo-rewrite/jestAdapterInit.ts b/packages/jest-circus/src/legacy-code-todo-rewrite/jestAdapterInit.ts index bceca84537e8..3d97320f4b3c 100644 --- a/packages/jest-circus/src/legacy-code-todo-rewrite/jestAdapterInit.ts +++ b/packages/jest-circus/src/legacy-code-todo-rewrite/jestAdapterInit.ts @@ -34,9 +34,8 @@ import globals from '..'; type Process = NodeJS.Process; -// TODO: hard to type // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types -export const initialize = ({ +export const initialize = async ({ config, environment, getPrettier, @@ -107,14 +106,14 @@ export const initialize = ({ addEventHandler(environment.handleTestEvent.bind(environment)); } - dispatch({ + await dispatch({ name: 'setup', parentProcess, testNamePattern: globalConfig.testNamePattern, }); if (config.testLocationInResults) { - dispatch({ + await dispatch({ name: 'include_test_location_in_result', }); } @@ -220,7 +219,8 @@ export const runAndTransformResultsToJestFormat = async ({ .join('\n'); } - dispatch({name: 'teardown'}); + await dispatch({name: 'teardown'}); + return { ...createEmptyTestResult(), console: undefined, @@ -248,7 +248,7 @@ const handleSnapshotStateAfterRetry = (snapshotState: SnapshotStateType) => ( } }; -const eventHandler = (event: Circus.Event) => { +const eventHandler = async (event: Circus.Event) => { switch (event.name) { case 'test_start': { setState({currentTestName: getTestID(event.test)}); diff --git a/packages/jest-circus/src/run.ts b/packages/jest-circus/src/run.ts index b07fa89ddaf2..082fec9c4712 100644 --- a/packages/jest-circus/src/run.ts +++ b/packages/jest-circus/src/run.ts @@ -20,9 +20,9 @@ import { const run = async (): Promise => { const {rootDescribeBlock} = getState(); - dispatch({name: 'run_start'}); + await dispatch({name: 'run_start'}); await _runTestsForDescribeBlock(rootDescribeBlock); - dispatch({name: 'run_finish'}); + await dispatch({name: 'run_finish'}); return makeRunResult( getState().rootDescribeBlock, getState().unhandledErrors, @@ -32,7 +32,7 @@ const run = async (): Promise => { const _runTestsForDescribeBlock = async ( describeBlock: Circus.DescribeBlock, ) => { - dispatch({describeBlock, name: 'run_describe_start'}); + await dispatch({describeBlock, name: 'run_describe_start'}); const {beforeAll, afterAll} = getAllHooksForDescribe(describeBlock); for (const hook of beforeAll) { @@ -62,7 +62,7 @@ const _runTestsForDescribeBlock = async ( while (numRetriesAvailable > 0 && test.errors.length > 0) { // Clear errors so retries occur - dispatch({name: 'test_retry', test}); + await dispatch({name: 'test_retry', test}); await _runTest(test); numRetriesAvailable--; @@ -76,11 +76,12 @@ const _runTestsForDescribeBlock = async ( for (const hook of afterAll) { await _callCircusHook({describeBlock, hook}); } - dispatch({describeBlock, name: 'run_describe_finish'}); + + await dispatch({describeBlock, name: 'run_describe_finish'}); }; const _runTest = async (test: Circus.TestEntry): Promise => { - dispatch({name: 'test_start', test}); + await dispatch({name: 'test_start', test}); const testContext = Object.create(null); const {hasFocusedTests, testNamePattern} = getState(); @@ -90,12 +91,12 @@ const _runTest = async (test: Circus.TestEntry): Promise => { (testNamePattern && !testNamePattern.test(getTestID(test))); if (isSkipped) { - dispatch({name: 'test_skip', test}); + await dispatch({name: 'test_skip', test}); return; } if (test.mode === 'todo') { - dispatch({name: 'test_todo', test}); + await dispatch({name: 'test_todo', test}); return; } @@ -119,10 +120,10 @@ const _runTest = async (test: Circus.TestEntry): Promise => { // `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. - dispatch({name: 'test_done', test}); + await dispatch({name: 'test_done', test}); }; -const _callCircusHook = ({ +const _callCircusHook = async ({ hook, test, describeBlock, @@ -132,32 +133,36 @@ const _callCircusHook = ({ describeBlock?: Circus.DescribeBlock; test?: Circus.TestEntry; testContext?: Circus.TestContext; -}): Promise => { - dispatch({hook, name: 'hook_start'}); +}): Promise => { + await dispatch({hook, name: 'hook_start'}); const timeout = hook.timeout || getState().testTimeout; - return callAsyncCircusFn(hook.fn, testContext, {isHook: true, timeout}) - .then(() => dispatch({describeBlock, hook, name: 'hook_success', test})) - .catch(error => - dispatch({describeBlock, error, hook, name: 'hook_failure', test}), - ); + + try { + await callAsyncCircusFn(hook.fn, testContext, {isHook: true, timeout}); + await dispatch({describeBlock, hook, name: 'hook_success', test}); + } catch (error) { + await dispatch({describeBlock, error, hook, name: 'hook_failure', test}); + } }; -const _callCircusTest = ( +const _callCircusTest = async ( test: Circus.TestEntry, testContext: Circus.TestContext, ): Promise => { - dispatch({name: 'test_fn_start', test}); + await dispatch({name: 'test_fn_start', test}); const timeout = test.timeout || getState().testTimeout; 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; // We don't run the test if there's already an error in before hooks. } - return callAsyncCircusFn(test.fn, testContext, {isHook: false, timeout}) - .then(() => dispatch({name: 'test_fn_success', test})) - .catch(error => dispatch({error, name: 'test_fn_failure', test})); + try { + await callAsyncCircusFn(test.fn, testContext, {isHook: false, timeout}); + await dispatch({name: 'test_fn_success', test}); + } catch (error) { + await dispatch({error, name: 'test_fn_failure', test}); + } }; export default run; diff --git a/packages/jest-circus/src/state.ts b/packages/jest-circus/src/state.ts index d42928e90bfa..f6694a138a59 100644 --- a/packages/jest-circus/src/state.ts +++ b/packages/jest-circus/src/state.ts @@ -39,7 +39,13 @@ export const getState = (): Circus.State => global[STATE_SYM]; export const setState = (state: Circus.State): Circus.State => (global[STATE_SYM] = state); -export const dispatch = (event: Circus.Event): void => { +export const dispatch = async (event: Circus.AsyncEvent): Promise => { + for (const handler of eventHandlers) { + await handler(event, getState()); + } +}; + +export const dispatchSync = (event: Circus.SyncEvent): void => { for (const handler of eventHandlers) { handler(event, getState()); } diff --git a/packages/jest-environment/src/index.ts b/packages/jest-environment/src/index.ts index 6f5c311189d0..62141ae579ff 100644 --- a/packages/jest-environment/src/index.ts +++ b/packages/jest-environment/src/index.ts @@ -50,7 +50,10 @@ export declare class JestEnvironment { getVmContext?(): Context | null; setup(): Promise; teardown(): Promise; - handleTestEvent?(event: Circus.Event, state: Circus.State): void; + handleTestEvent?( + event: Circus.Event, + state: Circus.State, + ): void | Promise; } export type Module = NodeModule; diff --git a/packages/jest-types/src/Circus.ts b/packages/jest-types/src/Circus.ts index 6ae1bddd4baa..4fae1e569681 100644 --- a/packages/jest-types/src/Circus.ts +++ b/packages/jest-types/src/Circus.ts @@ -31,12 +31,14 @@ export type Hook = { timeout: number | undefined | null; }; -export type EventHandler = (event: Event, state: State) => void; +export interface EventHandler { + (event: AsyncEvent, state: State): void | Promise; + (event: SyncEvent, state: State): void; +} -export type Event = - | { - name: 'include_test_location_in_result'; - } +export type Event = SyncEvent | AsyncEvent; + +export type SyncEvent = | { asyncError: Error; mode: BlockMode; @@ -63,6 +65,23 @@ export type Event = mode?: TestMode; timeout: number | undefined; } + | { + // Any unhandled error that happened outside of test/hooks (unless it is + // an `afterAll` hook) + name: 'error'; + error: Exception; + }; + +export type AsyncEvent = + | { + // first action to dispatch. Good time to initialize all settings + name: 'setup'; + testNamePattern?: string; + parentProcess: Process; + } + | { + name: 'include_test_location_in_result'; + } | { name: 'hook_start'; hook: Hook; @@ -133,18 +152,6 @@ export type Event = | { name: 'run_finish'; } - | { - // Any unhandled error that happened outside of test/hooks (unless it is - // an `afterAll` hook) - name: 'error'; - error: Exception; - } - | { - // first action to dispatch. Good time to initialize all settings - name: 'setup'; - testNamePattern?: string; - parentProcess: Process; - } | { // Action dispatched after everything is finished and we're about to wrap // things up and return test results to the parent process (caller). From c855a8114ba11ca6206606d0a0d4e4e957d97be8 Mon Sep 17 00:00:00 2001 From: Yaroslav Serhieiev Date: Fri, 3 Apr 2020 14:44:11 +0300 Subject: [PATCH 02/11] Update e2e/test-environment-circus/CircusAsyncHandleTestEventEnvironment.js Co-Authored-By: Simen Bekkhus --- .../CircusAsyncHandleTestEventEnvironment.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/test-environment-circus/CircusAsyncHandleTestEventEnvironment.js b/e2e/test-environment-circus/CircusAsyncHandleTestEventEnvironment.js index cd703c5d5426..2afd744589ef 100644 --- a/e2e/test-environment-circus/CircusAsyncHandleTestEventEnvironment.js +++ b/e2e/test-environment-circus/CircusAsyncHandleTestEventEnvironment.js @@ -32,7 +32,7 @@ class TestEnvironment extends BaseTestEnvironment { await sleep(0).then(() => this.pendingEvents.delete(event)); } - super.handleTestEvent(event); + await super.handleTestEvent(event); } } From 2900542e4bc9224c337756a55061cf873262c553 Mon Sep 17 00:00:00 2001 From: Yaroslav Serhieiev Date: Fri, 3 Apr 2020 14:44:43 +0300 Subject: [PATCH 03/11] Update e2e/test-environment-circus/CircusAsyncHandleTestEventEnvironment.js Co-Authored-By: Simen Bekkhus --- .../CircusAsyncHandleTestEventEnvironment.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/e2e/test-environment-circus/CircusAsyncHandleTestEventEnvironment.js b/e2e/test-environment-circus/CircusAsyncHandleTestEventEnvironment.js index 2afd744589ef..7172c10fb41c 100644 --- a/e2e/test-environment-circus/CircusAsyncHandleTestEventEnvironment.js +++ b/e2e/test-environment-circus/CircusAsyncHandleTestEventEnvironment.js @@ -29,7 +29,8 @@ class TestEnvironment extends BaseTestEnvironment { if (isAsyncEvent(event)) { this.pendingEvents.add(event); - await sleep(0).then(() => this.pendingEvents.delete(event)); + await sleep(0); + await this.pendingEvents.delete(event); } await super.handleTestEvent(event); From 7d1d6ee6b22b3897a161091e68325dadcb878dda Mon Sep 17 00:00:00 2001 From: Yaroslav Serhieiev Date: Fri, 3 Apr 2020 14:45:23 +0300 Subject: [PATCH 04/11] Update CircusAsyncHandleTestEventEnvironment.js --- .../CircusAsyncHandleTestEventEnvironment.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/test-environment-circus/CircusAsyncHandleTestEventEnvironment.js b/e2e/test-environment-circus/CircusAsyncHandleTestEventEnvironment.js index 7172c10fb41c..00498e2e5c47 100644 --- a/e2e/test-environment-circus/CircusAsyncHandleTestEventEnvironment.js +++ b/e2e/test-environment-circus/CircusAsyncHandleTestEventEnvironment.js @@ -30,7 +30,7 @@ class TestEnvironment extends BaseTestEnvironment { if (isAsyncEvent(event)) { this.pendingEvents.add(event); await sleep(0); - await this.pendingEvents.delete(event); + this.pendingEvents.delete(event); } await super.handleTestEvent(event); From 46c75893cfd9854e480149703e55e85f25df7a19 Mon Sep 17 00:00:00 2001 From: Yaroslav Serhieiev Date: Sat, 4 Apr 2020 13:35:10 +0300 Subject: [PATCH 05/11] Update testEventHandler.ts --- packages/jest-circus/src/__mocks__/testEventHandler.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/jest-circus/src/__mocks__/testEventHandler.ts b/packages/jest-circus/src/__mocks__/testEventHandler.ts index ad948f8d6bb5..23dfe2bed22f 100644 --- a/packages/jest-circus/src/__mocks__/testEventHandler.ts +++ b/packages/jest-circus/src/__mocks__/testEventHandler.ts @@ -7,10 +7,7 @@ import {Circus} from '@jest/types'; -const testEventHandler: Circus.EventHandler = ( - event: Circus.Event, - state: Circus.State, -) => { +const testEventHandler: Circus.EventHandler = (event, state) => { switch (event.name) { case 'start_describe_definition': case 'finish_describe_definition': { From 49f2b38d70dab2ab7c305179944145057428065b Mon Sep 17 00:00:00 2001 From: Yaroslav Serhieiev Date: Sat, 4 Apr 2020 17:07:37 +0300 Subject: [PATCH 06/11] code: restore TODO comment --- .../jest-circus/src/legacy-code-todo-rewrite/jestAdapterInit.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/jest-circus/src/legacy-code-todo-rewrite/jestAdapterInit.ts b/packages/jest-circus/src/legacy-code-todo-rewrite/jestAdapterInit.ts index 1c893d67d0f9..eb0595455c4e 100644 --- a/packages/jest-circus/src/legacy-code-todo-rewrite/jestAdapterInit.ts +++ b/packages/jest-circus/src/legacy-code-todo-rewrite/jestAdapterInit.ts @@ -34,6 +34,7 @@ import globals from '..'; type Process = NodeJS.Process; +// TODO: hard to type // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types export const initialize = async ({ config, From 032fe7216f64ff6777436fd0dae4248ee6999534 Mon Sep 17 00:00:00 2001 From: Yaroslav Serhieiev Date: Sat, 4 Apr 2020 17:08:08 +0300 Subject: [PATCH 07/11] docs: fix CHANGELOG --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b0dc524ee3c..063741f7dbca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ### Features +- `[jest-circus]` Enable writing async test event handlers ([#9392](https://github.com/facebook/jest/pull/9392)) + ### Fixes ### Chore & Maintenance @@ -49,7 +51,6 @@ - `[jest-reporters]` Adds ability to pass options to the istanbul-reporter through `coverageReporters` ([#9572](https://github.com/facebook/jest/pull/9572)) - `[jest-runtime]` Require stack when a module cannot be resolved ([#9681](https://github.com/facebook/jest/pull/9681)) - `[jest-transform]` `writeCacheFile` no longer calls `fsync` ([#9695](https://github.com/facebook/jest/pull/9695)) -- `[jest-circus]` Enable writing async test event handlers ([#9392](https://github.com/facebook/jest/pull/9392)) ### Fixes From afb77c2a0294fef0d351a40ddb73ff353c5ad481 Mon Sep 17 00:00:00 2001 From: Yaroslav Serhieiev Date: Sat, 4 Apr 2020 17:33:13 +0300 Subject: [PATCH 08/11] test(circus): split handleTestEvent suite into two --- e2e/__tests__/testEnvironmentCircus.test.ts | 75 +++---------------- .../testEnvironmentCircusAsync.test.ts | 58 ++++++++++++++ .../CircusAsyncHandleTestEventEnvironment.js | 38 ++++++++++ .../__tests__/circusHandleTestEvent.test.js | 19 +++++ .../package.json | 5 ++ .../CircusAsyncHandleTestEventEnvironment.js | 40 ---------- .../CircusHandleTestEventEnvironment.js | 10 +-- .../__tests__/circusHandleTestEvent.test.js | 5 +- .../testEnvironment.js | 12 --- 9 files changed, 135 insertions(+), 127 deletions(-) create mode 100644 e2e/__tests__/testEnvironmentCircusAsync.test.ts create mode 100644 e2e/test-environment-circus-async/CircusAsyncHandleTestEventEnvironment.js create mode 100644 e2e/test-environment-circus-async/__tests__/circusHandleTestEvent.test.js create mode 100644 e2e/test-environment-circus-async/package.json delete mode 100644 e2e/test-environment-circus/CircusAsyncHandleTestEventEnvironment.js delete mode 100644 e2e/test-environment-circus/testEnvironment.js diff --git a/e2e/__tests__/testEnvironmentCircus.test.ts b/e2e/__tests__/testEnvironmentCircus.test.ts index 73fa49d4c830..12ff9e833ab8 100644 --- a/e2e/__tests__/testEnvironmentCircus.test.ts +++ b/e2e/__tests__/testEnvironmentCircus.test.ts @@ -11,85 +11,32 @@ import runJest from '../runJest'; skipSuiteOnJasmine(); it('calls testEnvironment handleTestEvent', () => { - process.env.ASYNC_HANDLE_TEST_EVENT = ''; - const result = runJest('test-environment-circus'); - expect(result.failed).toEqual(true); - - const lines = result.stdout.split('\n'); - expect(lines).toMatchInlineSnapshot(` + expect(result.failed).toEqual(false); + expect(result.stdout.split('\n')).toMatchInlineSnapshot(` Array [ "setup", "add_hook", "add_hook", - "add_hook", - "add_test", - "add_test", - "run_start", - "run_describe_start", - "test_start: test name here", - "hook_start: beforeEach", - "hook_success: beforeEach", - "hook_start: beforeEach", - "hook_success: beforeEach", - "test_fn_start: test name here", - "test_fn_success: test name here", - "hook_start: afterEach", - "hook_success: afterEach", - "test_done: test name here", - "test_start: second test name here", - "hook_start: beforeEach", - "hook_success: beforeEach", - "hook_start: beforeEach", - "hook_success: beforeEach", - "test_fn_start: second test name here", - "test_fn_failure: second test name here", - "hook_start: afterEach", - "hook_success: afterEach", - "test_done: second test name here", - "run_describe_finish", - "run_finish", - "teardown", - ] - `); -}); - -it('calls testEnvironment handleTestEvent (async)', () => { - process.env.ASYNC_HANDLE_TEST_EVENT = '1'; - - const result = runJest('test-environment-circus'); - expect(result.failed).toEqual(true); - - const lines = result.stdout.split('\n'); - expect(lines).toMatchInlineSnapshot(` - Array [ - "setup", - "add_hook", - "add_hook", - "add_hook", "add_test", "add_test", "run_start", "run_describe_start", "test_start: test name here", - "hook_start: beforeEach", - "hook_success: beforeEach", - "hook_start: beforeEach", - "hook_success: beforeEach", + "hook_start", + "hook_success: test name here", + "hook_start", + "hook_success: test name here", "test_fn_start: test name here", "test_fn_success: test name here", - "hook_start: afterEach", - "hook_success: afterEach", "test_done: test name here", "test_start: second test name here", - "hook_start: beforeEach", - "hook_success: beforeEach", - "hook_start: beforeEach", - "hook_success: beforeEach", + "hook_start", + "hook_success: second test name here", + "hook_start", + "hook_success: second test name here", "test_fn_start: second test name here", - "test_fn_failure: second test name here", - "hook_start: afterEach", - "hook_success: afterEach", + "test_fn_success: second test name here", "test_done: second test name here", "run_describe_finish", "run_finish", diff --git a/e2e/__tests__/testEnvironmentCircusAsync.test.ts b/e2e/__tests__/testEnvironmentCircusAsync.test.ts new file mode 100644 index 000000000000..f0e22f8403e3 --- /dev/null +++ b/e2e/__tests__/testEnvironmentCircusAsync.test.ts @@ -0,0 +1,58 @@ +/** + * 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. + */ + +import {skipSuiteOnJasmine} from '@jest/test-utils'; +import runJest from '../runJest'; + +skipSuiteOnJasmine(); + +it('calls asynchronous handleTestEvent in testEnvironment', () => { + const result = runJest('test-environment-circus-async'); + expect(result.failed).toEqual(true); + + const lines = result.stdout.split('\n'); + expect(lines).toMatchInlineSnapshot(` + Array [ + "setup", + "warning: add_hook is a sync event", + "warning: add_hook is a sync event", + "warning: add_hook is a sync event", + "warning: add_test is a sync event", + "warning: add_test is a sync event", + "add_hook", + "add_hook", + "add_hook", + "add_test", + "add_test", + "run_start", + "run_describe_start", + "test_start: test name here", + "hook_start: beforeEach", + "hook_success: beforeEach", + "hook_start: beforeEach", + "hook_success: beforeEach", + "test_fn_start: test name here", + "test_fn_success: test name here", + "hook_start: afterEach", + "hook_success: afterEach", + "test_done: test name here", + "test_start: second test name here", + "hook_start: beforeEach", + "hook_success: beforeEach", + "hook_start: beforeEach", + "hook_success: beforeEach", + "test_fn_start: second test name here", + "test_fn_failure: second test name here", + "hook_start: afterEach", + "hook_success: afterEach", + "test_done: second test name here", + "run_describe_finish", + "run_finish", + "teardown", + ] + `); +}); diff --git a/e2e/test-environment-circus-async/CircusAsyncHandleTestEventEnvironment.js b/e2e/test-environment-circus-async/CircusAsyncHandleTestEventEnvironment.js new file mode 100644 index 000000000000..52a121cdab4c --- /dev/null +++ b/e2e/test-environment-circus-async/CircusAsyncHandleTestEventEnvironment.js @@ -0,0 +1,38 @@ +/** + * 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. + */ + +'use strict'; + +const JSDOMEnvironment = require('jest-environment-jsdom'); + +const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); + +class TestEnvironment extends JSDOMEnvironment { + async handleTestEvent(event) { + await this.assertRunnerWaitsForHandleTestEvent(event); + + if (event.hook) { + console.log(event.name + ': ' + event.hook.type); + } else if (event.test) { + console.log(event.name + ': ' + event.test.name); + } else { + console.log(event.name); + } + } + + async assertRunnerWaitsForHandleTestEvent(event) { + if (this.pendingEvent) { + console.log(`warning: ${this.pendingEvent.name} is a sync event`); + } + + this.pendingEvent = event; + await sleep(0); + this.pendingEvent = null; + } +} + +module.exports = TestEnvironment; diff --git a/e2e/test-environment-circus-async/__tests__/circusHandleTestEvent.test.js b/e2e/test-environment-circus-async/__tests__/circusHandleTestEvent.test.js new file mode 100644 index 000000000000..41771931a809 --- /dev/null +++ b/e2e/test-environment-circus-async/__tests__/circusHandleTestEvent.test.js @@ -0,0 +1,19 @@ +/** + * 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. + * + * @jest-environment ./CircusAsyncHandleTestEventEnvironment.js + */ + +beforeEach(() => {}); +afterEach(() => {}); + +test('test name here', () => { + expect(true).toBe(true); +}); + +test('second test name here', () => { + expect(true).toBe(false); +}); diff --git a/e2e/test-environment-circus-async/package.json b/e2e/test-environment-circus-async/package.json new file mode 100644 index 000000000000..148788b25446 --- /dev/null +++ b/e2e/test-environment-circus-async/package.json @@ -0,0 +1,5 @@ +{ + "jest": { + "testEnvironment": "node" + } +} diff --git a/e2e/test-environment-circus/CircusAsyncHandleTestEventEnvironment.js b/e2e/test-environment-circus/CircusAsyncHandleTestEventEnvironment.js deleted file mode 100644 index 00498e2e5c47..000000000000 --- a/e2e/test-environment-circus/CircusAsyncHandleTestEventEnvironment.js +++ /dev/null @@ -1,40 +0,0 @@ -/** - * 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. - */ - -'use strict'; - -const BaseTestEnvironment = require('./CircusHandleTestEventEnvironment'); - -const SYNC_EVENTS = [ - 'start_describe_definition', - 'finish_describe_definition', - 'add_hook', - 'add_test', - 'error', -]; - -const isAsyncEvent = e => SYNC_EVENTS.indexOf(e.name) === -1; -const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); - -class TestEnvironment extends BaseTestEnvironment { - async handleTestEvent(event) { - this.pendingEvents = this.pendingEvents || new Set(); - if (this.pendingEvents.size > 0) { - console.log('async handleTestEvent is not respected'); - } - - if (isAsyncEvent(event)) { - this.pendingEvents.add(event); - await sleep(0); - this.pendingEvents.delete(event); - } - - await super.handleTestEvent(event); - } -} - -module.exports = TestEnvironment; diff --git a/e2e/test-environment-circus/CircusHandleTestEventEnvironment.js b/e2e/test-environment-circus/CircusHandleTestEventEnvironment.js index 13910cb33238..6bd6f2191adf 100644 --- a/e2e/test-environment-circus/CircusHandleTestEventEnvironment.js +++ b/e2e/test-environment-circus/CircusHandleTestEventEnvironment.js @@ -10,14 +10,8 @@ const JSDOMEnvironment = require('jest-environment-jsdom'); class TestEnvironment extends JSDOMEnvironment { - async handleTestEvent(event) { - if (event.hook) { - console.log(event.name + ': ' + event.hook.type); - } else if (event.test) { - console.log(event.name + ': ' + event.test.name); - } else { - console.log(event.name); - } + handleTestEvent(event) { + console.log(event.name + (event.test ? ': ' + event.test.name : '')); } } diff --git a/e2e/test-environment-circus/__tests__/circusHandleTestEvent.test.js b/e2e/test-environment-circus/__tests__/circusHandleTestEvent.test.js index c0d4d7323399..0ac805527147 100644 --- a/e2e/test-environment-circus/__tests__/circusHandleTestEvent.test.js +++ b/e2e/test-environment-circus/__tests__/circusHandleTestEvent.test.js @@ -4,16 +4,15 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @jest-environment ./testEnvironment.js + * @jest-environment ./CircusHandleTestEventEnvironment.js */ beforeEach(() => {}); -afterEach(() => {}); test('test name here', () => { expect(true).toBe(true); }); test('second test name here', () => { - expect(true).toBe(false); + expect(true).toBe(true); }); diff --git a/e2e/test-environment-circus/testEnvironment.js b/e2e/test-environment-circus/testEnvironment.js deleted file mode 100644 index 62a130ff7642..000000000000 --- a/e2e/test-environment-circus/testEnvironment.js +++ /dev/null @@ -1,12 +0,0 @@ -/** - * 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. - */ - -'use strict'; - -module.exports = process.env.ASYNC_HANDLE_TEST_EVENT - ? require('./CircusAsyncHandleTestEventEnvironment') - : require('./CircusHandleTestEventEnvironment'); From a566dc1910267da48573b188b88966987e46254a Mon Sep 17 00:00:00 2001 From: Yaroslav Serhieiev Date: Sat, 4 Apr 2020 17:59:54 +0300 Subject: [PATCH 09/11] test(circus): more comprehensive e2e test --- .../testEnvironmentCircusAsync.test.ts | 26 ++++++++++++------- .../__tests__/circusHandleTestEvent.test.js | 16 +++++++----- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/e2e/__tests__/testEnvironmentCircusAsync.test.ts b/e2e/__tests__/testEnvironmentCircusAsync.test.ts index f0e22f8403e3..c6eb3385713c 100644 --- a/e2e/__tests__/testEnvironmentCircusAsync.test.ts +++ b/e2e/__tests__/testEnvironmentCircusAsync.test.ts @@ -19,37 +19,43 @@ it('calls asynchronous handleTestEvent in testEnvironment', () => { Array [ "setup", "warning: add_hook is a sync event", + "warning: start_describe_definition is a sync event", "warning: add_hook is a sync event", "warning: add_hook is a sync event", "warning: add_test is a sync event", "warning: add_test is a sync event", + "warning: finish_describe_definition is a sync event", "add_hook", + "start_describe_definition", "add_hook", "add_hook", "add_test", "add_test", + "finish_describe_definition", "run_start", "run_describe_start", - "test_start: test name here", + "run_describe_start", + "test_start: passing test", "hook_start: beforeEach", "hook_success: beforeEach", "hook_start: beforeEach", "hook_success: beforeEach", - "test_fn_start: test name here", - "test_fn_success: test name here", + "test_fn_start: passing test", + "test_fn_success: passing test", "hook_start: afterEach", - "hook_success: afterEach", - "test_done: test name here", - "test_start: second test name here", + "hook_failure: afterEach", + "test_done: passing test", + "test_start: failing test", "hook_start: beforeEach", "hook_success: beforeEach", "hook_start: beforeEach", "hook_success: beforeEach", - "test_fn_start: second test name here", - "test_fn_failure: second test name here", + "test_fn_start: failing test", + "test_fn_failure: failing test", "hook_start: afterEach", - "hook_success: afterEach", - "test_done: second test name here", + "hook_failure: afterEach", + "test_done: failing test", + "run_describe_finish", "run_describe_finish", "run_finish", "teardown", diff --git a/e2e/test-environment-circus-async/__tests__/circusHandleTestEvent.test.js b/e2e/test-environment-circus-async/__tests__/circusHandleTestEvent.test.js index 41771931a809..bab9ba59bc04 100644 --- a/e2e/test-environment-circus-async/__tests__/circusHandleTestEvent.test.js +++ b/e2e/test-environment-circus-async/__tests__/circusHandleTestEvent.test.js @@ -7,13 +7,15 @@ * @jest-environment ./CircusAsyncHandleTestEventEnvironment.js */ -beforeEach(() => {}); -afterEach(() => {}); +describe('suite', () => { + beforeEach(() => {}); + afterEach(() => { throw new Error(); }); -test('test name here', () => { - expect(true).toBe(true); -}); + test('passing test', () => { + expect(true).toBe(true); + }); -test('second test name here', () => { - expect(true).toBe(false); + test('failing test', () => { + expect(true).toBe(false); + }); }); From 57499124d0b9180c598482ecbde0050921d8b330 Mon Sep 17 00:00:00 2001 From: Yaroslav Serhieiev Date: Sat, 4 Apr 2020 18:02:13 +0300 Subject: [PATCH 10/11] lint: fix error --- .../__tests__/circusHandleTestEvent.test.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/e2e/test-environment-circus-async/__tests__/circusHandleTestEvent.test.js b/e2e/test-environment-circus-async/__tests__/circusHandleTestEvent.test.js index bab9ba59bc04..223f5756ee14 100644 --- a/e2e/test-environment-circus-async/__tests__/circusHandleTestEvent.test.js +++ b/e2e/test-environment-circus-async/__tests__/circusHandleTestEvent.test.js @@ -9,7 +9,9 @@ describe('suite', () => { beforeEach(() => {}); - afterEach(() => { throw new Error(); }); + afterEach(() => { + throw new Error(); + }); test('passing test', () => { expect(true).toBe(true); From 956118020744470ea5305220e28de1c018d4ec50 Mon Sep 17 00:00:00 2001 From: Yaroslav Serhieiev Date: Sat, 4 Apr 2020 18:05:56 +0300 Subject: [PATCH 11/11] code: add TODO comment --- packages/jest-circus/src/eventHandler.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/jest-circus/src/eventHandler.ts b/packages/jest-circus/src/eventHandler.ts index 3f092e896a73..7c3a0f9299f4 100644 --- a/packages/jest-circus/src/eventHandler.ts +++ b/packages/jest-circus/src/eventHandler.ts @@ -21,6 +21,7 @@ import { restoreGlobalErrorHandlers, } from './globalErrorHandlers'; +// TODO: investigate why a shorter (event, state) signature results into TS7006 compiler error const eventHandler: Circus.EventHandler = ( event: Circus.Event, state: Circus.State,