Skip to content

Commit 45ef491

Browse files
committed
fix: jest-circus shares events among imports jestjs#11483
1 parent f628b45 commit 45ef491

File tree

7 files changed

+108
-6
lines changed

7 files changed

+108
-6
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
### Fixes
66

7+
- `[jest-circus]` Shares events with event handlers among imports ([#11483](https://github.com/facebook/jest/pull/11483))
78
- `[jest-reporter]` Allow `node-notifier@10` as peer dependency ([#11523](https://github.com/facebook/jest/pull/11523))
89
- `[jest-reporter]` Update `v8-to-istanbul` ([#11523](https://github.com/facebook/jest/pull/11523))
910

packages/jest-circus/src/__mocks__/testUtils.ts

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ export const runTest = (source: string) => {
4646
4747
const testEventHandler = require('${TEST_EVENT_HANDLER_PATH}').default;
4848
const addEventHandler = require('${CIRCUS_STATE_PATH}').addEventHandler;
49+
const removeEventHandler = require('${CIRCUS_STATE_PATH}').removeEventHandler;
4950
addEventHandler(testEventHandler);
5051
5152
${source};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`addEventHandler registers a callback with events 1`] = `
4+
start_describe_definition: describe
5+
add_test: receives events
6+
finish_describe_definition: describe
7+
run_start
8+
run_describe_start: ROOT_DESCRIBE_BLOCK
9+
run_describe_start: describe
10+
test_start: receives events
11+
test_fn_start: receives events
12+
called true
13+
test_fn_failure: receives events
14+
test_done: receives events
15+
run_describe_finish: describe
16+
run_describe_finish: ROOT_DESCRIBE_BLOCK
17+
run_finish
18+
19+
unhandledErrors: 0
20+
`;
21+
22+
exports[`removeEventHandler unregisters a callback from events 1`] = `
23+
start_describe_definition: describe
24+
add_test: does not receive events
25+
finish_describe_definition: describe
26+
run_start
27+
run_describe_start: ROOT_DESCRIBE_BLOCK
28+
run_describe_start: describe
29+
test_start: does not receive events
30+
test_fn_start: does not receive events
31+
called false
32+
test_fn_failure: does not receive events
33+
test_done: does not receive events
34+
run_describe_finish: describe
35+
run_describe_finish: ROOT_DESCRIBE_BLOCK
36+
run_finish
37+
38+
unhandledErrors: 0
39+
`;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/**
2+
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
import wrap from 'jest-snapshot-serializer-raw';
9+
import {runTest} from '../__mocks__/testUtils';
10+
11+
test('addEventHandler registers a callback with events', () => {
12+
const {stdout} = runTest(`
13+
let called = false;
14+
const callback = () => called = true;
15+
addEventHandler(callback);
16+
17+
describe('describe', () => {
18+
test('receives events', () => {
19+
console.log('called', called);
20+
expect(called).toEqual(true);
21+
})
22+
});
23+
`);
24+
25+
expect(wrap(stdout)).toMatchSnapshot();
26+
});
27+
28+
test('removeEventHandler unregisters a callback from events', () => {
29+
const {stdout} = runTest(`
30+
let called = false;
31+
const callback = () => called = true;
32+
addEventHandler(callback);
33+
removeEventHandler(callback);
34+
35+
describe('describe', () => {
36+
test('does not receive events', () => {
37+
console.log('called', called);
38+
expect(called).toEqual(false);
39+
})
40+
});
41+
`);
42+
43+
expect(wrap(stdout)).toMatchSnapshot();
44+
});

packages/jest-circus/src/index.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,13 @@ import {bind as bindEach} from 'jest-each';
1010
import {ErrorWithStack, isPromise} from 'jest-util';
1111
import {dispatchSync} from './state';
1212

13-
export {setState, getState, resetState} from './state';
13+
export {
14+
setState,
15+
getState,
16+
resetState,
17+
addEventHandler,
18+
removeEventHandler,
19+
} from './state';
1420
export {default as run} from './run';
1521

1622
type THook = (fn: Circus.HookFn, timeout?: number) => void;

packages/jest-circus/src/state.ts

+12-5
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@
88
import type {Circus} from '@jest/types';
99
import eventHandler from './eventHandler';
1010
import formatNodeAssertErrors from './formatNodeAssertErrors';
11-
import {STATE_SYM} from './types';
11+
import {EVENT_HANDLERS, STATE_SYM} from './types';
1212
import {makeDescribe} from './utils';
1313

14-
const eventHandlers: Array<Circus.EventHandler> = [
14+
global[EVENT_HANDLERS] = global[EVENT_HANDLERS] || [
1515
eventHandler,
1616
formatNodeAssertErrors,
1717
];
@@ -46,17 +46,24 @@ export const setState = (state: Circus.State): Circus.State =>
4646
(global[STATE_SYM] = state);
4747

4848
export const dispatch = async (event: Circus.AsyncEvent): Promise<void> => {
49-
for (const handler of eventHandlers) {
49+
for (const handler of global[EVENT_HANDLERS]) {
5050
await handler(event, getState());
5151
}
5252
};
5353

5454
export const dispatchSync = (event: Circus.SyncEvent): void => {
55-
for (const handler of eventHandlers) {
55+
for (const handler of global[EVENT_HANDLERS]) {
5656
handler(event, getState());
5757
}
5858
};
5959

6060
export const addEventHandler = (handler: Circus.EventHandler): void => {
61-
eventHandlers.push(handler);
61+
global[EVENT_HANDLERS].push(handler);
62+
};
63+
64+
export const removeEventHandler = (handler: Circus.EventHandler): void => {
65+
const index = global[EVENT_HANDLERS].lastIndexOf(handler);
66+
if (index !== -1) {
67+
global[EVENT_HANDLERS].splice(index, 1);
68+
}
6269
};

packages/jest-circus/src/types.ts

+4
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,17 @@ export const RETRY_TIMES = Symbol.for(
1919
export const TEST_TIMEOUT_SYMBOL = Symbol.for(
2020
'TEST_TIMEOUT_SYMBOL',
2121
) as unknown as 'TEST_TIMEOUT_SYMBOL';
22+
export const EVENT_HANDLERS = Symbol.for(
23+
'EVENT_HANDLERS',
24+
) as unknown as 'EVENT_HANDLERS';
2225

2326
declare global {
2427
module NodeJS {
2528
interface Global {
2629
STATE_SYM_SYMBOL: Circus.State;
2730
RETRY_TIMES_SYMBOL: string;
2831
TEST_TIMEOUT_SYMBOL: number;
32+
EVENT_HANDLERS: Array<Circus.EventHandler>;
2933
expect: typeof expect;
3034
}
3135
}

0 commit comments

Comments
 (0)