From 6b663c8ae3a201f3f20cb542d1a7b64235409a5d Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Sat, 12 Mar 2022 16:14:58 +0200 Subject: [PATCH 01/69] feat!: allow useFakeTimers to take an options bag --- .../__snapshots__/showConfig.test.ts.snap | 2 +- e2e/fake-promises/asap/package.json | 4 +- e2e/fake-promises/immediate/package.json | 4 +- e2e/fake-time/legacy/from-config/package.json | 4 +- .../legacy/from-jest-object/__tests__/test.js | 2 +- .../requestAnimationFrame/__tests__/test.js | 2 +- e2e/fake-time/modern/from-config/package.json | 4 +- .../requestAnimationFrame/__tests__/test.js | 3 +- .../from-config/package.json | 4 +- .../from-jest-object/__tests__/test.js | 4 +- e2e/set-immediate/package.json | 2 +- .../with-reset-mocks/package.json | 4 +- e2e/timer-use-real-timers/package.json | 2 +- .../legacy-code-todo-rewrite/jestAdapter.ts | 6 +- .../__tests__/__snapshots__/init.test.js.snap | 2 +- packages/jest-config/src/Defaults.ts | 2 +- packages/jest-config/src/Descriptions.ts | 1 + packages/jest-config/src/ValidConfig.ts | 29 ++++- .../logDebugMessages.test.ts.snap | 2 +- packages/jest-environment/src/index.ts | 2 +- packages/jest-fake-timers/package.json | 1 + .../modernFakeTimers.test.ts.snap | 2 +- .../src/__tests__/modernFakeTimers.test.ts | 100 ++++++++++------- .../jest-fake-timers/src/modernFakeTimers.ts | 28 ++--- packages/jest-fake-timers/tsconfig.json | 3 +- packages/jest-jasmine2/src/index.ts | 6 +- packages/jest-runtime/src/index.ts | 8 +- .../ScriptTransformer.test.ts.snap | 22 ++-- .../jest-types/__typetests__/jest.test.ts | 42 ++++++- packages/jest-types/src/Config.ts | 105 +++++++++++++++++- .../workers/__tests__/processChild.test.js | 2 - .../src/workers/__tests__/threadChild.test.js | 2 - packages/test-utils/src/config.ts | 2 +- yarn.lock | 1 + 34 files changed, 291 insertions(+), 118 deletions(-) diff --git a/e2e/__tests__/__snapshots__/showConfig.test.ts.snap b/e2e/__tests__/__snapshots__/showConfig.test.ts.snap index 4c7058473159..e08e1c804615 100644 --- a/e2e/__tests__/__snapshots__/showConfig.test.ts.snap +++ b/e2e/__tests__/__snapshots__/showConfig.test.ts.snap @@ -66,7 +66,7 @@ exports[`--showConfig outputs config info and exits 1`] = ` ], "testRegex": [], "testRunner": "<>/jest-circus/runner.js", - "timers": "real", + "timers": {}, "transform": [ [ "\\\\.[jt]sx?$", diff --git a/e2e/fake-promises/asap/package.json b/e2e/fake-promises/asap/package.json index 0f50640514e1..8592ccefa3ef 100644 --- a/e2e/fake-promises/asap/package.json +++ b/e2e/fake-promises/asap/package.json @@ -1,9 +1,9 @@ { "jest": { - "timers": "fake", "setupFiles": [ "/fake-promises" ], - "testEnvironment": "node" + "testEnvironment": "node", + "timers": {"strategy": "modern"} } } diff --git a/e2e/fake-promises/immediate/package.json b/e2e/fake-promises/immediate/package.json index 0f50640514e1..8592ccefa3ef 100644 --- a/e2e/fake-promises/immediate/package.json +++ b/e2e/fake-promises/immediate/package.json @@ -1,9 +1,9 @@ { "jest": { - "timers": "fake", "setupFiles": [ "/fake-promises" ], - "testEnvironment": "node" + "testEnvironment": "node", + "timers": {"strategy": "modern"} } } diff --git a/e2e/fake-time/legacy/from-config/package.json b/e2e/fake-time/legacy/from-config/package.json index 3d94760ca58b..37c77e1275e6 100644 --- a/e2e/fake-time/legacy/from-config/package.json +++ b/e2e/fake-time/legacy/from-config/package.json @@ -1,6 +1,6 @@ { "jest": { - "timers": "legacy", - "testEnvironment": "node" + "testEnvironment": "node", + "timers": {"strategy": "legacy"} } } diff --git a/e2e/fake-time/legacy/from-jest-object/__tests__/test.js b/e2e/fake-time/legacy/from-jest-object/__tests__/test.js index 982b23cbf809..06ce552135d0 100644 --- a/e2e/fake-time/legacy/from-jest-object/__tests__/test.js +++ b/e2e/fake-time/legacy/from-jest-object/__tests__/test.js @@ -8,7 +8,7 @@ 'use strict'; test('fake timers', () => { - jest.useFakeTimers('legacy'); + jest.useFakeTimers({strategy: 'legacy'}); expect(() => jest.setSystemTime(0)).toThrow( 'setSystemTime is not available when not using modern timers', diff --git a/e2e/fake-time/legacy/requestAnimationFrame/__tests__/test.js b/e2e/fake-time/legacy/requestAnimationFrame/__tests__/test.js index 42c638bbf191..4b94d5c9514d 100644 --- a/e2e/fake-time/legacy/requestAnimationFrame/__tests__/test.js +++ b/e2e/fake-time/legacy/requestAnimationFrame/__tests__/test.js @@ -10,7 +10,7 @@ 'use strict'; test('requestAnimationFrame', () => { - jest.useFakeTimers('legacy'); + jest.useFakeTimers({strategy: 'legacy'}); let frameTimestamp = -1; requestAnimationFrame(timestamp => { frameTimestamp = timestamp; diff --git a/e2e/fake-time/modern/from-config/package.json b/e2e/fake-time/modern/from-config/package.json index 8d831ccf6947..7512977b8010 100644 --- a/e2e/fake-time/modern/from-config/package.json +++ b/e2e/fake-time/modern/from-config/package.json @@ -1,6 +1,6 @@ { "jest": { - "timers": "fake", - "testEnvironment": "node" + "testEnvironment": "node", + "timers": {"strategy": "modern"} } } diff --git a/e2e/fake-time/modern/requestAnimationFrame/__tests__/test.js b/e2e/fake-time/modern/requestAnimationFrame/__tests__/test.js index 17e29447c67a..776036011cf8 100644 --- a/e2e/fake-time/modern/requestAnimationFrame/__tests__/test.js +++ b/e2e/fake-time/modern/requestAnimationFrame/__tests__/test.js @@ -10,7 +10,8 @@ 'use strict'; test('requestAnimationFrame', () => { - jest.useFakeTimers('modern'); + jest.useFakeTimers(); + let frameTimestamp = -1; requestAnimationFrame(timestamp => { frameTimestamp = timestamp; diff --git a/e2e/modern-fake-timers/from-config/package.json b/e2e/modern-fake-timers/from-config/package.json index 48517c65a548..7512977b8010 100644 --- a/e2e/modern-fake-timers/from-config/package.json +++ b/e2e/modern-fake-timers/from-config/package.json @@ -1,6 +1,6 @@ { "jest": { - "timers": "modern", - "testEnvironment": "node" + "testEnvironment": "node", + "timers": {"strategy": "modern"} } } diff --git a/e2e/modern-fake-timers/from-jest-object/__tests__/test.js b/e2e/modern-fake-timers/from-jest-object/__tests__/test.js index 6fd28535c2bd..fd294d2323e3 100644 --- a/e2e/modern-fake-timers/from-jest-object/__tests__/test.js +++ b/e2e/modern-fake-timers/from-jest-object/__tests__/test.js @@ -8,7 +8,7 @@ 'use strict'; test('fake timers with number argument', () => { - jest.useFakeTimers('modern'); + jest.useFakeTimers(); jest.setSystemTime(0); @@ -20,7 +20,7 @@ test('fake timers with number argument', () => { }); test('fake timers with Date argument', () => { - jest.useFakeTimers('modern'); + jest.useFakeTimers(); jest.setSystemTime(new Date(0)); diff --git a/e2e/set-immediate/package.json b/e2e/set-immediate/package.json index 1cb610cba16b..7512977b8010 100644 --- a/e2e/set-immediate/package.json +++ b/e2e/set-immediate/package.json @@ -1,6 +1,6 @@ { "jest": { "testEnvironment": "node", - "timers": "fake" + "timers": {"strategy": "modern"} } } diff --git a/e2e/timer-reset-mocks/with-reset-mocks/package.json b/e2e/timer-reset-mocks/with-reset-mocks/package.json index 7c8e0b6b4210..bf9c895e1ef3 100644 --- a/e2e/timer-reset-mocks/with-reset-mocks/package.json +++ b/e2e/timer-reset-mocks/with-reset-mocks/package.json @@ -1,7 +1,7 @@ { "jest": { - "testEnvironment": "node", "resetMocks": true, - "timers": "fake" + "testEnvironment": "node", + "timers": {"strategy": "modern"} } } diff --git a/e2e/timer-use-real-timers/package.json b/e2e/timer-use-real-timers/package.json index 1cb610cba16b..7512977b8010 100644 --- a/e2e/timer-use-real-timers/package.json +++ b/e2e/timer-use-real-timers/package.json @@ -1,6 +1,6 @@ { "jest": { "testEnvironment": "node", - "timers": "fake" + "timers": {"strategy": "modern"} } } 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 dc8059b39acf..f37bb6546e03 100644 --- a/packages/jest-circus/src/legacy-code-todo-rewrite/jestAdapter.ts +++ b/packages/jest-circus/src/legacy-code-todo-rewrite/jestAdapter.ts @@ -38,10 +38,10 @@ const jestAdapter = async ( testPath, }); - if (config.timers === 'fake' || config.timers === 'modern') { + if (config.timers.strategy === 'modern') { // during setup, this cannot be null (and it's fine to explode if it is) - environment.fakeTimersModern!.useFakeTimers(); - } else if (config.timers === 'legacy') { + environment.fakeTimersModern!.useFakeTimers(config.timers); + } else if (config.timers.strategy === 'legacy') { environment.fakeTimers!.useFakeTimers(); } diff --git a/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap b/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap index 157419444c3d..2151a310bc4d 100644 --- a/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap +++ b/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap @@ -284,7 +284,7 @@ module.exports = { // testRunner: "jest-circus/runner", // Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout" - // timers: "real", + // timers: {}, // A map from regular expressions to paths to transformers // transform: undefined, diff --git a/packages/jest-config/src/Defaults.ts b/packages/jest-config/src/Defaults.ts index 9cc30e2d09e3..89be51afd672 100644 --- a/packages/jest-config/src/Defaults.ts +++ b/packages/jest-config/src/Defaults.ts @@ -72,7 +72,7 @@ const defaultOptions: Config.DefaultOptions = { testRegex: [], testRunner: 'jest-circus/runner', testSequencer: '@jest/test-sequencer', - timers: 'real', + timers: {}, transformIgnorePatterns: [NODE_MODULES_REGEXP, `\\.pnp\\.[^\\${sep}]+$`], useStderr: false, watch: false, diff --git a/packages/jest-config/src/Descriptions.ts b/packages/jest-config/src/Descriptions.ts index 795637460a1d..0bcff52ba053 100644 --- a/packages/jest-config/src/Descriptions.ts +++ b/packages/jest-config/src/Descriptions.ts @@ -84,6 +84,7 @@ const descriptions: {[key in keyof Config.InitialOptions]: string} = { testResultsProcessor: 'This option allows the use of a custom results processor', testRunner: 'This option allows use of a custom test runner', + // TODO timers: 'Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout"', transform: 'A map from regular expressions to paths to transformers', diff --git a/packages/jest-config/src/ValidConfig.ts b/packages/jest-config/src/ValidConfig.ts index 5757431123ed..cdc7c9ceb4f5 100644 --- a/packages/jest-config/src/ValidConfig.ts +++ b/packages/jest-config/src/ValidConfig.ts @@ -132,7 +132,34 @@ const initialOptions: Config.InitialOptions = { testRunner: 'circus', testSequencer: '@jest/test-sequencer', testTimeout: 5000, - timers: 'real', + timers: multipleValidOptions( + {loopLimit: 1000, strategy: 'legacy'} as const, + { + advanceTimeDelta: 1000, + loopLimit: 1000, + now: multipleValidOptions(0, new Date()), + shouldAdvanceTime: false, + shouldClearNativeTimers: false, + strategy: 'modern', + toFake: [ + 'setImmediate', + 'clearImmediate', + 'setInterval', + 'clearInterval', + 'setTimeout', + 'clearTimeout', + 'requestAnimationFrame', + 'cancelAnimationFrame', + 'requestIdleCallback', + 'cancelIdleCallback', + 'Date', + 'hrtime', + 'nextTick', + 'performance', + 'queueMicrotask', // ? + ] as Array, + } as const, + ), transform: { '\\.js$': '/preprocessor.js', }, diff --git a/packages/jest-core/src/lib/__tests__/__snapshots__/logDebugMessages.test.ts.snap b/packages/jest-core/src/lib/__tests__/__snapshots__/logDebugMessages.test.ts.snap index dea4afbba9ef..3c0dbeb0504b 100644 --- a/packages/jest-core/src/lib/__tests__/__snapshots__/logDebugMessages.test.ts.snap +++ b/packages/jest-core/src/lib/__tests__/__snapshots__/logDebugMessages.test.ts.snap @@ -52,7 +52,7 @@ exports[`prints the config object 1`] = ` "\\\\.test\\\\.js$" ], "testRunner": "myRunner", - "timers": "real", + "timers": {}, "transform": [], "transformIgnorePatterns": [], "watchPathIgnorePatterns": [] diff --git a/packages/jest-environment/src/index.ts b/packages/jest-environment/src/index.ts index ac7fe89c30cc..bc01dfb717f6 100644 --- a/packages/jest-environment/src/index.ts +++ b/packages/jest-environment/src/index.ts @@ -304,7 +304,7 @@ export interface Jest { /** * Instructs Jest to use fake versions of the standard timer functions. */ - useFakeTimers(implementation?: 'modern' | 'legacy'): Jest; + useFakeTimers(config?: Config.TimersConfig): Jest; /** * Instructs Jest to use the real versions of the standard timer functions. */ diff --git a/packages/jest-fake-timers/package.json b/packages/jest-fake-timers/package.json index 264beaa4f5b0..2628c49d119f 100644 --- a/packages/jest-fake-timers/package.json +++ b/packages/jest-fake-timers/package.json @@ -25,6 +25,7 @@ "jest-util": "^28.0.0-alpha.7" }, "devDependencies": { + "@jest/test-utils": "^28.0.0-alpha.7", "@types/sinonjs__fake-timers": "^8.1.1" }, "engines": { diff --git a/packages/jest-fake-timers/src/__tests__/__snapshots__/modernFakeTimers.test.ts.snap b/packages/jest-fake-timers/src/__tests__/__snapshots__/modernFakeTimers.test.ts.snap index 8b00458786e1..5d407bdceba6 100644 --- a/packages/jest-fake-timers/src/__tests__/__snapshots__/modernFakeTimers.test.ts.snap +++ b/packages/jest-fake-timers/src/__tests__/__snapshots__/modernFakeTimers.test.ts.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`FakeTimers runAllTimers warns when trying to advance timers while real timers are used 1`] = `"A function to advance timers was called but the timers API is not mocked with fake timers. Call \`jest.useFakeTimers()\` in this test or enable fake timers globally by setting \`"timers": "fake"\` in the configuration file"`; +exports[`FakeTimers runAllTimers warns when trying to advance timers while real timers are used 1`] = `"A function to advance timers was called but the timers API is not mocked with fake timers. Call \`jest.useFakeTimers()\` in this test or enable fake timers globally by setting \`"timers": {"strategy": "modern"}\` in the configuration file"`; diff --git a/packages/jest-fake-timers/src/__tests__/modernFakeTimers.test.ts b/packages/jest-fake-timers/src/__tests__/modernFakeTimers.test.ts index 36b14aecc128..7fe690989293 100644 --- a/packages/jest-fake-timers/src/__tests__/modernFakeTimers.test.ts +++ b/packages/jest-fake-timers/src/__tests__/modernFakeTimers.test.ts @@ -6,6 +6,7 @@ * */ +import {makeProjectConfig} from '@jest/test-utils'; import FakeTimers from '../modernFakeTimers'; describe('FakeTimers', () => { @@ -17,7 +18,7 @@ describe('FakeTimers', () => { process, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); expect(global.setTimeout).not.toBe(undefined); }); @@ -29,7 +30,7 @@ describe('FakeTimers', () => { process, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); expect(global.clearTimeout).not.toBe(undefined); }); @@ -41,7 +42,7 @@ describe('FakeTimers', () => { process, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); expect(global.setInterval).not.toBe(undefined); }); @@ -53,7 +54,7 @@ describe('FakeTimers', () => { process, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); expect(global.clearInterval).not.toBe(undefined); }); @@ -68,7 +69,7 @@ describe('FakeTimers', () => { }, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); expect(global.process.nextTick).not.toBe(origNextTick); }); @@ -82,7 +83,7 @@ describe('FakeTimers', () => { setImmediate: origSetImmediate, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); expect(global.setImmediate).not.toBe(origSetImmediate); }); @@ -98,7 +99,7 @@ describe('FakeTimers', () => { setImmediate: origSetImmediate, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); expect(global.clearImmediate).not.toBe(origClearImmediate); }); @@ -115,7 +116,7 @@ describe('FakeTimers', () => { setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); const runOrder = []; @@ -146,7 +147,7 @@ describe('FakeTimers', () => { setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); timers.runAllTicks(); @@ -163,7 +164,7 @@ describe('FakeTimers', () => { setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); const mock1 = jest.fn(); @@ -187,7 +188,10 @@ describe('FakeTimers', () => { setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global, maxLoops: 100}); + const timers = new FakeTimers({ + config: makeProjectConfig({timers: {loopLimit: 100}}), + global, + }); timers.useFakeTimers(); @@ -211,7 +215,7 @@ describe('FakeTimers', () => { process, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); const runOrder = []; @@ -247,9 +251,7 @@ describe('FakeTimers', () => { const consoleWarn = console.warn; console.warn = jest.fn(); const timers = new FakeTimers({ - config: { - rootDir: __dirname, - }, + config: makeProjectConfig({rootDir: __dirname}), global: globalThis, }); timers.runAllTimers(); @@ -268,7 +270,7 @@ describe('FakeTimers', () => { setTimeout: nativeSetTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); timers.runAllTimers(); }); @@ -280,7 +282,7 @@ describe('FakeTimers', () => { process, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); const fn = jest.fn(); @@ -301,7 +303,7 @@ describe('FakeTimers', () => { process, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); const fn = jest.fn(); @@ -322,7 +324,7 @@ describe('FakeTimers', () => { setTimeout: nativeSetTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); // @sinonjs/fake-timers uses `setTimeout` during init to figure out if it's in Node or // browser env. So clear its calls before we install them into the env nativeSetTimeout.mockClear(); @@ -343,7 +345,10 @@ describe('FakeTimers', () => { process, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global, maxLoops: 100}); + const timers = new FakeTimers({ + config: makeProjectConfig({timers: {loopLimit: 1000}}), + global, + }); timers.useFakeTimers(); global.setTimeout(function infinitelyRecursingCallback() { @@ -354,7 +359,7 @@ describe('FakeTimers', () => { timers.runAllTimers(); }).toThrow( new Error( - 'Aborting after running 100 timers, assuming an infinite loop!', + 'Aborting after running 1000 timers, assuming an infinite loop!', ), ); }); @@ -366,7 +371,7 @@ describe('FakeTimers', () => { process, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); const fn = jest.fn(); @@ -388,7 +393,7 @@ describe('FakeTimers', () => { process, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); const runOrder = []; @@ -432,7 +437,7 @@ describe('FakeTimers', () => { process, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); timers.advanceTimersByTime(100); @@ -447,7 +452,7 @@ describe('FakeTimers', () => { process, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); const runOrder: Array = []; @@ -487,7 +492,7 @@ describe('FakeTimers', () => { process, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); const runOrder: Array = []; @@ -526,7 +531,7 @@ describe('FakeTimers', () => { process, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); const runOrder: Array = []; @@ -554,7 +559,7 @@ describe('FakeTimers', () => { process, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); timers.advanceTimersToNextTimer(); @@ -569,7 +574,7 @@ describe('FakeTimers', () => { process, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); const mock1 = jest.fn(); @@ -587,7 +592,7 @@ describe('FakeTimers', () => { process, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); const mock1 = jest.fn(); @@ -608,7 +613,7 @@ describe('FakeTimers', () => { setImmediate: () => {}, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); const mock1 = jest.fn(); @@ -627,7 +632,7 @@ describe('FakeTimers', () => { process, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); const mock1 = jest.fn(); @@ -654,7 +659,7 @@ describe('FakeTimers', () => { setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); const runOrder = []; @@ -719,7 +724,7 @@ describe('FakeTimers', () => { process, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); const fn = jest.fn(); @@ -748,7 +753,7 @@ describe('FakeTimers', () => { setInterval: nativeSetInterval, setTimeout: nativeSetTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); // Ensure that timers has overridden the native timer APIs @@ -775,7 +780,7 @@ describe('FakeTimers', () => { process: {nextTick: nativeProcessNextTick}, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); // Ensure that timers has overridden the native timer APIs @@ -799,7 +804,7 @@ describe('FakeTimers', () => { setImmediate: nativeSetImmediate, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useFakeTimers(); // Ensure that timers has overridden the native timer APIs @@ -829,7 +834,7 @@ describe('FakeTimers', () => { setInterval: nativeSetInterval, setTimeout: nativeSetTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useRealTimers(); // Ensure that the real timers are installed at this point @@ -856,7 +861,7 @@ describe('FakeTimers', () => { process: {nextTick: nativeProcessNextTick}, setTimeout, } as unknown as typeof globalThis; - const timers = new FakeTimers({global}); + const timers = new FakeTimers({config: makeProjectConfig(), global}); timers.useRealTimers(); // Ensure that the real timers are installed at this point @@ -880,7 +885,7 @@ describe('FakeTimers', () => { setImmediate: nativeSetImmediate, setTimeout, } as unknown as typeof globalThis; - const fakeTimers = new FakeTimers({global}); + const fakeTimers = new FakeTimers({config: makeProjectConfig(), global}); fakeTimers.useRealTimers(); // Ensure that the real timers are installed at this point @@ -897,7 +902,10 @@ describe('FakeTimers', () => { describe('getTimerCount', () => { it('returns the correct count', () => { - const timers = new FakeTimers({global: globalThis}); + const timers = new FakeTimers({ + config: makeProjectConfig(), + global: globalThis, + }); timers.useFakeTimers(); @@ -917,7 +925,10 @@ describe('FakeTimers', () => { }); it('includes immediates and ticks', () => { - const timers = new FakeTimers({global: globalThis}); + const timers = new FakeTimers({ + config: makeProjectConfig(), + global: globalThis, + }); timers.useFakeTimers(); @@ -929,7 +940,10 @@ describe('FakeTimers', () => { }); it('not includes cancelled immediates', () => { - const timers = new FakeTimers({global: globalThis}); + const timers = new FakeTimers({ + config: makeProjectConfig(), + global: globalThis, + }); timers.useFakeTimers(); diff --git a/packages/jest-fake-timers/src/modernFakeTimers.ts b/packages/jest-fake-timers/src/modernFakeTimers.ts index 93abce4dd4c9..01262b536e41 100644 --- a/packages/jest-fake-timers/src/modernFakeTimers.ts +++ b/packages/jest-fake-timers/src/modernFakeTimers.ts @@ -8,30 +8,28 @@ import { FakeTimerWithContext, InstalledClock, + FakeTimerInstallOpts as SinonTimersConfig, withGlobal, } from '@sinonjs/fake-timers'; -import {StackTraceConfig, formatStackTrace} from 'jest-message-util'; +import type {Config} from '@jest/types'; +import {formatStackTrace} from 'jest-message-util'; export default class FakeTimers { private _clock!: InstalledClock; - private _config: StackTraceConfig; + private _config: Config.ProjectConfig; private _fakingTime: boolean; private _global: typeof globalThis; private _fakeTimers: FakeTimerWithContext; - private _maxLoops: number; constructor({ global, config, - maxLoops, }: { global: typeof globalThis; - config: StackTraceConfig; - maxLoops?: number; + config: Config.ProjectConfig; }) { this._global = global; this._config = config; - this._maxLoops = maxLoops || 100000; this._fakingTime = false; this._fakeTimers = withGlobal(global); @@ -93,17 +91,21 @@ export default class FakeTimers { } } - useFakeTimers(): void { + useFakeTimers(timersConfig?: SinonTimersConfig): void { if (!this._fakingTime) { const toFake = Object.keys(this._fakeTimers.timers) as Array< keyof FakeTimerWithContext['timers'] >; - this._clock = this._fakeTimers.install({ - loopLimit: this._maxLoops, + const resolvedTimersConfig: SinonTimersConfig = { + loopLimit: 100_000, now: Date.now(), toFake, - }); + ...this._config.timers, + ...timersConfig, + }; + + this._clock = this._fakeTimers.install(resolvedTimersConfig); this._fakingTime = true; } @@ -140,8 +142,8 @@ export default class FakeTimers { this._global.console.warn( 'A function to advance timers was called but the timers API is not ' + 'mocked with fake timers. Call `jest.useFakeTimers()` in this test or ' + - 'enable fake timers globally by setting `"timers": "fake"` in the ' + - `configuration file\nStack Trace:\n${formatStackTrace( + 'enable fake timers globally by setting `"timers": {"strategy": "modern"}` ' + + `in the configuration file\nStack Trace:\n${formatStackTrace( new Error().stack!, this._config, {noStackTrace: false}, diff --git a/packages/jest-fake-timers/tsconfig.json b/packages/jest-fake-timers/tsconfig.json index 0bdcddc53258..4a4b01562562 100644 --- a/packages/jest-fake-timers/tsconfig.json +++ b/packages/jest-fake-timers/tsconfig.json @@ -10,6 +10,7 @@ {"path": "../jest-message-util"}, {"path": "../jest-mock"}, {"path": "../jest-types"}, - {"path": "../jest-util"} + {"path": "../jest-util"}, + {"path": "../test-utils"} ] } diff --git a/packages/jest-jasmine2/src/index.ts b/packages/jest-jasmine2/src/index.ts index d8f1a14bc4f5..b6ff009cfda1 100644 --- a/packages/jest-jasmine2/src/index.ts +++ b/packages/jest-jasmine2/src/index.ts @@ -88,9 +88,9 @@ export default async function jasmine2( environment.global.describe.skip = environment.global.xdescribe; environment.global.describe.only = environment.global.fdescribe; - if (config.timers === 'fake' || config.timers === 'modern') { - environment.fakeTimersModern!.useFakeTimers(); - } else if (config.timers === 'legacy') { + if (config.timers.strategy === 'modern') { + environment.fakeTimersModern!.useFakeTimers(config.timers); + } else if (config.timers.strategy === 'legacy') { environment.fakeTimers!.useFakeTimers(); } diff --git a/packages/jest-runtime/src/index.ts b/packages/jest-runtime/src/index.ts index 7fc8a91f6af3..4224af580f96 100644 --- a/packages/jest-runtime/src/index.ts +++ b/packages/jest-runtime/src/index.ts @@ -280,7 +280,7 @@ export default class Runtime { this._transitiveShouldMock = new Map(); this._fakeTimersImplementation = - config.timers === 'legacy' + config.timers.strategy === 'legacy' ? this._environment.fakeTimers : this._environment.fakeTimersModern; @@ -2065,13 +2065,13 @@ export default class Runtime { return this._fakeTimersImplementation!; }; - const useFakeTimers: Jest['useFakeTimers'] = (type = 'modern') => { - if (type === 'legacy') { + const useFakeTimers: Jest['useFakeTimers'] = config => { + if (config?.strategy === 'legacy') { this._fakeTimersImplementation = this._environment.fakeTimers; } else { this._fakeTimersImplementation = this._environment.fakeTimersModern; } - this._fakeTimersImplementation!.useFakeTimers(); + this._fakeTimersImplementation!.useFakeTimers(config); return jestObject; }; const useRealTimers = () => { diff --git a/packages/jest-transform/src/__tests__/__snapshots__/ScriptTransformer.test.ts.snap b/packages/jest-transform/src/__tests__/__snapshots__/ScriptTransformer.test.ts.snap index 7d89d8bbf339..f08efe9bca42 100644 --- a/packages/jest-transform/src/__tests__/__snapshots__/ScriptTransformer.test.ts.snap +++ b/packages/jest-transform/src/__tests__/__snapshots__/ScriptTransformer.test.ts.snap @@ -76,7 +76,7 @@ exports[`ScriptTransformer in async mode, passes expected transform options to g "\\.test\\.js$", ], "testRunner": "jest-circus/runner", - "timers": "real", + "timers": Object {}, "transform": Array [ Array [ "\\.js$", @@ -92,7 +92,7 @@ exports[`ScriptTransformer in async mode, passes expected transform options to g "unmockedModulePathPatterns": undefined, "watchPathIgnorePatterns": Array [], }, - "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":"real","transform":[["\\\\.js$","test_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", + "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{},"transform":[["\\\\.js$","test_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", "coverageProvider": "babel", "instrument": true, "supportsDynamicImport": false, @@ -118,7 +118,7 @@ exports[`ScriptTransformer in async mode, uses the supplied async preprocessor 1 "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":"real","transform":[["\\\\.js$","test_async_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":\\"real\\",\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_async_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{},"transform":[["\\\\.js$","test_async_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_async_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; @@ -128,7 +128,7 @@ exports[`ScriptTransformer in async mode, uses the supplied preprocessor 1`] = ` "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":"real","transform":[["\\\\.js$","test_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":\\"real\\",\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{},"transform":[["\\\\.js$","test_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; @@ -207,7 +207,7 @@ exports[`ScriptTransformer passes expected transform options to getCacheKey 1`] "\\.test\\.js$", ], "testRunner": "jest-circus/runner", - "timers": "real", + "timers": Object {}, "transform": Array [ Array [ "\\.js$", @@ -223,7 +223,7 @@ exports[`ScriptTransformer passes expected transform options to getCacheKey 1`] "unmockedModulePathPatterns": undefined, "watchPathIgnorePatterns": Array [], }, - "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":"real","transform":[["\\\\.js$","test_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", + "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{},"transform":[["\\\\.js$","test_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", "coverageProvider": "babel", "instrument": true, "supportsDynamicImport": false, @@ -312,7 +312,7 @@ exports[`ScriptTransformer passes expected transform options to getCacheKeyAsync "\\.test\\.js$", ], "testRunner": "jest-circus/runner", - "timers": "real", + "timers": Object {}, "transform": Array [ Array [ "\\.js$", @@ -328,7 +328,7 @@ exports[`ScriptTransformer passes expected transform options to getCacheKeyAsync "unmockedModulePathPatterns": undefined, "watchPathIgnorePatterns": Array [], }, - "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":"real","transform":[["\\\\.js$","test_async_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", + "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{},"transform":[["\\\\.js$","test_async_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", "coverageProvider": "babel", "instrument": true, "supportsDynamicImport": false, @@ -676,7 +676,7 @@ exports[`ScriptTransformer uses mixture of sync/async preprocessors 1`] = ` "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":"real","transform":[["\\\\.js$","test_async_preprocessor",{}],["\\\\.css$","css-preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":\\"real\\",\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_async_preprocessor\\",{}],[\\"\\\\\\\\.css$\\",\\"css-preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{},"transform":[["\\\\.js$","test_async_preprocessor",{}],["\\\\.css$","css-preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_async_preprocessor\\",{}],[\\"\\\\\\\\.css$\\",\\"css-preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; @@ -693,7 +693,7 @@ exports[`ScriptTransformer uses multiple preprocessors 1`] = ` "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":"real","transform":[["\\\\.js$","test_preprocessor",{}],["\\\\.css$","css-preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":\\"real\\",\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}],[\\"\\\\\\\\.css$\\",\\"css-preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{},"transform":[["\\\\.js$","test_preprocessor",{}],["\\\\.css$","css-preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}],[\\"\\\\\\\\.css$\\",\\"css-preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; @@ -710,7 +710,7 @@ exports[`ScriptTransformer uses the supplied preprocessor 1`] = ` "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":"real","transform":[["\\\\.js$","test_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":\\"real\\",\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{},"transform":[["\\\\.js$","test_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; diff --git a/packages/jest-types/__typetests__/jest.test.ts b/packages/jest-types/__typetests__/jest.test.ts index 6c2a9f17b75a..ede89db79faf 100644 --- a/packages/jest-types/__typetests__/jest.test.ts +++ b/packages/jest-types/__typetests__/jest.test.ts @@ -43,8 +43,7 @@ expectType( .setTimeout(6000) .unmock('moduleName') .useFakeTimers() - .useFakeTimers('modern') - .useFakeTimers('legacy') + .useFakeTimers({strategy: 'legacy'}) .useRealTimers(), ); @@ -248,9 +247,42 @@ expectType(jest.setSystemTime(new Date(1995, 11, 17))); expectError(jest.setSystemTime('1995-12-17T03:24:00')); expectType(jest.useFakeTimers()); -expectType(jest.useFakeTimers('modern')); -expectType(jest.useFakeTimers('legacy')); -expectError(jest.useFakeTimers('latest')); +expectType(jest.useFakeTimers({strategy: 'modern'})); +expectType(jest.useFakeTimers({loopLimit: 1000})); +expectType(jest.useFakeTimers({now: 1483228800000})); +expectType(jest.useFakeTimers({now: Date.now()})); +expectType(jest.useFakeTimers({now: new Date(1995, 11, 17)})); +expectType(jest.useFakeTimers({shouldAdvanceTime: true})); +expectType(jest.useFakeTimers({advanceTimeDelta: 10})); +expectType(jest.useFakeTimers({shouldClearNativeTimers: false})); +expectType( + jest.useFakeTimers({ + toFake: [ + 'setImmediate', + 'clearImmediate', + 'setInterval', + 'clearInterval', + 'setTimeout', + 'clearTimeout', + 'requestAnimationFrame', + 'cancelAnimationFrame', + 'requestIdleCallback', + 'cancelIdleCallback', + 'Date', + 'hrtime', + 'nextTick', + 'performance', + ], + }), +); + +expectType(jest.useFakeTimers({strategy: 'legacy'})); +expectType( + jest.useFakeTimers({loopLimit: 1000, strategy: 'legacy'}), +); + +expectError(jest.useFakeTimers('modern')); +expectError(jest.useFakeTimers({strategy: 'legacy', toFake: 'Date'})); expectType(jest.useRealTimers()); expectError(jest.useRealTimers(true)); diff --git a/packages/jest-types/src/Config.ts b/packages/jest-types/src/Config.ts index 80243eb45512..14e8d099f5dd 100644 --- a/packages/jest-types/src/Config.ts +++ b/packages/jest-types/src/Config.ts @@ -12,7 +12,104 @@ import type {SnapshotFormat} from '@jest/schemas'; type CoverageProvider = 'babel' | 'v8'; -type Timers = 'real' | 'fake' | 'modern' | 'legacy'; +export type FakeableTimerAPIs = + | 'setImmediate' + | 'clearImmediate' + | 'setInterval' + | 'clearInterval' + | 'setTimeout' + | 'clearTimeout' + | 'requestAnimationFrame' + | 'cancelAnimationFrame' + | 'requestIdleCallback' + | 'cancelIdleCallback' + | 'Date' + | 'hrtime' + | 'nextTick' + | 'performance'; +// | 'queueMicrotask'; // ? + +export type LegacyTimersConfig = { + /** + * The strategy to be use for the fake timers. + * + * @defaultValue + * The default is `'modern'`. + */ + strategy?: 'legacy'; + /** + * The maximum number of timers that will be run when calling `jest.advanceTimersByTime()`, + * `jest.runAllImmediates()`, `jest.runAllTicks()` or `jest.runAllTimers()`. + * + * @defaultValue + * The default is `100_000` timers. + */ + loopLimit?: number; +}; + +export type ModernTimersConfig = { + /** + * The strategy to be use for the fake timers. + * + * @defaultValue + * The default is `'modern'`. + */ + strategy?: 'modern'; + /** + * Sets the default unix epoch. May be a number (in milliseconds) or a Date object. + * + * @defaultValue + * The default is `Date.now()`. + */ + now?: number | Date; + /** + * Allows to cherry pick the timer methods and objects (e.g. `setTimeout()`, + * `setImmediate()`, `Date`, `nextTick`, `performance`) that should be faked. + * + * @defaultValue + * All timer APIs are faked by default. + * + * @example + * {toFake: ['nextTick', 'setTimeout']} + */ + toFake?: Array; + /** + * The maximum number of timers that will be run when calling `jest.advanceTimersByTime()`, + * `jest.runAllTicks()` or `jest.runAllTimers()`. + * + * @defaultValue + * The default is `100_000` timers. + */ + loopLimit?: number; + /** + * Whether to increment mocked time automatically based on the real system time + * shift. If `shouldAdvanceTime` is not set, the mocked time will be incremented + * by 20 milliseconds for every 20 milliseconds change in the real system time. + * + * @defaultValue + * The default is `false`. + */ + shouldAdvanceTime?: boolean; + /** + * Relevant only when using with `shouldAdvanceTime: true`. Increment mocked + * time by `advanceTimeDelta` milliseconds every `advanceTimeDelta` milliseconds. + * + * @defaultValue + * The default is `20` milliseconds. + */ + advanceTimeDelta?: number; + /** + * Forwards clear timer calls to native functions if they are not fakes. + * These are not cleared by default, leading to potentially unexpected behavior + * if timers existed prior to installing fake timers. + * + * @defaultValue + * The default is `false`. + */ + shouldClearNativeTimers?: boolean; +}; + +export type TimersConfig = LegacyTimersConfig | ModernTimersConfig; export type HasteConfig = { /** Whether to hash files using SHA-1. */ @@ -112,7 +209,7 @@ export type DefaultOptions = { testRegex: Array; testRunner: string; testSequencer: string; - timers: Timers; + timers: TimersConfig; transformIgnorePatterns: Array; useStderr: boolean; watch: boolean; @@ -241,7 +338,7 @@ export type InitialOptions = Partial<{ testRunner: string; testSequencer: string; testTimeout: number; - timers: Timers; + timers: TimersConfig; transform: { [regex: string]: string | TransformerConfig; }; @@ -401,7 +498,7 @@ export type ProjectConfig = { testPathIgnorePatterns: Array; testRegex: Array; testRunner: string; - timers: Timers; + timers: TimersConfig; transform: Array<[string, string, Record]>; transformIgnorePatterns: Array; watchPathIgnorePatterns: Array; diff --git a/packages/jest-worker/src/workers/__tests__/processChild.test.js b/packages/jest-worker/src/workers/__tests__/processChild.test.js index ba579e052efe..55b29107bdf7 100644 --- a/packages/jest-worker/src/workers/__tests__/processChild.test.js +++ b/packages/jest-worker/src/workers/__tests__/processChild.test.js @@ -241,8 +241,6 @@ it('returns results immediately when function is synchronous', () => { }); it('returns results when it gets resolved if function is asynchronous', async () => { - jest.useRealTimers(); - process.emit('message', [ CHILD_MESSAGE_INITIALIZE, true, // Not really used here, but for flow type purity. diff --git a/packages/jest-worker/src/workers/__tests__/threadChild.test.js b/packages/jest-worker/src/workers/__tests__/threadChild.test.js index 657ce23a33bb..fe0107a926f2 100644 --- a/packages/jest-worker/src/workers/__tests__/threadChild.test.js +++ b/packages/jest-worker/src/workers/__tests__/threadChild.test.js @@ -268,8 +268,6 @@ it('returns results immediately when function is synchronous', () => { }); it('returns results when it gets resolved if function is asynchronous', async () => { - jest.useRealTimers(); - thread.emit('message', [ CHILD_MESSAGE_INITIALIZE, true, // Not really used here, but for flow type purity. diff --git a/packages/test-utils/src/config.ts b/packages/test-utils/src/config.ts index f86bbd3f0c65..3b9ac8475a8d 100644 --- a/packages/test-utils/src/config.ts +++ b/packages/test-utils/src/config.ts @@ -116,7 +116,7 @@ const DEFAULT_PROJECT_CONFIG: Config.ProjectConfig = { testPathIgnorePatterns: [], testRegex: ['\\.test\\.js$'], testRunner: 'jest-circus/runner', - timers: 'real', + timers: {}, transform: [], transformIgnorePatterns: [], unmockedModulePathPatterns: undefined, diff --git a/yarn.lock b/yarn.lock index f0cfc2e76ffc..32787aac7539 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2650,6 +2650,7 @@ __metadata: version: 0.0.0-use.local resolution: "@jest/fake-timers@workspace:packages/jest-fake-timers" dependencies: + "@jest/test-utils": ^28.0.0-alpha.7 "@jest/types": ^28.0.0-alpha.7 "@sinonjs/fake-timers": ^9.1.1 "@types/node": "*" From 344fda72393d534bab7bd708722799ee182dae39 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Sat, 12 Mar 2022 20:33:38 +0200 Subject: [PATCH 02/69] name `timersConfig` consistently --- packages/jest-environment/src/index.ts | 2 +- packages/jest-runtime/src/index.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/jest-environment/src/index.ts b/packages/jest-environment/src/index.ts index bc01dfb717f6..a8509be7bf1d 100644 --- a/packages/jest-environment/src/index.ts +++ b/packages/jest-environment/src/index.ts @@ -304,7 +304,7 @@ export interface Jest { /** * Instructs Jest to use fake versions of the standard timer functions. */ - useFakeTimers(config?: Config.TimersConfig): Jest; + useFakeTimers(timersConfig?: Config.TimersConfig): Jest; /** * Instructs Jest to use the real versions of the standard timer functions. */ diff --git a/packages/jest-runtime/src/index.ts b/packages/jest-runtime/src/index.ts index 4224af580f96..2d880d753dde 100644 --- a/packages/jest-runtime/src/index.ts +++ b/packages/jest-runtime/src/index.ts @@ -2065,13 +2065,13 @@ export default class Runtime { return this._fakeTimersImplementation!; }; - const useFakeTimers: Jest['useFakeTimers'] = config => { - if (config?.strategy === 'legacy') { + const useFakeTimers: Jest['useFakeTimers'] = timersConfig => { + if (timersConfig?.strategy === 'legacy') { this._fakeTimersImplementation = this._environment.fakeTimers; } else { this._fakeTimersImplementation = this._environment.fakeTimersModern; } - this._fakeTimersImplementation!.useFakeTimers(config); + this._fakeTimersImplementation!.useFakeTimers(timersConfig); return jestObject; }; const useRealTimers = () => { From c42e93dd1668029e443e71ed50aaf7048fce4898 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Sat, 12 Mar 2022 21:06:50 +0200 Subject: [PATCH 03/69] tweak defaults --- .../__snapshots__/showConfig.test.ts.snap | 4 ++- .../__tests__/__snapshots__/init.test.js.snap | 4 ++- packages/jest-config/src/Defaults.ts | 2 +- .../logDebugMessages.test.ts.snap | 4 ++- .../jest-fake-timers/src/modernFakeTimers.ts | 1 - .../ScriptTransformer.test.ts.snap | 28 +++++++++++-------- packages/test-utils/src/config.ts | 2 +- 7 files changed, 28 insertions(+), 17 deletions(-) diff --git a/e2e/__tests__/__snapshots__/showConfig.test.ts.snap b/e2e/__tests__/__snapshots__/showConfig.test.ts.snap index e08e1c804615..0a8092aa98bb 100644 --- a/e2e/__tests__/__snapshots__/showConfig.test.ts.snap +++ b/e2e/__tests__/__snapshots__/showConfig.test.ts.snap @@ -66,7 +66,9 @@ exports[`--showConfig outputs config info and exits 1`] = ` ], "testRegex": [], "testRunner": "<>/jest-circus/runner.js", - "timers": {}, + "timers": { + "loopLimit": 100000 + }, "transform": [ [ "\\\\.[jt]sx?$", diff --git a/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap b/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap index 2151a310bc4d..40a7fb053842 100644 --- a/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap +++ b/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap @@ -284,7 +284,9 @@ module.exports = { // testRunner: "jest-circus/runner", // Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout" - // timers: {}, + // timers: { + // "loopLimit": 100000 + // }, // A map from regular expressions to paths to transformers // transform: undefined, diff --git a/packages/jest-config/src/Defaults.ts b/packages/jest-config/src/Defaults.ts index 89be51afd672..b03ccc0e890c 100644 --- a/packages/jest-config/src/Defaults.ts +++ b/packages/jest-config/src/Defaults.ts @@ -72,7 +72,7 @@ const defaultOptions: Config.DefaultOptions = { testRegex: [], testRunner: 'jest-circus/runner', testSequencer: '@jest/test-sequencer', - timers: {}, + timers: {loopLimit: 100_000}, transformIgnorePatterns: [NODE_MODULES_REGEXP, `\\.pnp\\.[^\\${sep}]+$`], useStderr: false, watch: false, diff --git a/packages/jest-core/src/lib/__tests__/__snapshots__/logDebugMessages.test.ts.snap b/packages/jest-core/src/lib/__tests__/__snapshots__/logDebugMessages.test.ts.snap index 3c0dbeb0504b..839de10eb350 100644 --- a/packages/jest-core/src/lib/__tests__/__snapshots__/logDebugMessages.test.ts.snap +++ b/packages/jest-core/src/lib/__tests__/__snapshots__/logDebugMessages.test.ts.snap @@ -52,7 +52,9 @@ exports[`prints the config object 1`] = ` "\\\\.test\\\\.js$" ], "testRunner": "myRunner", - "timers": {}, + "timers": { + "loopLimit": 100000 + }, "transform": [], "transformIgnorePatterns": [], "watchPathIgnorePatterns": [] diff --git a/packages/jest-fake-timers/src/modernFakeTimers.ts b/packages/jest-fake-timers/src/modernFakeTimers.ts index 01262b536e41..26156a4984e1 100644 --- a/packages/jest-fake-timers/src/modernFakeTimers.ts +++ b/packages/jest-fake-timers/src/modernFakeTimers.ts @@ -98,7 +98,6 @@ export default class FakeTimers { >; const resolvedTimersConfig: SinonTimersConfig = { - loopLimit: 100_000, now: Date.now(), toFake, ...this._config.timers, diff --git a/packages/jest-transform/src/__tests__/__snapshots__/ScriptTransformer.test.ts.snap b/packages/jest-transform/src/__tests__/__snapshots__/ScriptTransformer.test.ts.snap index f08efe9bca42..a2be1cc8d179 100644 --- a/packages/jest-transform/src/__tests__/__snapshots__/ScriptTransformer.test.ts.snap +++ b/packages/jest-transform/src/__tests__/__snapshots__/ScriptTransformer.test.ts.snap @@ -76,7 +76,9 @@ exports[`ScriptTransformer in async mode, passes expected transform options to g "\\.test\\.js$", ], "testRunner": "jest-circus/runner", - "timers": Object {}, + "timers": Object { + "loopLimit": 100000, + }, "transform": Array [ Array [ "\\.js$", @@ -92,7 +94,7 @@ exports[`ScriptTransformer in async mode, passes expected transform options to g "unmockedModulePathPatterns": undefined, "watchPathIgnorePatterns": Array [], }, - "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{},"transform":[["\\\\.js$","test_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", + "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"loopLimit":100000},"transform":[["\\\\.js$","test_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", "coverageProvider": "babel", "instrument": true, "supportsDynamicImport": false, @@ -118,7 +120,7 @@ exports[`ScriptTransformer in async mode, uses the supplied async preprocessor 1 "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{},"transform":[["\\\\.js$","test_async_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_async_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"loopLimit":100000},"transform":[["\\\\.js$","test_async_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"loopLimit\\":100000},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_async_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; @@ -128,7 +130,7 @@ exports[`ScriptTransformer in async mode, uses the supplied preprocessor 1`] = ` "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{},"transform":[["\\\\.js$","test_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"loopLimit":100000},"transform":[["\\\\.js$","test_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"loopLimit\\":100000},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; @@ -207,7 +209,9 @@ exports[`ScriptTransformer passes expected transform options to getCacheKey 1`] "\\.test\\.js$", ], "testRunner": "jest-circus/runner", - "timers": Object {}, + "timers": Object { + "loopLimit": 100000, + }, "transform": Array [ Array [ "\\.js$", @@ -223,7 +227,7 @@ exports[`ScriptTransformer passes expected transform options to getCacheKey 1`] "unmockedModulePathPatterns": undefined, "watchPathIgnorePatterns": Array [], }, - "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{},"transform":[["\\\\.js$","test_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", + "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"loopLimit":100000},"transform":[["\\\\.js$","test_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", "coverageProvider": "babel", "instrument": true, "supportsDynamicImport": false, @@ -312,7 +316,9 @@ exports[`ScriptTransformer passes expected transform options to getCacheKeyAsync "\\.test\\.js$", ], "testRunner": "jest-circus/runner", - "timers": Object {}, + "timers": Object { + "loopLimit": 100000, + }, "transform": Array [ Array [ "\\.js$", @@ -328,7 +334,7 @@ exports[`ScriptTransformer passes expected transform options to getCacheKeyAsync "unmockedModulePathPatterns": undefined, "watchPathIgnorePatterns": Array [], }, - "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{},"transform":[["\\\\.js$","test_async_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", + "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"loopLimit":100000},"transform":[["\\\\.js$","test_async_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", "coverageProvider": "babel", "instrument": true, "supportsDynamicImport": false, @@ -676,7 +682,7 @@ exports[`ScriptTransformer uses mixture of sync/async preprocessors 1`] = ` "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{},"transform":[["\\\\.js$","test_async_preprocessor",{}],["\\\\.css$","css-preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_async_preprocessor\\",{}],[\\"\\\\\\\\.css$\\",\\"css-preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"loopLimit":100000},"transform":[["\\\\.js$","test_async_preprocessor",{}],["\\\\.css$","css-preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"loopLimit\\":100000},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_async_preprocessor\\",{}],[\\"\\\\\\\\.css$\\",\\"css-preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; @@ -693,7 +699,7 @@ exports[`ScriptTransformer uses multiple preprocessors 1`] = ` "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{},"transform":[["\\\\.js$","test_preprocessor",{}],["\\\\.css$","css-preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}],[\\"\\\\\\\\.css$\\",\\"css-preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"loopLimit":100000},"transform":[["\\\\.js$","test_preprocessor",{}],["\\\\.css$","css-preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"loopLimit\\":100000},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}],[\\"\\\\\\\\.css$\\",\\"css-preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; @@ -710,7 +716,7 @@ exports[`ScriptTransformer uses the supplied preprocessor 1`] = ` "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{},"transform":[["\\\\.js$","test_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"loopLimit":100000},"transform":[["\\\\.js$","test_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"loopLimit\\":100000},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; diff --git a/packages/test-utils/src/config.ts b/packages/test-utils/src/config.ts index 3b9ac8475a8d..4f170915a136 100644 --- a/packages/test-utils/src/config.ts +++ b/packages/test-utils/src/config.ts @@ -116,7 +116,7 @@ const DEFAULT_PROJECT_CONFIG: Config.ProjectConfig = { testPathIgnorePatterns: [], testRegex: ['\\.test\\.js$'], testRunner: 'jest-circus/runner', - timers: {}, + timers: {loopLimit: 100_000}, transform: [], transformIgnorePatterns: [], unmockedModulePathPatterns: undefined, From d828b551ec301e3b9807c7134f12915dc0764bcc Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Sat, 12 Mar 2022 21:17:23 +0200 Subject: [PATCH 04/69] tweak error message --- .../src/__tests__/__snapshots__/modernFakeTimers.test.ts.snap | 2 +- packages/jest-fake-timers/src/modernFakeTimers.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/jest-fake-timers/src/__tests__/__snapshots__/modernFakeTimers.test.ts.snap b/packages/jest-fake-timers/src/__tests__/__snapshots__/modernFakeTimers.test.ts.snap index 5d407bdceba6..73a88e4969c3 100644 --- a/packages/jest-fake-timers/src/__tests__/__snapshots__/modernFakeTimers.test.ts.snap +++ b/packages/jest-fake-timers/src/__tests__/__snapshots__/modernFakeTimers.test.ts.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`FakeTimers runAllTimers warns when trying to advance timers while real timers are used 1`] = `"A function to advance timers was called but the timers API is not mocked with fake timers. Call \`jest.useFakeTimers()\` in this test or enable fake timers globally by setting \`"timers": {"strategy": "modern"}\` in the configuration file"`; +exports[`FakeTimers runAllTimers warns when trying to advance timers while real timers are used 1`] = `"A function to advance timers was called but the timers API is not mocked with fake timers. Call \`jest.useFakeTimers()\` in this test or enable fake timers globally using "timers" option in the Jest configuration file"`; diff --git a/packages/jest-fake-timers/src/modernFakeTimers.ts b/packages/jest-fake-timers/src/modernFakeTimers.ts index 26156a4984e1..2b05226766c9 100644 --- a/packages/jest-fake-timers/src/modernFakeTimers.ts +++ b/packages/jest-fake-timers/src/modernFakeTimers.ts @@ -141,8 +141,8 @@ export default class FakeTimers { this._global.console.warn( 'A function to advance timers was called but the timers API is not ' + 'mocked with fake timers. Call `jest.useFakeTimers()` in this test or ' + - 'enable fake timers globally by setting `"timers": {"strategy": "modern"}` ' + - `in the configuration file\nStack Trace:\n${formatStackTrace( + 'enable fake timers globally using "timers" option in the Jest ' + + `configuration file\nStack Trace:\n${formatStackTrace( new Error().stack!, this._config, {noStackTrace: false}, From b6d30db9e1da8aac4f1b6b19eeaa1070e7f49e59 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Sun, 13 Mar 2022 15:45:07 +0200 Subject: [PATCH 05/69] docs --- docs/Configuration.md | 34 ++++++++++--- docs/JestObjectAPI.md | 114 ++++++++++++++++++++++++++++++++++++++---- docs/TimerMocks.md | 6 ++- 3 files changed, 136 insertions(+), 18 deletions(-) diff --git a/docs/Configuration.md b/docs/Configuration.md index 7f9fa35a1b43..2600bbf4e7d8 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -395,6 +395,32 @@ Jest's ESM support is still experimental, see [its docs for more details](ECMASc } ``` +### `fakeTimers` \[object] + +Default: `{}` + +This option allows to configure the implementation of fake timers. For example, fake timers may be useful when a piece of code sets a long timeout that we don't want to wait for in a test. + +Currently you can choose between Modern Fake Timers (default): + +```json +{ + "advanceTimers": true, + "doNotFake": ["nextTick"] +} +``` + +Or Legacy Fake Timers (`"strategy"` must be set explicitly to enable legacy timers): + +```json +{ + "strategy": "legacy", + "loopLimit": 1000 +} +``` + +For the full list of options see [Fake Timers](JestObjectAPI.md#fake-timers) documentation. + ### `forceCoverageMatch` \[array<string>] Default: `['']` @@ -1458,14 +1484,6 @@ Default: `5000` Default timeout of a test in milliseconds. -### `timers` \[string] - -Default: `real` - -Setting this value to `fake` or `modern` enables fake timers for all tests by default. Fake timers are useful when a piece of code sets a long timeout that we don't want to wait for in a test. You can learn more about fake timers [here](JestObjectAPI.md#jestusefaketimersimplementation-modern--legacy). - -If the value is `legacy`, the old implementation will be used as implementation instead of one backed by [`@sinonjs/fake-timers`](https://github.com/sinonjs/fake-timers). - ### `transform` \[object<string, pathToTransformer | \[pathToTransformer, object]>] Default: `{"\\.[jt]sx?$": "babel-jest"}` diff --git a/docs/JestObjectAPI.md b/docs/JestObjectAPI.md index ed99e97fc3d0..324bb7fadc66 100644 --- a/docs/JestObjectAPI.md +++ b/docs/JestObjectAPI.md @@ -628,19 +628,103 @@ test('direct', () => { }); ``` -## Mock Timers +## Fake Timers -### `jest.useFakeTimers(implementation?: 'modern' | 'legacy')` +### `jest.useFakeTimers(fakeTimersConfig?)` -Instructs Jest to use fake versions of the standard timer functions (`setTimeout`, `setInterval`, `clearTimeout`, `clearInterval`, `nextTick`, `setImmediate` and `clearImmediate` as well as `Date`). - -If you pass `'legacy'` as an argument, Jest's legacy implementation will be used rather than one based on [`@sinonjs/fake-timers`](https://github.com/sinonjs/fake-timers). +Instructs Jest to use fake versions of the global date, performance and timers APIs. Currently you can choose between modern (default) or legacy fake timers. Returns the `jest` object for chaining. + +#### Modern Fake Timers + +:::info + +This implementation is backed by [@sinonjs/fake-timers](https://github.com/sinonjs/fake-timers). + +::: + +Modern Fake Timers will swap out `Date` and `performance` objects as well as `queueMicrotask()`, `requestAnimationFrame()`, `cancelAnimationFrame()`, `requestIdleCallback()`, `cancelIdleCallback()`, `setImmediate()`, `clearImmediate()`, `setInterval()`, `clearInterval()`, `setTimeout()`, `clearTimeout()` methods. In node environment `process.hrtime`, `process.nextTick()` will be also replaced. + + +```js +// `strategy` may be omitted if you use modern timers +jest.useFakeTimers({ + doNotFake: ['nextTick'], + now: new Date(1990, 12, 1), + advanceTimers: true +}); +``` + +Configuration options: + +```ts +type FakeableAPIs = + | 'Date' + | 'hrtime' + | 'nextTick' + | 'performance' + | 'queueMicrotask' + | 'requestAnimationFrame' + | 'cancelAnimationFrame' + | 'requestIdleCallback' + | 'cancelIdleCallback' + | 'setImmediate' + | 'clearImmediate' + | 'setInterval' + | 'clearInterval' + | 'setTimeout' + | 'clearTimeout'; + +type ModernFakeTimersConfig = { + /** Strategy to be used for the fake timers. The default is `'modern'`. */ + strategy?: 'modern'; + /** List of names of methods or objects that should not be faked. The default is `[]`. */ + doNotFake?: Array; + /** Maximum number of timers that will be run. The default is `100_000` timers. */ + loopLimit?: number; + /** Sets current system time to be used by fake timers. The default is `Date.now()`. */ + now?: number | Date; + /** + * If set to `true` all timers will be advanced automatically by 20 milliseconds + * every 20 milliseconds. A custom time delta may be provided by passing a number. + * The default is `false`. + */ + advanceTimers?: boolean | number; + /** + * Forwards clear timer calls to native functions if they are not fakes. + * The default is `false`. + */ + shouldClearNativeTimers?: boolean; +}; +``` + +#### Legacy Fake Timers + +Legacy Fake Timers will swap out `requestAnimationFrame()`, `cancelAnimationFrame()`, `setImmediate()`, `clearImmediate()`, `setInterval()`, `clearInterval()`, `setTimeout()`, `clearTimeout()` methods with mock functions. In node environment `process.nextTick()` will be also replaced. + +```js +jest.useFakeTimers({ + strategy: 'legacy', // must be set explicitly to enable legacy timers + loopLimit: 1000 +}); +``` + +Configuration options: + +```ts +type LegacyFakeTimersConfig = { + /** Strategy to be used for the fake timers. The default is `'modern'`. */ + strategy?: 'legacy'; + /** Maximum number of timers that will be run. The default is `100_000` timers. */ + loopLimit?: number; +}; +``` + ### `jest.useRealTimers()` -Instructs Jest to use the real versions of the standard timer functions. +Instructs Jest to use the real versions of the global date, performance and timers APIs. Returns the `jest` object for chaining. @@ -662,7 +746,11 @@ This is often useful for synchronously executing setTimeouts during a test in or Exhausts all tasks queued by `setImmediate()`. -> Note: This function is not available when using modern fake timers implementation +:::note + +This function is only available when using Legacy Fake Timers. + +::: ### `jest.advanceTimersByTime(msToRun)` @@ -696,13 +784,21 @@ Returns the number of fake timers still left to run. Set the current system time used by fake timers. Simulates a user changing the system clock while your program is running. It affects the current time but it does not in itself cause e.g. timers to fire; they will fire exactly as they would have done without the call to `jest.setSystemTime()`. -> Note: This function is only available when using modern fake timers implementation +:::note + +This function is only available when using Modern Fake Timers. + +::: ### `jest.getRealSystemTime()` When mocking time, `Date.now()` will also be mocked. If you for some reason need access to the real current time, you can invoke this function. -> Note: This function is only available when using modern fake timers implementation +:::note + +This function is only available when using Modern Fake Timers. + +::: ## Misc diff --git a/docs/TimerMocks.md b/docs/TimerMocks.md index 6f811abee6b4..c4c041e831ce 100644 --- a/docs/TimerMocks.md +++ b/docs/TimerMocks.md @@ -53,7 +53,11 @@ test('do something with real timers', () => { }); ``` -Currently, two implementations of the fake timers are included - `modern` and `legacy`, where `modern` is the default one. See [configuration](Configuration.md#timers-string) for how to configure it. +:::info + +Currently you can choose between modern (default) or legacy fake timers. For more details see [Fake Timers](JestObjectAPI.md#fake-timers) documentation. + +::: ## Run All Timers From 3e487fc2f49a6b7cf64855c2ed9392802e58dee8 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Sun, 13 Mar 2022 15:52:28 +0200 Subject: [PATCH 06/69] add note on "strategy" --- docs/Configuration.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/Configuration.md b/docs/Configuration.md index 2600bbf4e7d8..cf5b537fba62 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -405,12 +405,12 @@ Currently you can choose between Modern Fake Timers (default): ```json { - "advanceTimers": true, + "strategy": "modern", "doNotFake": ["nextTick"] } ``` -Or Legacy Fake Timers (`"strategy"` must be set explicitly to enable legacy timers): +Or Legacy Fake Timers: ```json { @@ -419,6 +419,12 @@ Or Legacy Fake Timers (`"strategy"` must be set explicitly to enable legacy time } ``` +:::note + +`"strategy"` must be included in the object to enable fake timers. + +::: + For the full list of options see [Fake Timers](JestObjectAPI.md#fake-timers) documentation. ### `forceCoverageMatch` \[array<string>] From fa2c75f29ceec05508ad43dbe23921562941b01a Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Sun, 13 Mar 2022 16:02:36 +0200 Subject: [PATCH 07/69] add example lines --- docs/JestObjectAPI.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/JestObjectAPI.md b/docs/JestObjectAPI.md index 324bb7fadc66..9f911f6c752d 100644 --- a/docs/JestObjectAPI.md +++ b/docs/JestObjectAPI.md @@ -647,6 +647,7 @@ This implementation is backed by [@sinonjs/fake-timers](https://github.com/sinon Modern Fake Timers will swap out `Date` and `performance` objects as well as `queueMicrotask()`, `requestAnimationFrame()`, `cancelAnimationFrame()`, `requestIdleCallback()`, `cancelIdleCallback()`, `setImmediate()`, `clearImmediate()`, `setInterval()`, `clearInterval()`, `setTimeout()`, `clearTimeout()` methods. In node environment `process.hrtime`, `process.nextTick()` will be also replaced. +Example: ```js // `strategy` may be omitted if you use modern timers @@ -704,6 +705,8 @@ type ModernFakeTimersConfig = { Legacy Fake Timers will swap out `requestAnimationFrame()`, `cancelAnimationFrame()`, `setImmediate()`, `clearImmediate()`, `setInterval()`, `clearInterval()`, `setTimeout()`, `clearTimeout()` methods with mock functions. In node environment `process.nextTick()` will be also replaced. +Example: + ```js jest.useFakeTimers({ strategy: 'legacy', // must be set explicitly to enable legacy timers From f480a6eac2457a4cfb9339494dc15a92e9ab3633 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Sun, 13 Mar 2022 16:43:12 +0200 Subject: [PATCH 08/69] prettier --- docs/JestObjectAPI.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/docs/JestObjectAPI.md b/docs/JestObjectAPI.md index 9f911f6c752d..f7cd4f0e3f87 100644 --- a/docs/JestObjectAPI.md +++ b/docs/JestObjectAPI.md @@ -636,7 +636,6 @@ Instructs Jest to use fake versions of the global date, performance and timers A Returns the `jest` object for chaining. - #### Modern Fake Timers :::info @@ -654,7 +653,7 @@ Example: jest.useFakeTimers({ doNotFake: ['nextTick'], now: new Date(1990, 12, 1), - advanceTimers: true + advanceTimers: true, }); ``` @@ -687,14 +686,14 @@ type ModernFakeTimersConfig = { loopLimit?: number; /** Sets current system time to be used by fake timers. The default is `Date.now()`. */ now?: number | Date; - /** - * If set to `true` all timers will be advanced automatically by 20 milliseconds + /** + * If set to `true` all timers will be advanced automatically by 20 milliseconds * every 20 milliseconds. A custom time delta may be provided by passing a number. * The default is `false`. */ advanceTimers?: boolean | number; - /** - * Forwards clear timer calls to native functions if they are not fakes. + /** + * Forwards clear timer calls to native functions if they are not fakes. * The default is `false`. */ shouldClearNativeTimers?: boolean; @@ -710,7 +709,7 @@ Example: ```js jest.useFakeTimers({ strategy: 'legacy', // must be set explicitly to enable legacy timers - loopLimit: 1000 + loopLimit: 1000, }); ``` From 44fffd8c962a286229da58cf7689e08d2a1c891d Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Sun, 13 Mar 2022 17:15:30 +0200 Subject: [PATCH 09/69] rename `timerLimit` --- docs/Configuration.md | 2 +- docs/JestObjectAPI.md | 6 ++-- .../__snapshots__/showConfig.test.ts.snap | 2 +- .../__tests__/__snapshots__/init.test.js.snap | 2 +- packages/jest-config/src/Defaults.ts | 2 +- packages/jest-config/src/ValidConfig.ts | 4 +-- .../logDebugMessages.test.ts.snap | 2 +- .../src/__tests__/modernFakeTimers.test.ts | 4 +-- .../jest-fake-timers/src/modernFakeTimers.ts | 18 ++++++---- .../ScriptTransformer.test.ts.snap | 22 ++++++------ .../jest-types/__typetests__/jest.test.ts | 4 +-- packages/jest-types/src/Config.ts | 34 +++++++++---------- packages/test-utils/src/config.ts | 2 +- 13 files changed, 54 insertions(+), 50 deletions(-) diff --git a/docs/Configuration.md b/docs/Configuration.md index cf5b537fba62..d6d5ffbbbef9 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -415,7 +415,7 @@ Or Legacy Fake Timers: ```json { "strategy": "legacy", - "loopLimit": 1000 + "timerLimit": 1000 } ``` diff --git a/docs/JestObjectAPI.md b/docs/JestObjectAPI.md index f7cd4f0e3f87..6d599845591d 100644 --- a/docs/JestObjectAPI.md +++ b/docs/JestObjectAPI.md @@ -683,7 +683,7 @@ type ModernFakeTimersConfig = { /** List of names of methods or objects that should not be faked. The default is `[]`. */ doNotFake?: Array; /** Maximum number of timers that will be run. The default is `100_000` timers. */ - loopLimit?: number; + timerLimit?: number; /** Sets current system time to be used by fake timers. The default is `Date.now()`. */ now?: number | Date; /** @@ -709,7 +709,7 @@ Example: ```js jest.useFakeTimers({ strategy: 'legacy', // must be set explicitly to enable legacy timers - loopLimit: 1000, + timerLimit: 1000, }); ``` @@ -720,7 +720,7 @@ type LegacyFakeTimersConfig = { /** Strategy to be used for the fake timers. The default is `'modern'`. */ strategy?: 'legacy'; /** Maximum number of timers that will be run. The default is `100_000` timers. */ - loopLimit?: number; + timerLimit?: number; }; ``` diff --git a/e2e/__tests__/__snapshots__/showConfig.test.ts.snap b/e2e/__tests__/__snapshots__/showConfig.test.ts.snap index 0a8092aa98bb..e978b724d35c 100644 --- a/e2e/__tests__/__snapshots__/showConfig.test.ts.snap +++ b/e2e/__tests__/__snapshots__/showConfig.test.ts.snap @@ -67,7 +67,7 @@ exports[`--showConfig outputs config info and exits 1`] = ` "testRegex": [], "testRunner": "<>/jest-circus/runner.js", "timers": { - "loopLimit": 100000 + "timerLimit": 100000 }, "transform": [ [ diff --git a/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap b/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap index 40a7fb053842..5d3bbc6ec957 100644 --- a/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap +++ b/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap @@ -285,7 +285,7 @@ module.exports = { // Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout" // timers: { - // "loopLimit": 100000 + // "timerLimit": 100000 // }, // A map from regular expressions to paths to transformers diff --git a/packages/jest-config/src/Defaults.ts b/packages/jest-config/src/Defaults.ts index b03ccc0e890c..7677c0c825ff 100644 --- a/packages/jest-config/src/Defaults.ts +++ b/packages/jest-config/src/Defaults.ts @@ -72,7 +72,7 @@ const defaultOptions: Config.DefaultOptions = { testRegex: [], testRunner: 'jest-circus/runner', testSequencer: '@jest/test-sequencer', - timers: {loopLimit: 100_000}, + timers: {timerLimit: 100_000}, transformIgnorePatterns: [NODE_MODULES_REGEXP, `\\.pnp\\.[^\\${sep}]+$`], useStderr: false, watch: false, diff --git a/packages/jest-config/src/ValidConfig.ts b/packages/jest-config/src/ValidConfig.ts index cdc7c9ceb4f5..48e1e5d50f2c 100644 --- a/packages/jest-config/src/ValidConfig.ts +++ b/packages/jest-config/src/ValidConfig.ts @@ -133,14 +133,14 @@ const initialOptions: Config.InitialOptions = { testSequencer: '@jest/test-sequencer', testTimeout: 5000, timers: multipleValidOptions( - {loopLimit: 1000, strategy: 'legacy'} as const, + {strategy: 'legacy', timerLimit: 1000} as const, { advanceTimeDelta: 1000, - loopLimit: 1000, now: multipleValidOptions(0, new Date()), shouldAdvanceTime: false, shouldClearNativeTimers: false, strategy: 'modern', + timerLimit: 1000, toFake: [ 'setImmediate', 'clearImmediate', diff --git a/packages/jest-core/src/lib/__tests__/__snapshots__/logDebugMessages.test.ts.snap b/packages/jest-core/src/lib/__tests__/__snapshots__/logDebugMessages.test.ts.snap index 839de10eb350..f3f82d019e63 100644 --- a/packages/jest-core/src/lib/__tests__/__snapshots__/logDebugMessages.test.ts.snap +++ b/packages/jest-core/src/lib/__tests__/__snapshots__/logDebugMessages.test.ts.snap @@ -53,7 +53,7 @@ exports[`prints the config object 1`] = ` ], "testRunner": "myRunner", "timers": { - "loopLimit": 100000 + "timerLimit": 100000 }, "transform": [], "transformIgnorePatterns": [], diff --git a/packages/jest-fake-timers/src/__tests__/modernFakeTimers.test.ts b/packages/jest-fake-timers/src/__tests__/modernFakeTimers.test.ts index 7fe690989293..5facabc8041c 100644 --- a/packages/jest-fake-timers/src/__tests__/modernFakeTimers.test.ts +++ b/packages/jest-fake-timers/src/__tests__/modernFakeTimers.test.ts @@ -189,7 +189,7 @@ describe('FakeTimers', () => { } as unknown as typeof globalThis; const timers = new FakeTimers({ - config: makeProjectConfig({timers: {loopLimit: 100}}), + config: makeProjectConfig({timers: {timerLimit: 100}}), global, }); @@ -346,7 +346,7 @@ describe('FakeTimers', () => { setTimeout, } as unknown as typeof globalThis; const timers = new FakeTimers({ - config: makeProjectConfig({timers: {loopLimit: 1000}}), + config: makeProjectConfig({timers: {timerLimit: 1000}}), global, }); timers.useFakeTimers(); diff --git a/packages/jest-fake-timers/src/modernFakeTimers.ts b/packages/jest-fake-timers/src/modernFakeTimers.ts index 2b05226766c9..c11e89630667 100644 --- a/packages/jest-fake-timers/src/modernFakeTimers.ts +++ b/packages/jest-fake-timers/src/modernFakeTimers.ts @@ -8,7 +8,6 @@ import { FakeTimerWithContext, InstalledClock, - FakeTimerInstallOpts as SinonTimersConfig, withGlobal, } from '@sinonjs/fake-timers'; import type {Config} from '@jest/types'; @@ -91,20 +90,27 @@ export default class FakeTimers { } } - useFakeTimers(timersConfig?: SinonTimersConfig): void { + useFakeTimers(timersConfig?: Config.TimersConfig): void { if (!this._fakingTime) { const toFake = Object.keys(this._fakeTimers.timers) as Array< keyof FakeTimerWithContext['timers'] >; - const resolvedTimersConfig: SinonTimersConfig = { + const resolvedTimersConfig = { now: Date.now(), toFake, ...this._config.timers, ...timersConfig, - }; - - this._clock = this._fakeTimers.install(resolvedTimersConfig); + } as Config.ModernTimersConfig; + + this._clock = this._fakeTimers.install({ + advanceTimeDelta: resolvedTimersConfig.advanceTimeDelta, + loopLimit: resolvedTimersConfig.timerLimit, + now: resolvedTimersConfig.now, + shouldAdvanceTime: resolvedTimersConfig.shouldAdvanceTime, + shouldClearNativeTimers: resolvedTimersConfig.shouldClearNativeTimers, + toFake: resolvedTimersConfig.toFake, + }); this._fakingTime = true; } diff --git a/packages/jest-transform/src/__tests__/__snapshots__/ScriptTransformer.test.ts.snap b/packages/jest-transform/src/__tests__/__snapshots__/ScriptTransformer.test.ts.snap index a2be1cc8d179..87d2a0b8d591 100644 --- a/packages/jest-transform/src/__tests__/__snapshots__/ScriptTransformer.test.ts.snap +++ b/packages/jest-transform/src/__tests__/__snapshots__/ScriptTransformer.test.ts.snap @@ -77,7 +77,7 @@ exports[`ScriptTransformer in async mode, passes expected transform options to g ], "testRunner": "jest-circus/runner", "timers": Object { - "loopLimit": 100000, + "timerLimit": 100000, }, "transform": Array [ Array [ @@ -94,7 +94,7 @@ exports[`ScriptTransformer in async mode, passes expected transform options to g "unmockedModulePathPatterns": undefined, "watchPathIgnorePatterns": Array [], }, - "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"loopLimit":100000},"transform":[["\\\\.js$","test_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", + "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"timerLimit":100000},"transform":[["\\\\.js$","test_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", "coverageProvider": "babel", "instrument": true, "supportsDynamicImport": false, @@ -120,7 +120,7 @@ exports[`ScriptTransformer in async mode, uses the supplied async preprocessor 1 "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"loopLimit":100000},"transform":[["\\\\.js$","test_async_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"loopLimit\\":100000},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_async_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"timerLimit":100000},"transform":[["\\\\.js$","test_async_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"timerLimit\\":100000},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_async_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; @@ -130,7 +130,7 @@ exports[`ScriptTransformer in async mode, uses the supplied preprocessor 1`] = ` "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"loopLimit":100000},"transform":[["\\\\.js$","test_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"loopLimit\\":100000},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"timerLimit":100000},"transform":[["\\\\.js$","test_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"timerLimit\\":100000},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; @@ -210,7 +210,7 @@ exports[`ScriptTransformer passes expected transform options to getCacheKey 1`] ], "testRunner": "jest-circus/runner", "timers": Object { - "loopLimit": 100000, + "timerLimit": 100000, }, "transform": Array [ Array [ @@ -227,7 +227,7 @@ exports[`ScriptTransformer passes expected transform options to getCacheKey 1`] "unmockedModulePathPatterns": undefined, "watchPathIgnorePatterns": Array [], }, - "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"loopLimit":100000},"transform":[["\\\\.js$","test_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", + "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"timerLimit":100000},"transform":[["\\\\.js$","test_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", "coverageProvider": "babel", "instrument": true, "supportsDynamicImport": false, @@ -317,7 +317,7 @@ exports[`ScriptTransformer passes expected transform options to getCacheKeyAsync ], "testRunner": "jest-circus/runner", "timers": Object { - "loopLimit": 100000, + "timerLimit": 100000, }, "transform": Array [ Array [ @@ -334,7 +334,7 @@ exports[`ScriptTransformer passes expected transform options to getCacheKeyAsync "unmockedModulePathPatterns": undefined, "watchPathIgnorePatterns": Array [], }, - "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"loopLimit":100000},"transform":[["\\\\.js$","test_async_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", + "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"timerLimit":100000},"transform":[["\\\\.js$","test_async_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", "coverageProvider": "babel", "instrument": true, "supportsDynamicImport": false, @@ -682,7 +682,7 @@ exports[`ScriptTransformer uses mixture of sync/async preprocessors 1`] = ` "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"loopLimit":100000},"transform":[["\\\\.js$","test_async_preprocessor",{}],["\\\\.css$","css-preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"loopLimit\\":100000},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_async_preprocessor\\",{}],[\\"\\\\\\\\.css$\\",\\"css-preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"timerLimit":100000},"transform":[["\\\\.js$","test_async_preprocessor",{}],["\\\\.css$","css-preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"timerLimit\\":100000},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_async_preprocessor\\",{}],[\\"\\\\\\\\.css$\\",\\"css-preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; @@ -699,7 +699,7 @@ exports[`ScriptTransformer uses multiple preprocessors 1`] = ` "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"loopLimit":100000},"transform":[["\\\\.js$","test_preprocessor",{}],["\\\\.css$","css-preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"loopLimit\\":100000},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}],[\\"\\\\\\\\.css$\\",\\"css-preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"timerLimit":100000},"transform":[["\\\\.js$","test_preprocessor",{}],["\\\\.css$","css-preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"timerLimit\\":100000},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}],[\\"\\\\\\\\.css$\\",\\"css-preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; @@ -716,7 +716,7 @@ exports[`ScriptTransformer uses the supplied preprocessor 1`] = ` "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"loopLimit":100000},"transform":[["\\\\.js$","test_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"loopLimit\\":100000},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"timerLimit":100000},"transform":[["\\\\.js$","test_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"timerLimit\\":100000},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; diff --git a/packages/jest-types/__typetests__/jest.test.ts b/packages/jest-types/__typetests__/jest.test.ts index ede89db79faf..f43cc301920b 100644 --- a/packages/jest-types/__typetests__/jest.test.ts +++ b/packages/jest-types/__typetests__/jest.test.ts @@ -248,7 +248,7 @@ expectError(jest.setSystemTime('1995-12-17T03:24:00')); expectType(jest.useFakeTimers()); expectType(jest.useFakeTimers({strategy: 'modern'})); -expectType(jest.useFakeTimers({loopLimit: 1000})); +expectType(jest.useFakeTimers({timerLimit: 1000})); expectType(jest.useFakeTimers({now: 1483228800000})); expectType(jest.useFakeTimers({now: Date.now()})); expectType(jest.useFakeTimers({now: new Date(1995, 11, 17)})); @@ -278,7 +278,7 @@ expectType( expectType(jest.useFakeTimers({strategy: 'legacy'})); expectType( - jest.useFakeTimers({loopLimit: 1000, strategy: 'legacy'}), + jest.useFakeTimers({strategy: 'legacy', timerLimit: 1000}), ); expectError(jest.useFakeTimers('modern')); diff --git a/packages/jest-types/src/Config.ts b/packages/jest-types/src/Config.ts index 14e8d099f5dd..50d68fe79b6f 100644 --- a/packages/jest-types/src/Config.ts +++ b/packages/jest-types/src/Config.ts @@ -13,43 +13,42 @@ import type {SnapshotFormat} from '@jest/schemas'; type CoverageProvider = 'babel' | 'v8'; export type FakeableTimerAPIs = + | 'Date' + | 'hrtime' + | 'nextTick' + | 'performance' + // | 'queueMicrotask' + | 'requestAnimationFrame' + | 'cancelAnimationFrame' + | 'requestIdleCallback' + | 'cancelIdleCallback' | 'setImmediate' | 'clearImmediate' | 'setInterval' | 'clearInterval' | 'setTimeout' - | 'clearTimeout' - | 'requestAnimationFrame' - | 'cancelAnimationFrame' - | 'requestIdleCallback' - | 'cancelIdleCallback' - | 'Date' - | 'hrtime' - | 'nextTick' - | 'performance'; -// | 'queueMicrotask'; // ? + | 'clearTimeout'; export type LegacyTimersConfig = { /** - * The strategy to be use for the fake timers. + * The strategy to be used for the fake timers. * * @defaultValue * The default is `'modern'`. */ strategy?: 'legacy'; /** - * The maximum number of timers that will be run when calling `jest.advanceTimersByTime()`, - * `jest.runAllImmediates()`, `jest.runAllTicks()` or `jest.runAllTimers()`. + * The maximum number of timers that will be run when calling `jest.runAllTimers()`. * * @defaultValue * The default is `100_000` timers. */ - loopLimit?: number; + timerLimit?: number; }; export type ModernTimersConfig = { /** - * The strategy to be use for the fake timers. + * The strategy to be used for the fake timers. * * @defaultValue * The default is `'modern'`. @@ -74,13 +73,12 @@ export type ModernTimersConfig = { */ toFake?: Array; /** - * The maximum number of timers that will be run when calling `jest.advanceTimersByTime()`, - * `jest.runAllTicks()` or `jest.runAllTimers()`. + * The maximum number of timers that will be run when calling `jest.runAllTimers()`. * * @defaultValue * The default is `100_000` timers. */ - loopLimit?: number; + timerLimit?: number; /** * Whether to increment mocked time automatically based on the real system time * shift. If `shouldAdvanceTime` is not set, the mocked time will be incremented diff --git a/packages/test-utils/src/config.ts b/packages/test-utils/src/config.ts index 4f170915a136..d9cc5eef6780 100644 --- a/packages/test-utils/src/config.ts +++ b/packages/test-utils/src/config.ts @@ -116,7 +116,7 @@ const DEFAULT_PROJECT_CONFIG: Config.ProjectConfig = { testPathIgnorePatterns: [], testRegex: ['\\.test\\.js$'], testRunner: 'jest-circus/runner', - timers: {loopLimit: 100_000}, + timers: {timerLimit: 100_000}, transform: [], transformIgnorePatterns: [], unmockedModulePathPatterns: undefined, From 39b27f9f56a1a0a5e04872628f0a575291dfacb2 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Sun, 13 Mar 2022 17:22:20 +0200 Subject: [PATCH 10/69] rename `fakeTimersConfig` and `FakeTimersConfig` --- packages/jest-environment/src/index.ts | 2 +- packages/jest-fake-timers/src/modernFakeTimers.ts | 6 +++--- packages/jest-types/src/Config.ts | 12 ++++++------ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/jest-environment/src/index.ts b/packages/jest-environment/src/index.ts index a8509be7bf1d..d45ffffb7c78 100644 --- a/packages/jest-environment/src/index.ts +++ b/packages/jest-environment/src/index.ts @@ -304,7 +304,7 @@ export interface Jest { /** * Instructs Jest to use fake versions of the standard timer functions. */ - useFakeTimers(timersConfig?: Config.TimersConfig): Jest; + useFakeTimers(fakeTimersConfig?: Config.FakeTimersConfig): Jest; /** * Instructs Jest to use the real versions of the standard timer functions. */ diff --git a/packages/jest-fake-timers/src/modernFakeTimers.ts b/packages/jest-fake-timers/src/modernFakeTimers.ts index c11e89630667..e67f6280b32d 100644 --- a/packages/jest-fake-timers/src/modernFakeTimers.ts +++ b/packages/jest-fake-timers/src/modernFakeTimers.ts @@ -90,7 +90,7 @@ export default class FakeTimers { } } - useFakeTimers(timersConfig?: Config.TimersConfig): void { + useFakeTimers(fakeTimersConfig?: Config.FakeTimersConfig): void { if (!this._fakingTime) { const toFake = Object.keys(this._fakeTimers.timers) as Array< keyof FakeTimerWithContext['timers'] @@ -100,8 +100,8 @@ export default class FakeTimers { now: Date.now(), toFake, ...this._config.timers, - ...timersConfig, - } as Config.ModernTimersConfig; + ...fakeTimersConfig, + } as Config.ModernFakeTimersConfig; this._clock = this._fakeTimers.install({ advanceTimeDelta: resolvedTimersConfig.advanceTimeDelta, diff --git a/packages/jest-types/src/Config.ts b/packages/jest-types/src/Config.ts index 50d68fe79b6f..925822418dff 100644 --- a/packages/jest-types/src/Config.ts +++ b/packages/jest-types/src/Config.ts @@ -29,7 +29,7 @@ export type FakeableTimerAPIs = | 'setTimeout' | 'clearTimeout'; -export type LegacyTimersConfig = { +export type LegacyFakeTimersConfig = { /** * The strategy to be used for the fake timers. * @@ -46,7 +46,7 @@ export type LegacyTimersConfig = { timerLimit?: number; }; -export type ModernTimersConfig = { +export type ModernFakeTimersConfig = { /** * The strategy to be used for the fake timers. * @@ -107,7 +107,7 @@ export type ModernTimersConfig = { shouldClearNativeTimers?: boolean; }; -export type TimersConfig = LegacyTimersConfig | ModernTimersConfig; +export type FakeTimersConfig = LegacyFakeTimersConfig | ModernFakeTimersConfig; export type HasteConfig = { /** Whether to hash files using SHA-1. */ @@ -207,7 +207,7 @@ export type DefaultOptions = { testRegex: Array; testRunner: string; testSequencer: string; - timers: TimersConfig; + timers: FakeTimersConfig; transformIgnorePatterns: Array; useStderr: boolean; watch: boolean; @@ -336,7 +336,7 @@ export type InitialOptions = Partial<{ testRunner: string; testSequencer: string; testTimeout: number; - timers: TimersConfig; + timers: FakeTimersConfig; transform: { [regex: string]: string | TransformerConfig; }; @@ -496,7 +496,7 @@ export type ProjectConfig = { testPathIgnorePatterns: Array; testRegex: Array; testRunner: string; - timers: TimersConfig; + timers: FakeTimersConfig; transform: Array<[string, string, Record]>; transformIgnorePatterns: Array; watchPathIgnorePatterns: Array; From e4b0dc093852a7052a93b91be1422bb657441a36 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Sun, 13 Mar 2022 19:04:50 +0200 Subject: [PATCH 11/69] rethinking API --- docs/Configuration.md | 68 ++++++++++++++++++++++++++++++++++--------- docs/JestObjectAPI.md | 31 +++++--------------- 2 files changed, 62 insertions(+), 37 deletions(-) diff --git a/docs/Configuration.md b/docs/Configuration.md index d6d5ffbbbef9..bbc2e90a4a94 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -401,31 +401,71 @@ Default: `{}` This option allows to configure the implementation of fake timers. For example, fake timers may be useful when a piece of code sets a long timeout that we don't want to wait for in a test. -Currently you can choose between Modern Fake Timers (default): +:::info -```json -{ - "strategy": "modern", - "doNotFake": ["nextTick"] -} -``` +Currently you can choose between modern (default) and legacy fake timers. For more details see [Fake Timers](JestObjectAPI.md#fake-timers) documentation. -Or Legacy Fake Timers: +::: + +Here is how you can enable fake timers globally for all tests: ```json { - "strategy": "legacy", - "timerLimit": 1000 + "enableGlobally": true } ``` -:::note +Supported configuration options of Modern Fake Timers: -`"strategy"` must be included in the object to enable fake timers. +```ts +type FakeableAPIs = + | 'Date' + | 'hrtime' + | 'nextTick' + | 'performance' + | 'queueMicrotask' + | 'requestAnimationFrame' + | 'cancelAnimationFrame' + | 'requestIdleCallback' + | 'cancelIdleCallback' + | 'setImmediate' + | 'clearImmediate' + | 'setInterval' + | 'clearInterval' + | 'setTimeout' + | 'clearTimeout'; + +type ModernFakeTimersConfig = { + /** + * If set to `true` all timers will be advanced automatically by 20 milliseconds + * every 20 milliseconds. A custom time delta may be provided by passing a number. + * The default is `false`. + */ + advanceTimers?: boolean | number; + /** List of names of methods or objects that should not be faked. The default is `[]`. */ + doNotFake?: Array; + /** Whether fake timers should be enabled for all tests. The default is `false`. */ + enableGlobally?: boolean; + /** Sets current system time to be used by fake timers. The default is `Date.now()`. */ + now?: number | Date; + /** + * Forwards clear timer calls to native functions if they are not fakes. + * The default is `false`. + */ + shouldClearNativeTimers?: boolean; + /** Maximum number of timers that will be run. The default is `100_000` timers. */ + timerLimit?: number; +}; +``` -::: +If for some reason you have to use legacy implementation, here is how to enable it globally (additional options are not supported): -For the full list of options see [Fake Timers](JestObjectAPI.md#fake-timers) documentation. +```json +{ + "enableGlobally": true, + "legacyFakeTimers": true +} +``` ### `forceCoverageMatch` \[array<string>] diff --git a/docs/JestObjectAPI.md b/docs/JestObjectAPI.md index 6d599845591d..1ef20badef4c 100644 --- a/docs/JestObjectAPI.md +++ b/docs/JestObjectAPI.md @@ -649,7 +649,6 @@ Modern Fake Timers will swap out `Date` and `performance` objects as well as `qu Example: ```js -// `strategy` may be omitted if you use modern timers jest.useFakeTimers({ doNotFake: ['nextTick'], now: new Date(1990, 12, 1), @@ -678,25 +677,23 @@ type FakeableAPIs = | 'clearTimeout'; type ModernFakeTimersConfig = { - /** Strategy to be used for the fake timers. The default is `'modern'`. */ - strategy?: 'modern'; - /** List of names of methods or objects that should not be faked. The default is `[]`. */ - doNotFake?: Array; - /** Maximum number of timers that will be run. The default is `100_000` timers. */ - timerLimit?: number; - /** Sets current system time to be used by fake timers. The default is `Date.now()`. */ - now?: number | Date; /** * If set to `true` all timers will be advanced automatically by 20 milliseconds * every 20 milliseconds. A custom time delta may be provided by passing a number. * The default is `false`. */ advanceTimers?: boolean | number; + /** List of names of methods or objects that should not be faked. The default is `[]`. */ + doNotFake?: Array; + /** Sets current system time to be used by fake timers. The default is `Date.now()`. */ + now?: number | Date; /** * Forwards clear timer calls to native functions if they are not fakes. * The default is `false`. */ shouldClearNativeTimers?: boolean; + /** Maximum number of timers that will be run. The default is `100_000` timers. */ + timerLimit?: number; }; ``` @@ -704,26 +701,14 @@ type ModernFakeTimersConfig = { Legacy Fake Timers will swap out `requestAnimationFrame()`, `cancelAnimationFrame()`, `setImmediate()`, `clearImmediate()`, `setInterval()`, `clearInterval()`, `setTimeout()`, `clearTimeout()` methods with mock functions. In node environment `process.nextTick()` will be also replaced. -Example: +You can enable legacy timers like this: ```js jest.useFakeTimers({ - strategy: 'legacy', // must be set explicitly to enable legacy timers - timerLimit: 1000, + legacyFakeTimers: true, }); ``` -Configuration options: - -```ts -type LegacyFakeTimersConfig = { - /** Strategy to be used for the fake timers. The default is `'modern'`. */ - strategy?: 'legacy'; - /** Maximum number of timers that will be run. The default is `100_000` timers. */ - timerLimit?: number; -}; -``` - ### `jest.useRealTimers()` Instructs Jest to use the real versions of the global date, performance and timers APIs. From 4ccc5bb276d5191b2f140761493bb54fef991aa4 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Mon, 14 Mar 2022 08:32:30 +0200 Subject: [PATCH 12/69] implement `enableGlobally` and `legacyFakeTimers` --- .../__snapshots__/showConfig.test.ts.snap | 2 +- e2e/fake-promises/asap/package.json | 2 +- e2e/fake-promises/immediate/package.json | 2 +- e2e/fake-time/legacy/from-config/package.json | 2 +- .../legacy/from-jest-object/__tests__/test.js | 4 +- .../requestAnimationFrame/__tests__/test.js | 5 +- e2e/fake-time/modern/from-config/package.json | 2 +- .../from-config/package.json | 2 +- e2e/set-immediate/package.json | 2 +- .../with-reset-mocks/package.json | 2 +- e2e/timer-use-real-timers/package.json | 2 +- .../legacy-code-todo-rewrite/jestAdapter.ts | 12 +++-- packages/jest-cli/src/cli/args.ts | 4 +- .../__tests__/__snapshots__/init.test.js.snap | 4 +- packages/jest-config/src/Defaults.ts | 2 +- packages/jest-config/src/Descriptions.ts | 4 +- packages/jest-config/src/ValidConfig.ts | 54 +++++++++---------- .../logDebugMessages.test.ts.snap | 2 +- packages/jest-environment/src/index.ts | 6 ++- packages/jest-jasmine2/src/index.ts | 10 ++-- packages/jest-runtime/src/index.ts | 17 +++--- .../ScriptTransformer.test.ts.snap | 22 ++++---- .../jest-types/__typetests__/jest.test.ts | 34 ++++++------ packages/jest-types/src/Config.ts | 36 +++++++------ packages/test-utils/src/config.ts | 2 +- 25 files changed, 123 insertions(+), 113 deletions(-) diff --git a/e2e/__tests__/__snapshots__/showConfig.test.ts.snap b/e2e/__tests__/__snapshots__/showConfig.test.ts.snap index e978b724d35c..c0759fbf5988 100644 --- a/e2e/__tests__/__snapshots__/showConfig.test.ts.snap +++ b/e2e/__tests__/__snapshots__/showConfig.test.ts.snap @@ -67,7 +67,7 @@ exports[`--showConfig outputs config info and exits 1`] = ` "testRegex": [], "testRunner": "<>/jest-circus/runner.js", "timers": { - "timerLimit": 100000 + "enableGlobally": false }, "transform": [ [ diff --git a/e2e/fake-promises/asap/package.json b/e2e/fake-promises/asap/package.json index 8592ccefa3ef..26df20b681e2 100644 --- a/e2e/fake-promises/asap/package.json +++ b/e2e/fake-promises/asap/package.json @@ -4,6 +4,6 @@ "/fake-promises" ], "testEnvironment": "node", - "timers": {"strategy": "modern"} + "timers": {"enableGlobally": true} } } diff --git a/e2e/fake-promises/immediate/package.json b/e2e/fake-promises/immediate/package.json index 8592ccefa3ef..26df20b681e2 100644 --- a/e2e/fake-promises/immediate/package.json +++ b/e2e/fake-promises/immediate/package.json @@ -4,6 +4,6 @@ "/fake-promises" ], "testEnvironment": "node", - "timers": {"strategy": "modern"} + "timers": {"enableGlobally": true} } } diff --git a/e2e/fake-time/legacy/from-config/package.json b/e2e/fake-time/legacy/from-config/package.json index 37c77e1275e6..853d36ce76b6 100644 --- a/e2e/fake-time/legacy/from-config/package.json +++ b/e2e/fake-time/legacy/from-config/package.json @@ -1,6 +1,6 @@ { "jest": { "testEnvironment": "node", - "timers": {"strategy": "legacy"} + "timers": {"enableGlobally": true, "legacyFakeTimers": true} } } diff --git a/e2e/fake-time/legacy/from-jest-object/__tests__/test.js b/e2e/fake-time/legacy/from-jest-object/__tests__/test.js index 06ce552135d0..58548cce9177 100644 --- a/e2e/fake-time/legacy/from-jest-object/__tests__/test.js +++ b/e2e/fake-time/legacy/from-jest-object/__tests__/test.js @@ -8,7 +8,9 @@ 'use strict'; test('fake timers', () => { - jest.useFakeTimers({strategy: 'legacy'}); + jest.useFakeTimers({ + legacyFakeTimers: true, + }); expect(() => jest.setSystemTime(0)).toThrow( 'setSystemTime is not available when not using modern timers', diff --git a/e2e/fake-time/legacy/requestAnimationFrame/__tests__/test.js b/e2e/fake-time/legacy/requestAnimationFrame/__tests__/test.js index 4b94d5c9514d..0f2e62ce5ce6 100644 --- a/e2e/fake-time/legacy/requestAnimationFrame/__tests__/test.js +++ b/e2e/fake-time/legacy/requestAnimationFrame/__tests__/test.js @@ -10,7 +10,10 @@ 'use strict'; test('requestAnimationFrame', () => { - jest.useFakeTimers({strategy: 'legacy'}); + jest.useFakeTimers({ + legacyFakeTimers: true, + }); + let frameTimestamp = -1; requestAnimationFrame(timestamp => { frameTimestamp = timestamp; diff --git a/e2e/fake-time/modern/from-config/package.json b/e2e/fake-time/modern/from-config/package.json index 7512977b8010..bccb45e57a44 100644 --- a/e2e/fake-time/modern/from-config/package.json +++ b/e2e/fake-time/modern/from-config/package.json @@ -1,6 +1,6 @@ { "jest": { "testEnvironment": "node", - "timers": {"strategy": "modern"} + "timers": {"enableGlobally": true} } } diff --git a/e2e/modern-fake-timers/from-config/package.json b/e2e/modern-fake-timers/from-config/package.json index 7512977b8010..bccb45e57a44 100644 --- a/e2e/modern-fake-timers/from-config/package.json +++ b/e2e/modern-fake-timers/from-config/package.json @@ -1,6 +1,6 @@ { "jest": { "testEnvironment": "node", - "timers": {"strategy": "modern"} + "timers": {"enableGlobally": true} } } diff --git a/e2e/set-immediate/package.json b/e2e/set-immediate/package.json index 7512977b8010..bccb45e57a44 100644 --- a/e2e/set-immediate/package.json +++ b/e2e/set-immediate/package.json @@ -1,6 +1,6 @@ { "jest": { "testEnvironment": "node", - "timers": {"strategy": "modern"} + "timers": {"enableGlobally": true} } } diff --git a/e2e/timer-reset-mocks/with-reset-mocks/package.json b/e2e/timer-reset-mocks/with-reset-mocks/package.json index bf9c895e1ef3..999d643613f9 100644 --- a/e2e/timer-reset-mocks/with-reset-mocks/package.json +++ b/e2e/timer-reset-mocks/with-reset-mocks/package.json @@ -2,6 +2,6 @@ "jest": { "resetMocks": true, "testEnvironment": "node", - "timers": {"strategy": "modern"} + "timers": {"enableGlobally": true} } } diff --git a/e2e/timer-use-real-timers/package.json b/e2e/timer-use-real-timers/package.json index 7512977b8010..bccb45e57a44 100644 --- a/e2e/timer-use-real-timers/package.json +++ b/e2e/timer-use-real-timers/package.json @@ -1,6 +1,6 @@ { "jest": { "testEnvironment": "node", - "timers": {"strategy": "modern"} + "timers": {"enableGlobally": true} } } 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 f37bb6546e03..84fada79e243 100644 --- a/packages/jest-circus/src/legacy-code-todo-rewrite/jestAdapter.ts +++ b/packages/jest-circus/src/legacy-code-todo-rewrite/jestAdapter.ts @@ -38,11 +38,13 @@ const jestAdapter = async ( testPath, }); - if (config.timers.strategy === 'modern') { - // during setup, this cannot be null (and it's fine to explode if it is) - environment.fakeTimersModern!.useFakeTimers(config.timers); - } else if (config.timers.strategy === 'legacy') { - environment.fakeTimers!.useFakeTimers(); + if (config.timers.enableGlobally) { + if (!config.timers.legacyFakeTimers) { + // during setup, this cannot be null (and it's fine to explode if it is) + environment.fakeTimersModern!.useFakeTimers(); + } else { + environment.fakeTimers!.useFakeTimers(); + } } globals.beforeEach(() => { diff --git a/packages/jest-cli/src/cli/args.ts b/packages/jest-cli/src/cli/args.ts index 57c55a59f129..bd6ec7ae0cc9 100644 --- a/packages/jest-cli/src/cli/args.ts +++ b/packages/jest-cli/src/cli/args.ts @@ -623,9 +623,7 @@ export const options = { type: 'number', }, timers: { - description: - 'Setting this value to fake allows the use of fake timers ' + - 'for functions such as setTimeout.', + description: 'A JSON string with configuration options for fake timers.', type: 'string', }, transform: { diff --git a/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap b/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap index 5d3bbc6ec957..97605e30a0ca 100644 --- a/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap +++ b/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap @@ -283,9 +283,9 @@ module.exports = { // This option allows use of a custom test runner // testRunner: "jest-circus/runner", - // Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout" + // The configuration for fake timers. // timers: { - // "timerLimit": 100000 + // "enableGlobally": false // }, // A map from regular expressions to paths to transformers diff --git a/packages/jest-config/src/Defaults.ts b/packages/jest-config/src/Defaults.ts index 7677c0c825ff..4f6e57d1b819 100644 --- a/packages/jest-config/src/Defaults.ts +++ b/packages/jest-config/src/Defaults.ts @@ -72,7 +72,7 @@ const defaultOptions: Config.DefaultOptions = { testRegex: [], testRunner: 'jest-circus/runner', testSequencer: '@jest/test-sequencer', - timers: {timerLimit: 100_000}, + timers: {enableGlobally: false}, transformIgnorePatterns: [NODE_MODULES_REGEXP, `\\.pnp\\.[^\\${sep}]+$`], useStderr: false, watch: false, diff --git a/packages/jest-config/src/Descriptions.ts b/packages/jest-config/src/Descriptions.ts index 0bcff52ba053..75bad8ddccd5 100644 --- a/packages/jest-config/src/Descriptions.ts +++ b/packages/jest-config/src/Descriptions.ts @@ -84,9 +84,7 @@ const descriptions: {[key in keyof Config.InitialOptions]: string} = { testResultsProcessor: 'This option allows the use of a custom results processor', testRunner: 'This option allows use of a custom test runner', - // TODO - timers: - 'Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout"', + timers: 'The configuration for fake timers.', transform: 'A map from regular expressions to paths to transformers', transformIgnorePatterns: 'An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation', diff --git a/packages/jest-config/src/ValidConfig.ts b/packages/jest-config/src/ValidConfig.ts index 48e1e5d50f2c..ddd9a6a9e38e 100644 --- a/packages/jest-config/src/ValidConfig.ts +++ b/packages/jest-config/src/ValidConfig.ts @@ -132,34 +132,32 @@ const initialOptions: Config.InitialOptions = { testRunner: 'circus', testSequencer: '@jest/test-sequencer', testTimeout: 5000, - timers: multipleValidOptions( - {strategy: 'legacy', timerLimit: 1000} as const, - { - advanceTimeDelta: 1000, - now: multipleValidOptions(0, new Date()), - shouldAdvanceTime: false, - shouldClearNativeTimers: false, - strategy: 'modern', - timerLimit: 1000, - toFake: [ - 'setImmediate', - 'clearImmediate', - 'setInterval', - 'clearInterval', - 'setTimeout', - 'clearTimeout', - 'requestAnimationFrame', - 'cancelAnimationFrame', - 'requestIdleCallback', - 'cancelIdleCallback', - 'Date', - 'hrtime', - 'nextTick', - 'performance', - 'queueMicrotask', // ? - ] as Array, - } as const, - ), + timers: { + advanceTimeDelta: 1000, + enableGlobally: true, + legacyFakeTimers: false, + now: multipleValidOptions(0, new Date()), + shouldAdvanceTime: false, + shouldClearNativeTimers: false, + timerLimit: 1000, + toFake: [ + 'Date', + 'hrtime', + 'nextTick', + 'performance', + // 'queueMicrotask', + 'requestAnimationFrame', + 'cancelAnimationFrame', + 'requestIdleCallback', + 'cancelIdleCallback', + 'setImmediate', + 'clearImmediate', + 'setInterval', + 'clearInterval', + 'setTimeout', + 'clearTimeout', + ], + }, transform: { '\\.js$': '/preprocessor.js', }, diff --git a/packages/jest-core/src/lib/__tests__/__snapshots__/logDebugMessages.test.ts.snap b/packages/jest-core/src/lib/__tests__/__snapshots__/logDebugMessages.test.ts.snap index f3f82d019e63..ba360b2ff815 100644 --- a/packages/jest-core/src/lib/__tests__/__snapshots__/logDebugMessages.test.ts.snap +++ b/packages/jest-core/src/lib/__tests__/__snapshots__/logDebugMessages.test.ts.snap @@ -53,7 +53,7 @@ exports[`prints the config object 1`] = ` ], "testRunner": "myRunner", "timers": { - "timerLimit": 100000 + "enableGlobally": false }, "transform": [], "transformIgnorePatterns": [], diff --git a/packages/jest-environment/src/index.ts b/packages/jest-environment/src/index.ts index d45ffffb7c78..90e9a0e79751 100644 --- a/packages/jest-environment/src/index.ts +++ b/packages/jest-environment/src/index.ts @@ -304,7 +304,11 @@ export interface Jest { /** * Instructs Jest to use fake versions of the standard timer functions. */ - useFakeTimers(fakeTimersConfig?: Config.FakeTimersConfig): Jest; + useFakeTimers( + fakeTimersConfig?: + | Config.LegacyFakeTimersConfig + | Config.ModernFakeTimersConfig, + ): Jest; /** * Instructs Jest to use the real versions of the standard timer functions. */ diff --git a/packages/jest-jasmine2/src/index.ts b/packages/jest-jasmine2/src/index.ts index b6ff009cfda1..6a7928b9a124 100644 --- a/packages/jest-jasmine2/src/index.ts +++ b/packages/jest-jasmine2/src/index.ts @@ -88,10 +88,12 @@ export default async function jasmine2( environment.global.describe.skip = environment.global.xdescribe; environment.global.describe.only = environment.global.fdescribe; - if (config.timers.strategy === 'modern') { - environment.fakeTimersModern!.useFakeTimers(config.timers); - } else if (config.timers.strategy === 'legacy') { - environment.fakeTimers!.useFakeTimers(); + if (config.timers.enableGlobally) { + if (!config.timers.legacyFakeTimers) { + environment.fakeTimersModern!.useFakeTimers(); + } else { + environment.fakeTimers!.useFakeTimers(); + } } env.beforeEach(() => { diff --git a/packages/jest-runtime/src/index.ts b/packages/jest-runtime/src/index.ts index 2d880d753dde..f9d3017920a9 100644 --- a/packages/jest-runtime/src/index.ts +++ b/packages/jest-runtime/src/index.ts @@ -279,10 +279,9 @@ export default class Runtime { this._shouldUnmockTransitiveDependenciesCache = new Map(); this._transitiveShouldMock = new Map(); - this._fakeTimersImplementation = - config.timers.strategy === 'legacy' - ? this._environment.fakeTimers - : this._environment.fakeTimersModern; + this._fakeTimersImplementation = !config.timers.legacyFakeTimers + ? this._environment.fakeTimersModern + : this._environment.fakeTimers; this._unmockList = unmockRegExpCache.get(config); if (!this._unmockList && config.unmockedModulePathPatterns) { @@ -2065,13 +2064,13 @@ export default class Runtime { return this._fakeTimersImplementation!; }; - const useFakeTimers: Jest['useFakeTimers'] = timersConfig => { - if (timersConfig?.strategy === 'legacy') { - this._fakeTimersImplementation = this._environment.fakeTimers; - } else { + const useFakeTimers: Jest['useFakeTimers'] = fakeTimersConfig => { + if (!fakeTimersConfig?.legacyFakeTimers) { this._fakeTimersImplementation = this._environment.fakeTimersModern; + } else { + this._fakeTimersImplementation = this._environment.fakeTimers; } - this._fakeTimersImplementation!.useFakeTimers(timersConfig); + this._fakeTimersImplementation!.useFakeTimers(fakeTimersConfig); return jestObject; }; const useRealTimers = () => { diff --git a/packages/jest-transform/src/__tests__/__snapshots__/ScriptTransformer.test.ts.snap b/packages/jest-transform/src/__tests__/__snapshots__/ScriptTransformer.test.ts.snap index 87d2a0b8d591..fd927c2ce04b 100644 --- a/packages/jest-transform/src/__tests__/__snapshots__/ScriptTransformer.test.ts.snap +++ b/packages/jest-transform/src/__tests__/__snapshots__/ScriptTransformer.test.ts.snap @@ -77,7 +77,7 @@ exports[`ScriptTransformer in async mode, passes expected transform options to g ], "testRunner": "jest-circus/runner", "timers": Object { - "timerLimit": 100000, + "enableGlobally": false, }, "transform": Array [ Array [ @@ -94,7 +94,7 @@ exports[`ScriptTransformer in async mode, passes expected transform options to g "unmockedModulePathPatterns": undefined, "watchPathIgnorePatterns": Array [], }, - "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"timerLimit":100000},"transform":[["\\\\.js$","test_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", + "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"enableGlobally":false},"transform":[["\\\\.js$","test_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", "coverageProvider": "babel", "instrument": true, "supportsDynamicImport": false, @@ -120,7 +120,7 @@ exports[`ScriptTransformer in async mode, uses the supplied async preprocessor 1 "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"timerLimit":100000},"transform":[["\\\\.js$","test_async_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"timerLimit\\":100000},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_async_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"enableGlobally":false},"transform":[["\\\\.js$","test_async_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"enableGlobally\\":false},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_async_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; @@ -130,7 +130,7 @@ exports[`ScriptTransformer in async mode, uses the supplied preprocessor 1`] = ` "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"timerLimit":100000},"transform":[["\\\\.js$","test_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"timerLimit\\":100000},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"enableGlobally":false},"transform":[["\\\\.js$","test_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"enableGlobally\\":false},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; @@ -210,7 +210,7 @@ exports[`ScriptTransformer passes expected transform options to getCacheKey 1`] ], "testRunner": "jest-circus/runner", "timers": Object { - "timerLimit": 100000, + "enableGlobally": false, }, "transform": Array [ Array [ @@ -227,7 +227,7 @@ exports[`ScriptTransformer passes expected transform options to getCacheKey 1`] "unmockedModulePathPatterns": undefined, "watchPathIgnorePatterns": Array [], }, - "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"timerLimit":100000},"transform":[["\\\\.js$","test_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", + "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"enableGlobally":false},"transform":[["\\\\.js$","test_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", "coverageProvider": "babel", "instrument": true, "supportsDynamicImport": false, @@ -317,7 +317,7 @@ exports[`ScriptTransformer passes expected transform options to getCacheKeyAsync ], "testRunner": "jest-circus/runner", "timers": Object { - "timerLimit": 100000, + "enableGlobally": false, }, "transform": Array [ Array [ @@ -334,7 +334,7 @@ exports[`ScriptTransformer passes expected transform options to getCacheKeyAsync "unmockedModulePathPatterns": undefined, "watchPathIgnorePatterns": Array [], }, - "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"timerLimit":100000},"transform":[["\\\\.js$","test_async_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", + "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"enableGlobally":false},"transform":[["\\\\.js$","test_async_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", "coverageProvider": "babel", "instrument": true, "supportsDynamicImport": false, @@ -682,7 +682,7 @@ exports[`ScriptTransformer uses mixture of sync/async preprocessors 1`] = ` "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"timerLimit":100000},"transform":[["\\\\.js$","test_async_preprocessor",{}],["\\\\.css$","css-preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"timerLimit\\":100000},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_async_preprocessor\\",{}],[\\"\\\\\\\\.css$\\",\\"css-preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"enableGlobally":false},"transform":[["\\\\.js$","test_async_preprocessor",{}],["\\\\.css$","css-preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"enableGlobally\\":false},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_async_preprocessor\\",{}],[\\"\\\\\\\\.css$\\",\\"css-preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; @@ -699,7 +699,7 @@ exports[`ScriptTransformer uses multiple preprocessors 1`] = ` "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"timerLimit":100000},"transform":[["\\\\.js$","test_preprocessor",{}],["\\\\.css$","css-preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"timerLimit\\":100000},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}],[\\"\\\\\\\\.css$\\",\\"css-preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"enableGlobally":false},"transform":[["\\\\.js$","test_preprocessor",{}],["\\\\.css$","css-preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"enableGlobally\\":false},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}],[\\"\\\\\\\\.css$\\",\\"css-preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; @@ -716,7 +716,7 @@ exports[`ScriptTransformer uses the supplied preprocessor 1`] = ` "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"timerLimit":100000},"transform":[["\\\\.js$","test_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"timerLimit\\":100000},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"enableGlobally":false},"transform":[["\\\\.js$","test_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"enableGlobally\\":false},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; diff --git a/packages/jest-types/__typetests__/jest.test.ts b/packages/jest-types/__typetests__/jest.test.ts index f43cc301920b..7c120117219e 100644 --- a/packages/jest-types/__typetests__/jest.test.ts +++ b/packages/jest-types/__typetests__/jest.test.ts @@ -43,7 +43,7 @@ expectType( .setTimeout(6000) .unmock('moduleName') .useFakeTimers() - .useFakeTimers({strategy: 'legacy'}) + .useFakeTimers({legacyFakeTimers: true}) .useRealTimers(), ); @@ -247,42 +247,42 @@ expectType(jest.setSystemTime(new Date(1995, 11, 17))); expectError(jest.setSystemTime('1995-12-17T03:24:00')); expectType(jest.useFakeTimers()); -expectType(jest.useFakeTimers({strategy: 'modern'})); -expectType(jest.useFakeTimers({timerLimit: 1000})); +expectType(jest.useFakeTimers({legacyFakeTimers: true})); expectType(jest.useFakeTimers({now: 1483228800000})); expectType(jest.useFakeTimers({now: Date.now()})); expectType(jest.useFakeTimers({now: new Date(1995, 11, 17)})); +expectType(jest.useFakeTimers({timerLimit: 1000})); expectType(jest.useFakeTimers({shouldAdvanceTime: true})); expectType(jest.useFakeTimers({advanceTimeDelta: 10})); expectType(jest.useFakeTimers({shouldClearNativeTimers: false})); +expectType(jest.useFakeTimers({toFake: ['Date']})); expectType( jest.useFakeTimers({ toFake: [ + 'Date', + 'hrtime', + 'nextTick', + 'performance', + // 'queueMicrotask', + 'requestAnimationFrame', + 'cancelAnimationFrame', + 'requestIdleCallback', + 'cancelIdleCallback', 'setImmediate', 'clearImmediate', 'setInterval', 'clearInterval', 'setTimeout', 'clearTimeout', - 'requestAnimationFrame', - 'cancelAnimationFrame', - 'requestIdleCallback', - 'cancelIdleCallback', - 'Date', - 'hrtime', - 'nextTick', - 'performance', ], }), ); - -expectType(jest.useFakeTimers({strategy: 'legacy'})); -expectType( - jest.useFakeTimers({strategy: 'legacy', timerLimit: 1000}), +expectError(jest.useFakeTimers({enableGlobally: true})); +expectError( + jest.useFakeTimers({enableGlobally: true, legacyFakeTimers: false}), ); - +expectError(jest.useFakeTimers({legacyFakeTimers: true, toFake: ['Date']})); expectError(jest.useFakeTimers('modern')); -expectError(jest.useFakeTimers({strategy: 'legacy', toFake: 'Date'})); expectType(jest.useRealTimers()); expectError(jest.useRealTimers(true)); diff --git a/packages/jest-types/src/Config.ts b/packages/jest-types/src/Config.ts index 925822418dff..03755a4bf6a9 100644 --- a/packages/jest-types/src/Config.ts +++ b/packages/jest-types/src/Config.ts @@ -29,31 +29,27 @@ export type FakeableTimerAPIs = | 'setTimeout' | 'clearTimeout'; -export type LegacyFakeTimersConfig = { +export type BaseFakeTimersConfig = { /** - * The strategy to be used for the fake timers. + * Whether fake timers should be enabled for all tests. * * @defaultValue - * The default is `'modern'`. - */ - strategy?: 'legacy'; + * The default is `false`. + * */ + enableGlobally?: boolean; +}; + +export type LegacyFakeTimersConfig = { /** - * The maximum number of timers that will be run when calling `jest.runAllTimers()`. + * Use the old fake timers implementation instead of one backed by `@sinonjs/fake-timers`. * * @defaultValue - * The default is `100_000` timers. + * The default is `'false'`. */ - timerLimit?: number; + legacyFakeTimers?: true; }; export type ModernFakeTimersConfig = { - /** - * The strategy to be used for the fake timers. - * - * @defaultValue - * The default is `'modern'`. - */ - strategy?: 'modern'; /** * Sets the default unix epoch. May be a number (in milliseconds) or a Date object. * @@ -105,9 +101,17 @@ export type ModernFakeTimersConfig = { * The default is `false`. */ shouldClearNativeTimers?: boolean; + /** + * Use the old fake timers implementation instead of one backed by `@sinonjs/fake-timers`. + * + * @defaultValue + * The default is `'false'`. + */ + legacyFakeTimers?: false; }; -export type FakeTimersConfig = LegacyFakeTimersConfig | ModernFakeTimersConfig; +export type FakeTimersConfig = BaseFakeTimersConfig & + (LegacyFakeTimersConfig | ModernFakeTimersConfig); export type HasteConfig = { /** Whether to hash files using SHA-1. */ diff --git a/packages/test-utils/src/config.ts b/packages/test-utils/src/config.ts index d9cc5eef6780..b6c8deb6f106 100644 --- a/packages/test-utils/src/config.ts +++ b/packages/test-utils/src/config.ts @@ -116,7 +116,7 @@ const DEFAULT_PROJECT_CONFIG: Config.ProjectConfig = { testPathIgnorePatterns: [], testRegex: ['\\.test\\.js$'], testRunner: 'jest-circus/runner', - timers: {timerLimit: 100_000}, + timers: {enableGlobally: false}, transform: [], transformIgnorePatterns: [], unmockedModulePathPatterns: undefined, From 5ccdff47d726762b90f324b6c59e252a95e8cddb Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Mon, 14 Mar 2022 08:45:38 +0200 Subject: [PATCH 13/69] group e2e tests --- e2e/__tests__/{fakeTime.test.ts => fakeTimers.test.ts} | 4 ++-- .../{modernFakeTimers.test.ts => fakeTimersModern.test.ts} | 4 ++-- .../{fakePromises.test.ts => fakeTimersPromise.test.ts} | 6 +++--- ...timerResetMocks.test.ts => fakeTimersResetMocks.test.ts} | 4 ++-- ...{setImmediate.test.ts => fakeTimersSetImmediate.test.ts} | 2 +- ...seRealTimers.test.ts => fakeTimersUseRealTimers.test.ts} | 2 +- .../from-config/__tests__/test.js | 0 .../modern => fake-timers-modern}/from-config/package.json | 0 .../from-jest-object/__tests__/test.js | 0 .../from-jest-object/package.json | 0 .../asap/__tests__/generator.test.js | 0 .../asap/fake-promises.js | 0 .../asap/package.json | 0 .../immediate/__tests__/generator.test.js | 0 .../immediate/fake-promises.js | 0 .../immediate/package.json | 0 .../after-reset-all-mocks/index.js | 0 .../after-reset-all-mocks/package.json | 0 .../after-reset-all-mocks/timerAndMock.test.js | 0 .../with-reset-mocks/index.js | 0 .../with-reset-mocks/package.json | 0 .../with-reset-mocks/timerWithMock.test.js | 0 .../__tests__/setImmediate.test.js | 0 .../from-config => fake-timers-set-immediate}/package.json | 0 .../__tests__/useRealTimers.test.js | 0 .../package.json | 0 .../legacy/from-config/__tests__/test.js | 0 .../legacy/from-config/package.json | 0 .../legacy/from-jest-object/__tests__/test.js | 0 .../legacy}/from-jest-object/package.json | 0 .../legacy/requestAnimationFrame/__tests__/test.js | 0 .../legacy/requestAnimationFrame/package.json | 0 .../modern/from-config/__tests__/test.js | 0 .../modern/from-config}/package.json | 0 .../modern/from-jest-object/__tests__/test.js | 0 .../modern}/from-jest-object/package.json | 0 .../modern/requestAnimationFrame/__tests__/test.js | 0 .../modern/requestAnimationFrame/package.json | 0 38 files changed, 11 insertions(+), 11 deletions(-) rename e2e/__tests__/{fakeTime.test.ts => fakeTimers.test.ts} (78%) rename e2e/__tests__/{modernFakeTimers.test.ts => fakeTimersModern.test.ts} (81%) rename e2e/__tests__/{fakePromises.test.ts => fakeTimersPromise.test.ts} (76%) rename e2e/__tests__/{timerResetMocks.test.ts => fakeTimersResetMocks.test.ts} (75%) rename e2e/__tests__/{setImmediate.test.ts => fakeTimersSetImmediate.test.ts} (84%) rename e2e/__tests__/{timerUseRealTimers.test.ts => fakeTimersUseRealTimers.test.ts} (88%) rename e2e/{modern-fake-timers => fake-timers-modern}/from-config/__tests__/test.js (100%) rename e2e/{fake-time/modern => fake-timers-modern}/from-config/package.json (100%) rename e2e/{modern-fake-timers => fake-timers-modern}/from-jest-object/__tests__/test.js (100%) rename e2e/{fake-time/legacy => fake-timers-modern}/from-jest-object/package.json (100%) rename e2e/{fake-promises => fake-timers-promise}/asap/__tests__/generator.test.js (100%) rename e2e/{fake-promises => fake-timers-promise}/asap/fake-promises.js (100%) rename e2e/{fake-promises => fake-timers-promise}/asap/package.json (100%) rename e2e/{fake-promises => fake-timers-promise}/immediate/__tests__/generator.test.js (100%) rename e2e/{fake-promises => fake-timers-promise}/immediate/fake-promises.js (100%) rename e2e/{fake-promises => fake-timers-promise}/immediate/package.json (100%) rename e2e/{timer-reset-mocks => fake-timers-reset-mocks}/after-reset-all-mocks/index.js (100%) rename e2e/{timer-reset-mocks => fake-timers-reset-mocks}/after-reset-all-mocks/package.json (100%) rename e2e/{timer-reset-mocks => fake-timers-reset-mocks}/after-reset-all-mocks/timerAndMock.test.js (100%) rename e2e/{timer-reset-mocks => fake-timers-reset-mocks}/with-reset-mocks/index.js (100%) rename e2e/{timer-reset-mocks => fake-timers-reset-mocks}/with-reset-mocks/package.json (100%) rename e2e/{timer-reset-mocks => fake-timers-reset-mocks}/with-reset-mocks/timerWithMock.test.js (100%) rename e2e/{set-immediate => fake-timers-set-immediate}/__tests__/setImmediate.test.js (100%) rename e2e/{modern-fake-timers/from-config => fake-timers-set-immediate}/package.json (100%) rename e2e/{timer-use-real-timers => fake-timers-use-real-timers}/__tests__/useRealTimers.test.js (100%) rename e2e/{set-immediate => fake-timers-use-real-timers}/package.json (100%) rename e2e/{fake-time => fake-timers}/legacy/from-config/__tests__/test.js (100%) rename e2e/{fake-time => fake-timers}/legacy/from-config/package.json (100%) rename e2e/{fake-time => fake-timers}/legacy/from-jest-object/__tests__/test.js (100%) rename e2e/{fake-time/modern => fake-timers/legacy}/from-jest-object/package.json (100%) rename e2e/{fake-time => fake-timers}/legacy/requestAnimationFrame/__tests__/test.js (100%) rename e2e/{fake-time => fake-timers}/legacy/requestAnimationFrame/package.json (100%) rename e2e/{fake-time => fake-timers}/modern/from-config/__tests__/test.js (100%) rename e2e/{timer-use-real-timers => fake-timers/modern/from-config}/package.json (100%) rename e2e/{fake-time => fake-timers}/modern/from-jest-object/__tests__/test.js (100%) rename e2e/{modern-fake-timers => fake-timers/modern}/from-jest-object/package.json (100%) rename e2e/{fake-time => fake-timers}/modern/requestAnimationFrame/__tests__/test.js (100%) rename e2e/{fake-time => fake-timers}/modern/requestAnimationFrame/package.json (100%) diff --git a/e2e/__tests__/fakeTime.test.ts b/e2e/__tests__/fakeTimers.test.ts similarity index 78% rename from e2e/__tests__/fakeTime.test.ts rename to e2e/__tests__/fakeTimers.test.ts index c7cad2c3294a..307433132f01 100644 --- a/e2e/__tests__/fakeTime.test.ts +++ b/e2e/__tests__/fakeTimers.test.ts @@ -11,12 +11,12 @@ describe.each(['modern', 'legacy'])( '%s implementation of fake timers', implementation => { it('should be possible to use from config', () => { - const result = runJest(`fake-time/${implementation}/from-config`); + const result = runJest(`fake-timers/${implementation}/from-config`); expect(result.exitCode).toBe(0); }); it('should be possible to use from jest-object', () => { - const result = runJest(`fake-time/${implementation}/from-jest-object`); + const result = runJest(`fake-timers/${implementation}/from-jest-object`); expect(result.exitCode).toBe(0); }); }, diff --git a/e2e/__tests__/modernFakeTimers.test.ts b/e2e/__tests__/fakeTimersModern.test.ts similarity index 81% rename from e2e/__tests__/modernFakeTimers.test.ts rename to e2e/__tests__/fakeTimersModern.test.ts index e004b3b19192..d28e283049be 100644 --- a/e2e/__tests__/modernFakeTimers.test.ts +++ b/e2e/__tests__/fakeTimersModern.test.ts @@ -9,12 +9,12 @@ import runJest from '../runJest'; describe('modern implementation of fake timers', () => { it('should be possible to use modern implementation from config', () => { - const result = runJest('modern-fake-timers/from-config'); + const result = runJest('fake-timers-modern/from-config'); expect(result.exitCode).toBe(0); }); it('should be possible to use modern implementation from jest-object', () => { - const result = runJest('modern-fake-timers/from-jest-object'); + const result = runJest('fake-timers-modern/from-jest-object'); expect(result.exitCode).toBe(0); }); }); diff --git a/e2e/__tests__/fakePromises.test.ts b/e2e/__tests__/fakeTimersPromise.test.ts similarity index 76% rename from e2e/__tests__/fakePromises.test.ts rename to e2e/__tests__/fakeTimersPromise.test.ts index 61cb548eecb6..5f9af584c841 100644 --- a/e2e/__tests__/fakePromises.test.ts +++ b/e2e/__tests__/fakeTimersPromise.test.ts @@ -7,14 +7,14 @@ import runJest from '../runJest'; -describe('Fake promises', () => { +describe('fake promises', () => { it('should be possible to resolve with fake timers using immediates', () => { - const result = runJest('fake-promises/immediate'); + const result = runJest('fake-timers-promise/immediate'); expect(result.exitCode).toBe(0); }); it('should be possible to resolve with fake timers using asap', () => { - const result = runJest('fake-promises/asap'); + const result = runJest('fake-timers-promise/asap'); expect(result.exitCode).toBe(0); }); }); diff --git a/e2e/__tests__/timerResetMocks.test.ts b/e2e/__tests__/fakeTimersResetMocks.test.ts similarity index 75% rename from e2e/__tests__/timerResetMocks.test.ts rename to e2e/__tests__/fakeTimersResetMocks.test.ts index 9ef9f20f6ece..586f50826886 100644 --- a/e2e/__tests__/timerResetMocks.test.ts +++ b/e2e/__tests__/fakeTimersResetMocks.test.ts @@ -8,11 +8,11 @@ import runJest from '../runJest'; test('run timers after resetAllMocks test', () => { - const result = runJest('timer-reset-mocks/after-reset-all-mocks'); + const result = runJest('fake-timers-reset-mocks/after-reset-all-mocks'); expect(result.exitCode).toBe(0); }); test('run timers with resetMocks in config test', () => { - const result = runJest('timer-reset-mocks/with-reset-mocks'); + const result = runJest('fake-timers-reset-mocks/with-reset-mocks'); expect(result.exitCode).toBe(0); }); diff --git a/e2e/__tests__/setImmediate.test.ts b/e2e/__tests__/fakeTimersSetImmediate.test.ts similarity index 84% rename from e2e/__tests__/setImmediate.test.ts rename to e2e/__tests__/fakeTimersSetImmediate.test.ts index 1b5b9bb891af..eee0f404962a 100644 --- a/e2e/__tests__/setImmediate.test.ts +++ b/e2e/__tests__/fakeTimersSetImmediate.test.ts @@ -8,7 +8,7 @@ import runJest from '../runJest'; test('setImmediate', () => { - const result = runJest('set-immediate', ['--verbose']); + const result = runJest('fake-timers-set-immediate', ['--verbose']); expect(result.stderr).toMatch('setImmediate test'); expect(result.exitCode).toBe(0); diff --git a/e2e/__tests__/timerUseRealTimers.test.ts b/e2e/__tests__/fakeTimersUseRealTimers.test.ts similarity index 88% rename from e2e/__tests__/timerUseRealTimers.test.ts rename to e2e/__tests__/fakeTimersUseRealTimers.test.ts index 6c5c3d815637..595c040524c9 100644 --- a/e2e/__tests__/timerUseRealTimers.test.ts +++ b/e2e/__tests__/fakeTimersUseRealTimers.test.ts @@ -8,7 +8,7 @@ import runJest from '../runJest'; test('useRealTimers cancels "timers": "fake" for whole test file', () => { - const result = runJest('timer-use-real-timers'); + const result = runJest('fake-timers-use-real-timers'); expect(result.stdout).toMatch('API is not mocked with fake timers.'); expect(result.exitCode).toBe(0); }); diff --git a/e2e/modern-fake-timers/from-config/__tests__/test.js b/e2e/fake-timers-modern/from-config/__tests__/test.js similarity index 100% rename from e2e/modern-fake-timers/from-config/__tests__/test.js rename to e2e/fake-timers-modern/from-config/__tests__/test.js diff --git a/e2e/fake-time/modern/from-config/package.json b/e2e/fake-timers-modern/from-config/package.json similarity index 100% rename from e2e/fake-time/modern/from-config/package.json rename to e2e/fake-timers-modern/from-config/package.json diff --git a/e2e/modern-fake-timers/from-jest-object/__tests__/test.js b/e2e/fake-timers-modern/from-jest-object/__tests__/test.js similarity index 100% rename from e2e/modern-fake-timers/from-jest-object/__tests__/test.js rename to e2e/fake-timers-modern/from-jest-object/__tests__/test.js diff --git a/e2e/fake-time/legacy/from-jest-object/package.json b/e2e/fake-timers-modern/from-jest-object/package.json similarity index 100% rename from e2e/fake-time/legacy/from-jest-object/package.json rename to e2e/fake-timers-modern/from-jest-object/package.json diff --git a/e2e/fake-promises/asap/__tests__/generator.test.js b/e2e/fake-timers-promise/asap/__tests__/generator.test.js similarity index 100% rename from e2e/fake-promises/asap/__tests__/generator.test.js rename to e2e/fake-timers-promise/asap/__tests__/generator.test.js diff --git a/e2e/fake-promises/asap/fake-promises.js b/e2e/fake-timers-promise/asap/fake-promises.js similarity index 100% rename from e2e/fake-promises/asap/fake-promises.js rename to e2e/fake-timers-promise/asap/fake-promises.js diff --git a/e2e/fake-promises/asap/package.json b/e2e/fake-timers-promise/asap/package.json similarity index 100% rename from e2e/fake-promises/asap/package.json rename to e2e/fake-timers-promise/asap/package.json diff --git a/e2e/fake-promises/immediate/__tests__/generator.test.js b/e2e/fake-timers-promise/immediate/__tests__/generator.test.js similarity index 100% rename from e2e/fake-promises/immediate/__tests__/generator.test.js rename to e2e/fake-timers-promise/immediate/__tests__/generator.test.js diff --git a/e2e/fake-promises/immediate/fake-promises.js b/e2e/fake-timers-promise/immediate/fake-promises.js similarity index 100% rename from e2e/fake-promises/immediate/fake-promises.js rename to e2e/fake-timers-promise/immediate/fake-promises.js diff --git a/e2e/fake-promises/immediate/package.json b/e2e/fake-timers-promise/immediate/package.json similarity index 100% rename from e2e/fake-promises/immediate/package.json rename to e2e/fake-timers-promise/immediate/package.json diff --git a/e2e/timer-reset-mocks/after-reset-all-mocks/index.js b/e2e/fake-timers-reset-mocks/after-reset-all-mocks/index.js similarity index 100% rename from e2e/timer-reset-mocks/after-reset-all-mocks/index.js rename to e2e/fake-timers-reset-mocks/after-reset-all-mocks/index.js diff --git a/e2e/timer-reset-mocks/after-reset-all-mocks/package.json b/e2e/fake-timers-reset-mocks/after-reset-all-mocks/package.json similarity index 100% rename from e2e/timer-reset-mocks/after-reset-all-mocks/package.json rename to e2e/fake-timers-reset-mocks/after-reset-all-mocks/package.json diff --git a/e2e/timer-reset-mocks/after-reset-all-mocks/timerAndMock.test.js b/e2e/fake-timers-reset-mocks/after-reset-all-mocks/timerAndMock.test.js similarity index 100% rename from e2e/timer-reset-mocks/after-reset-all-mocks/timerAndMock.test.js rename to e2e/fake-timers-reset-mocks/after-reset-all-mocks/timerAndMock.test.js diff --git a/e2e/timer-reset-mocks/with-reset-mocks/index.js b/e2e/fake-timers-reset-mocks/with-reset-mocks/index.js similarity index 100% rename from e2e/timer-reset-mocks/with-reset-mocks/index.js rename to e2e/fake-timers-reset-mocks/with-reset-mocks/index.js diff --git a/e2e/timer-reset-mocks/with-reset-mocks/package.json b/e2e/fake-timers-reset-mocks/with-reset-mocks/package.json similarity index 100% rename from e2e/timer-reset-mocks/with-reset-mocks/package.json rename to e2e/fake-timers-reset-mocks/with-reset-mocks/package.json diff --git a/e2e/timer-reset-mocks/with-reset-mocks/timerWithMock.test.js b/e2e/fake-timers-reset-mocks/with-reset-mocks/timerWithMock.test.js similarity index 100% rename from e2e/timer-reset-mocks/with-reset-mocks/timerWithMock.test.js rename to e2e/fake-timers-reset-mocks/with-reset-mocks/timerWithMock.test.js diff --git a/e2e/set-immediate/__tests__/setImmediate.test.js b/e2e/fake-timers-set-immediate/__tests__/setImmediate.test.js similarity index 100% rename from e2e/set-immediate/__tests__/setImmediate.test.js rename to e2e/fake-timers-set-immediate/__tests__/setImmediate.test.js diff --git a/e2e/modern-fake-timers/from-config/package.json b/e2e/fake-timers-set-immediate/package.json similarity index 100% rename from e2e/modern-fake-timers/from-config/package.json rename to e2e/fake-timers-set-immediate/package.json diff --git a/e2e/timer-use-real-timers/__tests__/useRealTimers.test.js b/e2e/fake-timers-use-real-timers/__tests__/useRealTimers.test.js similarity index 100% rename from e2e/timer-use-real-timers/__tests__/useRealTimers.test.js rename to e2e/fake-timers-use-real-timers/__tests__/useRealTimers.test.js diff --git a/e2e/set-immediate/package.json b/e2e/fake-timers-use-real-timers/package.json similarity index 100% rename from e2e/set-immediate/package.json rename to e2e/fake-timers-use-real-timers/package.json diff --git a/e2e/fake-time/legacy/from-config/__tests__/test.js b/e2e/fake-timers/legacy/from-config/__tests__/test.js similarity index 100% rename from e2e/fake-time/legacy/from-config/__tests__/test.js rename to e2e/fake-timers/legacy/from-config/__tests__/test.js diff --git a/e2e/fake-time/legacy/from-config/package.json b/e2e/fake-timers/legacy/from-config/package.json similarity index 100% rename from e2e/fake-time/legacy/from-config/package.json rename to e2e/fake-timers/legacy/from-config/package.json diff --git a/e2e/fake-time/legacy/from-jest-object/__tests__/test.js b/e2e/fake-timers/legacy/from-jest-object/__tests__/test.js similarity index 100% rename from e2e/fake-time/legacy/from-jest-object/__tests__/test.js rename to e2e/fake-timers/legacy/from-jest-object/__tests__/test.js diff --git a/e2e/fake-time/modern/from-jest-object/package.json b/e2e/fake-timers/legacy/from-jest-object/package.json similarity index 100% rename from e2e/fake-time/modern/from-jest-object/package.json rename to e2e/fake-timers/legacy/from-jest-object/package.json diff --git a/e2e/fake-time/legacy/requestAnimationFrame/__tests__/test.js b/e2e/fake-timers/legacy/requestAnimationFrame/__tests__/test.js similarity index 100% rename from e2e/fake-time/legacy/requestAnimationFrame/__tests__/test.js rename to e2e/fake-timers/legacy/requestAnimationFrame/__tests__/test.js diff --git a/e2e/fake-time/legacy/requestAnimationFrame/package.json b/e2e/fake-timers/legacy/requestAnimationFrame/package.json similarity index 100% rename from e2e/fake-time/legacy/requestAnimationFrame/package.json rename to e2e/fake-timers/legacy/requestAnimationFrame/package.json diff --git a/e2e/fake-time/modern/from-config/__tests__/test.js b/e2e/fake-timers/modern/from-config/__tests__/test.js similarity index 100% rename from e2e/fake-time/modern/from-config/__tests__/test.js rename to e2e/fake-timers/modern/from-config/__tests__/test.js diff --git a/e2e/timer-use-real-timers/package.json b/e2e/fake-timers/modern/from-config/package.json similarity index 100% rename from e2e/timer-use-real-timers/package.json rename to e2e/fake-timers/modern/from-config/package.json diff --git a/e2e/fake-time/modern/from-jest-object/__tests__/test.js b/e2e/fake-timers/modern/from-jest-object/__tests__/test.js similarity index 100% rename from e2e/fake-time/modern/from-jest-object/__tests__/test.js rename to e2e/fake-timers/modern/from-jest-object/__tests__/test.js diff --git a/e2e/modern-fake-timers/from-jest-object/package.json b/e2e/fake-timers/modern/from-jest-object/package.json similarity index 100% rename from e2e/modern-fake-timers/from-jest-object/package.json rename to e2e/fake-timers/modern/from-jest-object/package.json diff --git a/e2e/fake-time/modern/requestAnimationFrame/__tests__/test.js b/e2e/fake-timers/modern/requestAnimationFrame/__tests__/test.js similarity index 100% rename from e2e/fake-time/modern/requestAnimationFrame/__tests__/test.js rename to e2e/fake-timers/modern/requestAnimationFrame/__tests__/test.js diff --git a/e2e/fake-time/modern/requestAnimationFrame/package.json b/e2e/fake-timers/modern/requestAnimationFrame/package.json similarity index 100% rename from e2e/fake-time/modern/requestAnimationFrame/package.json rename to e2e/fake-timers/modern/requestAnimationFrame/package.json From e17d545a233b2364bdedfeb1edbaa99d7eaa9bc7 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Mon, 14 Mar 2022 19:47:35 +0200 Subject: [PATCH 14/69] more docs --- docs/CLI.md | 4 +++ docs/Configuration.md | 22 +++++++-------- docs/JestObjectAPI.md | 62 ++++++++++++++++++++++--------------------- docs/TimerMocks.md | 2 +- 4 files changed, 47 insertions(+), 43 deletions(-) diff --git a/docs/CLI.md b/docs/CLI.md index d1cc0aecd2ae..f9d9a2ea0e13 100644 --- a/docs/CLI.md +++ b/docs/CLI.md @@ -202,6 +202,10 @@ Make calling deprecated APIs throw helpful error messages. Useful for easing the Alias: `-e`. Use this flag to show full diffs and errors instead of a patch. +### `--fakeTimers` + +A JSON string with configuration options for fake timers. For details see [Fake Timers](JestObjectAPI.md#fake-timers) documentation. + ### `--filter=` Path to a module exporting a filtering function. This method receives a list of tests which can be manipulated to exclude tests from running. Especially useful when used in conjunction with a testing infrastructure to filter known broken. diff --git a/docs/Configuration.md b/docs/Configuration.md index bbc2e90a4a94..9114a62e02d4 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -399,13 +399,7 @@ Jest's ESM support is still experimental, see [its docs for more details](ECMASc Default: `{}` -This option allows to configure the implementation of fake timers. For example, fake timers may be useful when a piece of code sets a long timeout that we don't want to wait for in a test. - -:::info - -Currently you can choose between modern (default) and legacy fake timers. For more details see [Fake Timers](JestObjectAPI.md#fake-timers) documentation. - -::: +This option allows configuration of the implementation of fake timers. The fake timers may be useful when a piece of code sets a long timeout that we don't want to wait for in a test. For more details see [Fake Timers](JestObjectAPI.md#fake-timers) documentation. Here is how you can enable fake timers globally for all tests: @@ -415,10 +409,10 @@ Here is how you can enable fake timers globally for all tests: } ``` -Supported configuration options of Modern Fake Timers: +Configuration options: ```ts -type FakeableAPIs = +type FakeableAPI = | 'Date' | 'hrtime' | 'nextTick' @@ -442,8 +436,8 @@ type ModernFakeTimersConfig = { * The default is `false`. */ advanceTimers?: boolean | number; - /** List of names of methods or objects that should not be faked. The default is `[]`. */ - doNotFake?: Array; + /** List of names of APIs that should not be faked. The default is `[]`. */ + doNotFake?: Array; /** Whether fake timers should be enabled for all tests. The default is `false`. */ enableGlobally?: boolean; /** Sets current system time to be used by fake timers. The default is `Date.now()`. */ @@ -458,7 +452,9 @@ type ModernFakeTimersConfig = { }; ``` -If for some reason you have to use legacy implementation, here is how to enable it globally (additional options are not supported): +:::info Legacy Fake Timers + +For some reason you might have to use legacy implementation of fake timers. Here is how to enable it globally (additional options are not supported): ```json { @@ -467,6 +463,8 @@ If for some reason you have to use legacy implementation, here is how to enable } ``` +::: + ### `forceCoverageMatch` \[array<string>] Default: `['']` diff --git a/docs/JestObjectAPI.md b/docs/JestObjectAPI.md index 1ef20badef4c..6607aa9230f2 100644 --- a/docs/JestObjectAPI.md +++ b/docs/JestObjectAPI.md @@ -632,34 +632,22 @@ test('direct', () => { ### `jest.useFakeTimers(fakeTimersConfig?)` -Instructs Jest to use fake versions of the global date, performance and timers APIs. Currently you can choose between modern (default) or legacy fake timers. +Instructs Jest to use fake versions of the global date, performance, time and timers APIs. Fake timers implementation is backed by [@sinonjs/fake-timers](https://github.com/sinonjs/fake-timers). -Returns the `jest` object for chaining. +Fake timers will swap out `Date`, `performance.now()`, `queueMicrotask()`, `setImmediate()`, `clearImmediate()`, `setInterval()`, `clearInterval()`, `setTimeout()`, `clearTimeout()` with an implementation that gets its time from the fake clock. -#### Modern Fake Timers +In node environment `process.hrtime`, `process.nextTick()` and in jsdom environment `requestAnimationFrame()`, `cancelAnimationFrame()`, `requestIdleCallback()`, `cancelIdleCallback()` will be replaced as well. -:::info +:::tip -This implementation is backed by [@sinonjs/fake-timers](https://github.com/sinonjs/fake-timers). +The fake `performance` instance includes only `.now()` method. In case if your code requires `performance.mark()`, use `doNotFake` option to preserve the original instance. ::: -Modern Fake Timers will swap out `Date` and `performance` objects as well as `queueMicrotask()`, `requestAnimationFrame()`, `cancelAnimationFrame()`, `requestIdleCallback()`, `cancelIdleCallback()`, `setImmediate()`, `clearImmediate()`, `setInterval()`, `clearInterval()`, `setTimeout()`, `clearTimeout()` methods. In node environment `process.hrtime`, `process.nextTick()` will be also replaced. - -Example: - -```js -jest.useFakeTimers({ - doNotFake: ['nextTick'], - now: new Date(1990, 12, 1), - advanceTimers: true, -}); -``` - Configuration options: ```ts -type FakeableAPIs = +type FakeableAPI = | 'Date' | 'hrtime' | 'nextTick' @@ -676,15 +664,15 @@ type FakeableAPIs = | 'setTimeout' | 'clearTimeout'; -type ModernFakeTimersConfig = { +type FakeTimersConfig = { /** * If set to `true` all timers will be advanced automatically by 20 milliseconds * every 20 milliseconds. A custom time delta may be provided by passing a number. * The default is `false`. */ advanceTimers?: boolean | number; - /** List of names of methods or objects that should not be faked. The default is `[]`. */ - doNotFake?: Array; + /** List of names of APIs that should not be faked. The default is `[]`. */ + doNotFake?: Array; /** Sets current system time to be used by fake timers. The default is `Date.now()`. */ now?: number | Date; /** @@ -697,11 +685,19 @@ type ModernFakeTimersConfig = { }; ``` -#### Legacy Fake Timers +Example: -Legacy Fake Timers will swap out `requestAnimationFrame()`, `cancelAnimationFrame()`, `setImmediate()`, `clearImmediate()`, `setInterval()`, `clearInterval()`, `setTimeout()`, `clearTimeout()` methods with mock functions. In node environment `process.nextTick()` will be also replaced. +```js +jest.useFakeTimers({ + doNotFake: ['nextTick', 'performance'], + now: new Date(1990, 12, 1), + advanceTimers: true, +}); +``` + +:::info Legacy Fake Timers -You can enable legacy timers like this: +For some reason you might have to use legacy implementation of fake timers. It can be enabled like this (additional options are not supported): ```js jest.useFakeTimers({ @@ -709,6 +705,12 @@ jest.useFakeTimers({ }); ``` +Legacy fake timers will swap out `setImmediate()`, `clearImmediate()`, `setInterval()`, `clearInterval()`, `setTimeout()`, `clearTimeout()` with Jest mock functions. In node environment `process.nextTick()` and in jsdom environment `requestAnimationFrame()`, `cancelAnimationFrame()` will be also replaced. + +::: + +Returns the `jest` object for chaining. + ### `jest.useRealTimers()` Instructs Jest to use the real versions of the global date, performance and timers APIs. @@ -733,9 +735,9 @@ This is often useful for synchronously executing setTimeouts during a test in or Exhausts all tasks queued by `setImmediate()`. -:::note +:::info -This function is only available when using Legacy Fake Timers. +This function is only available when using legacy fake timers implementation. ::: @@ -771,9 +773,9 @@ Returns the number of fake timers still left to run. Set the current system time used by fake timers. Simulates a user changing the system clock while your program is running. It affects the current time but it does not in itself cause e.g. timers to fire; they will fire exactly as they would have done without the call to `jest.setSystemTime()`. -:::note +:::info -This function is only available when using Modern Fake Timers. +This function is not available when using legacy fake timers implementation. ::: @@ -781,9 +783,9 @@ This function is only available when using Modern Fake Timers. When mocking time, `Date.now()` will also be mocked. If you for some reason need access to the real current time, you can invoke this function. -:::note +:::info -This function is only available when using Modern Fake Timers. +This function is not available when using legacy fake timers implementation. ::: diff --git a/docs/TimerMocks.md b/docs/TimerMocks.md index c4c041e831ce..c9f62550ea63 100644 --- a/docs/TimerMocks.md +++ b/docs/TimerMocks.md @@ -55,7 +55,7 @@ test('do something with real timers', () => { :::info -Currently you can choose between modern (default) or legacy fake timers. For more details see [Fake Timers](JestObjectAPI.md#fake-timers) documentation. +For more details see [Fake Timers](JestObjectAPI.md#fake-timers) documentation. ::: From a671c6ab31e69a071fa897da08a79e859abea4d5 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Mon, 14 Mar 2022 19:58:43 +0200 Subject: [PATCH 15/69] more cli docs --- docs/CLI.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/CLI.md b/docs/CLI.md index f9d9a2ea0e13..0272d895f386 100644 --- a/docs/CLI.md +++ b/docs/CLI.md @@ -202,7 +202,7 @@ Make calling deprecated APIs throw helpful error messages. Useful for easing the Alias: `-e`. Use this flag to show full diffs and errors instead of a patch. -### `--fakeTimers` +### `--fakeTimers=` A JSON string with configuration options for fake timers. For details see [Fake Timers](JestObjectAPI.md#fake-timers) documentation. From bb381971b9cb1da88a8173ecc7b3826198904a1a Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Tue, 15 Mar 2022 11:15:56 +0200 Subject: [PATCH 16/69] clean up e2e tests --- e2e/__tests__/fakeTimers.test.ts | 55 ++++++++++++++----- e2e/__tests__/fakeTimersLegacy.test.ts | 33 +++++++++++ e2e/__tests__/fakeTimersModern.test.ts | 20 ------- e2e/__tests__/fakeTimersSetImmediate.test.ts | 15 ----- e2e/__tests__/fakeTimersUseRealTimers.test.ts | 14 ----- .../__tests__/enableGlobally.test.js} | 2 +- .../enable-globally}/package.json | 0 .../__tests__/requestAnimationFrame.test.js} | 2 +- .../request-animation-frame}/package.json | 0 .../__tests__/useFakeTimers.test.js} | 2 +- .../use-fake-timers}/package.json | 0 .../__tests__/enableGlobally.test.js} | 0 .../enable-globally}/package.json | 0 .../modern/from-config/__tests__/test.js | 18 ------ .../modern/from-config/package.json | 6 -- .../modern/from-jest-object/__tests__/test.js | 20 ------- .../modern/from-jest-object/package.json | 5 -- .../__tests__/requestAnimationFrame.test.js} | 2 +- .../package.json | 0 .../__tests__/setImmediate.test.js | 0 .../set-immediate}/package.json | 0 .../__tests__/useFakeTimers.test.js} | 0 .../package.json | 0 .../__tests__/useRealTimers.test.js | 2 + .../use-real-timers}/package.json | 0 packages/jest-runtime/src/index.ts | 2 +- 26 files changed, 81 insertions(+), 117 deletions(-) create mode 100644 e2e/__tests__/fakeTimersLegacy.test.ts delete mode 100644 e2e/__tests__/fakeTimersModern.test.ts delete mode 100644 e2e/__tests__/fakeTimersSetImmediate.test.ts delete mode 100644 e2e/__tests__/fakeTimersUseRealTimers.test.ts rename e2e/{fake-timers/legacy/from-config/__tests__/test.js => fake-timers-legacy/enable-globally/__tests__/enableGlobally.test.js} (80%) rename e2e/{fake-timers/legacy/from-config => fake-timers-legacy/enable-globally}/package.json (100%) rename e2e/{fake-timers/legacy/requestAnimationFrame/__tests__/test.js => fake-timers-legacy/request-animation-frame/__tests__/requestAnimationFrame.test.js} (93%) rename e2e/{fake-timers/legacy/requestAnimationFrame => fake-timers-legacy/request-animation-frame}/package.json (100%) rename e2e/{fake-timers/legacy/from-jest-object/__tests__/test.js => fake-timers-legacy/use-fake-timers/__tests__/useFakeTimers.test.js} (82%) rename e2e/{fake-timers-modern/from-jest-object => fake-timers-legacy/use-fake-timers}/package.json (100%) rename e2e/{fake-timers-modern/from-config/__tests__/test.js => fake-timers/enable-globally/__tests__/enableGlobally.test.js} (100%) rename e2e/{fake-timers-modern/from-config => fake-timers/enable-globally}/package.json (100%) delete mode 100644 e2e/fake-timers/modern/from-config/__tests__/test.js delete mode 100644 e2e/fake-timers/modern/from-config/package.json delete mode 100644 e2e/fake-timers/modern/from-jest-object/__tests__/test.js delete mode 100644 e2e/fake-timers/modern/from-jest-object/package.json rename e2e/fake-timers/{modern/requestAnimationFrame/__tests__/test.js => request-animation-frame/__tests__/requestAnimationFrame.test.js} (92%) rename e2e/fake-timers/{modern/requestAnimationFrame => request-animation-frame}/package.json (100%) rename e2e/{fake-timers-set-immediate => fake-timers/set-immediate}/__tests__/setImmediate.test.js (100%) rename e2e/{fake-timers-set-immediate => fake-timers/set-immediate}/package.json (100%) rename e2e/{fake-timers-modern/from-jest-object/__tests__/test.js => fake-timers/use-fake-timers/__tests__/useFakeTimers.test.js} (100%) rename e2e/fake-timers/{legacy/from-jest-object => use-fake-timers}/package.json (100%) rename e2e/{fake-timers-use-real-timers => fake-timers/use-real-timers}/__tests__/useRealTimers.test.js (94%) rename e2e/{fake-timers-use-real-timers => fake-timers/use-real-timers}/package.json (100%) diff --git a/e2e/__tests__/fakeTimers.test.ts b/e2e/__tests__/fakeTimers.test.ts index 307433132f01..a1e3a76705e1 100644 --- a/e2e/__tests__/fakeTimers.test.ts +++ b/e2e/__tests__/fakeTimers.test.ts @@ -7,17 +7,44 @@ import runJest from '../runJest'; -describe.each(['modern', 'legacy'])( - '%s implementation of fake timers', - implementation => { - it('should be possible to use from config', () => { - const result = runJest(`fake-timers/${implementation}/from-config`); - expect(result.exitCode).toBe(0); - }); - - it('should be possible to use from jest-object', () => { - const result = runJest(`fake-timers/${implementation}/from-jest-object`); - expect(result.exitCode).toBe(0); - }); - }, -); +describe('enableGlobally', () => { + test('enables fake timers from Jest Config', () => { + const result = runJest('fake-timers/enable-globally'); + expect(result.exitCode).toBe(0); + }); +}); + +describe('useFakeTimers', () => { + test('enables fake timers from Jest Object', () => { + const result = runJest('fake-timers/use-fake-timers'); + expect(result.exitCode).toBe(0); + }); +}); + +describe('useRealTimers', () => { + test('restores timers to the native implementation', () => { + const result = runJest('fake-timers/use-real-timers'); + expect(result.stdout).toMatch('API is not mocked with fake timers.'); + expect(result.exitCode).toBe(0); + }); +}); + +describe('setImmediate', () => { + test('fakes setImmediate', () => { + const result = runJest('fake-timers/set-immediate', ['--verbose']); + + expect(result.stderr).toMatch('setImmediate test'); + expect(result.exitCode).toBe(0); + }); +}); + +describe('requestAnimationFrame', () => { + test('fakes requestAnimationFrame', () => { + const result = runJest('fake-timers/request-animation-frame', [ + '--verbose', + ]); + + expect(result.stderr).toMatch('requestAnimationFrame test'); + expect(result.exitCode).toBe(0); + }); +}); diff --git a/e2e/__tests__/fakeTimersLegacy.test.ts b/e2e/__tests__/fakeTimersLegacy.test.ts new file mode 100644 index 000000000000..833074cfba22 --- /dev/null +++ b/e2e/__tests__/fakeTimersLegacy.test.ts @@ -0,0 +1,33 @@ +/** + * 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 runJest from '../runJest'; + +describe('enableGlobally', () => { + test('enables legacy fake timers from Jest Config', () => { + const result = runJest('fake-timers-legacy/enable-globally'); + expect(result.exitCode).toBe(0); + }); +}); + +describe('useFakeTimers', () => { + test('enables legacy fake timers from Jest Object', () => { + const result = runJest('fake-timers-legacy/use-fake-timers'); + expect(result.exitCode).toBe(0); + }); +}); + +describe('requestAnimationFrame', () => { + test('fakes requestAnimationFrame', () => { + const result = runJest('fake-timers-legacy/request-animation-frame', [ + '--verbose', + ]); + + expect(result.stderr).toMatch('requestAnimationFrame test'); + expect(result.exitCode).toBe(0); + }); +}); diff --git a/e2e/__tests__/fakeTimersModern.test.ts b/e2e/__tests__/fakeTimersModern.test.ts deleted file mode 100644 index d28e283049be..000000000000 --- a/e2e/__tests__/fakeTimersModern.test.ts +++ /dev/null @@ -1,20 +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. - */ - -import runJest from '../runJest'; - -describe('modern implementation of fake timers', () => { - it('should be possible to use modern implementation from config', () => { - const result = runJest('fake-timers-modern/from-config'); - expect(result.exitCode).toBe(0); - }); - - it('should be possible to use modern implementation from jest-object', () => { - const result = runJest('fake-timers-modern/from-jest-object'); - expect(result.exitCode).toBe(0); - }); -}); diff --git a/e2e/__tests__/fakeTimersSetImmediate.test.ts b/e2e/__tests__/fakeTimersSetImmediate.test.ts deleted file mode 100644 index eee0f404962a..000000000000 --- a/e2e/__tests__/fakeTimersSetImmediate.test.ts +++ /dev/null @@ -1,15 +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. - */ - -import runJest from '../runJest'; - -test('setImmediate', () => { - const result = runJest('fake-timers-set-immediate', ['--verbose']); - - expect(result.stderr).toMatch('setImmediate test'); - expect(result.exitCode).toBe(0); -}); diff --git a/e2e/__tests__/fakeTimersUseRealTimers.test.ts b/e2e/__tests__/fakeTimersUseRealTimers.test.ts deleted file mode 100644 index 595c040524c9..000000000000 --- a/e2e/__tests__/fakeTimersUseRealTimers.test.ts +++ /dev/null @@ -1,14 +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. - */ - -import runJest from '../runJest'; - -test('useRealTimers cancels "timers": "fake" for whole test file', () => { - const result = runJest('fake-timers-use-real-timers'); - expect(result.stdout).toMatch('API is not mocked with fake timers.'); - expect(result.exitCode).toBe(0); -}); diff --git a/e2e/fake-timers/legacy/from-config/__tests__/test.js b/e2e/fake-timers-legacy/enable-globally/__tests__/enableGlobally.test.js similarity index 80% rename from e2e/fake-timers/legacy/from-config/__tests__/test.js rename to e2e/fake-timers-legacy/enable-globally/__tests__/enableGlobally.test.js index b2da4295d439..0b58d6550132 100644 --- a/e2e/fake-timers/legacy/from-config/__tests__/test.js +++ b/e2e/fake-timers-legacy/enable-globally/__tests__/enableGlobally.test.js @@ -9,6 +9,6 @@ test('fake timers', () => { expect(() => jest.setSystemTime(0)).toThrow( - 'setSystemTime is not available when not using modern timers', + 'jest.setSystemTime() is not available when using legacy fake timers.', ); }); diff --git a/e2e/fake-timers/legacy/from-config/package.json b/e2e/fake-timers-legacy/enable-globally/package.json similarity index 100% rename from e2e/fake-timers/legacy/from-config/package.json rename to e2e/fake-timers-legacy/enable-globally/package.json diff --git a/e2e/fake-timers/legacy/requestAnimationFrame/__tests__/test.js b/e2e/fake-timers-legacy/request-animation-frame/__tests__/requestAnimationFrame.test.js similarity index 93% rename from e2e/fake-timers/legacy/requestAnimationFrame/__tests__/test.js rename to e2e/fake-timers-legacy/request-animation-frame/__tests__/requestAnimationFrame.test.js index 0f2e62ce5ce6..0dd9668303ea 100644 --- a/e2e/fake-timers/legacy/requestAnimationFrame/__tests__/test.js +++ b/e2e/fake-timers-legacy/request-animation-frame/__tests__/requestAnimationFrame.test.js @@ -9,7 +9,7 @@ 'use strict'; -test('requestAnimationFrame', () => { +test('requestAnimationFrame test', () => { jest.useFakeTimers({ legacyFakeTimers: true, }); diff --git a/e2e/fake-timers/legacy/requestAnimationFrame/package.json b/e2e/fake-timers-legacy/request-animation-frame/package.json similarity index 100% rename from e2e/fake-timers/legacy/requestAnimationFrame/package.json rename to e2e/fake-timers-legacy/request-animation-frame/package.json diff --git a/e2e/fake-timers/legacy/from-jest-object/__tests__/test.js b/e2e/fake-timers-legacy/use-fake-timers/__tests__/useFakeTimers.test.js similarity index 82% rename from e2e/fake-timers/legacy/from-jest-object/__tests__/test.js rename to e2e/fake-timers-legacy/use-fake-timers/__tests__/useFakeTimers.test.js index 58548cce9177..390676f3391a 100644 --- a/e2e/fake-timers/legacy/from-jest-object/__tests__/test.js +++ b/e2e/fake-timers-legacy/use-fake-timers/__tests__/useFakeTimers.test.js @@ -13,6 +13,6 @@ test('fake timers', () => { }); expect(() => jest.setSystemTime(0)).toThrow( - 'setSystemTime is not available when not using modern timers', + 'jest.setSystemTime() is not available when using legacy fake timers.', ); }); diff --git a/e2e/fake-timers-modern/from-jest-object/package.json b/e2e/fake-timers-legacy/use-fake-timers/package.json similarity index 100% rename from e2e/fake-timers-modern/from-jest-object/package.json rename to e2e/fake-timers-legacy/use-fake-timers/package.json diff --git a/e2e/fake-timers-modern/from-config/__tests__/test.js b/e2e/fake-timers/enable-globally/__tests__/enableGlobally.test.js similarity index 100% rename from e2e/fake-timers-modern/from-config/__tests__/test.js rename to e2e/fake-timers/enable-globally/__tests__/enableGlobally.test.js diff --git a/e2e/fake-timers-modern/from-config/package.json b/e2e/fake-timers/enable-globally/package.json similarity index 100% rename from e2e/fake-timers-modern/from-config/package.json rename to e2e/fake-timers/enable-globally/package.json diff --git a/e2e/fake-timers/modern/from-config/__tests__/test.js b/e2e/fake-timers/modern/from-config/__tests__/test.js deleted file mode 100644 index a32e5a5bc8e4..000000000000 --- a/e2e/fake-timers/modern/from-config/__tests__/test.js +++ /dev/null @@ -1,18 +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'; - -test('fake timers', () => { - jest.setSystemTime(0); - - expect(Date.now()).toBe(0); - - jest.setSystemTime(1000); - - expect(Date.now()).toBe(1000); -}); diff --git a/e2e/fake-timers/modern/from-config/package.json b/e2e/fake-timers/modern/from-config/package.json deleted file mode 100644 index bccb45e57a44..000000000000 --- a/e2e/fake-timers/modern/from-config/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "jest": { - "testEnvironment": "node", - "timers": {"enableGlobally": true} - } -} diff --git a/e2e/fake-timers/modern/from-jest-object/__tests__/test.js b/e2e/fake-timers/modern/from-jest-object/__tests__/test.js deleted file mode 100644 index 192f2b72cd76..000000000000 --- a/e2e/fake-timers/modern/from-jest-object/__tests__/test.js +++ /dev/null @@ -1,20 +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'; - -test('fake timers', () => { - jest.useFakeTimers(); - - jest.setSystemTime(0); - - expect(Date.now()).toBe(0); - - jest.setSystemTime(1000); - - expect(Date.now()).toBe(1000); -}); diff --git a/e2e/fake-timers/modern/from-jest-object/package.json b/e2e/fake-timers/modern/from-jest-object/package.json deleted file mode 100644 index 148788b25446..000000000000 --- a/e2e/fake-timers/modern/from-jest-object/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "jest": { - "testEnvironment": "node" - } -} diff --git a/e2e/fake-timers/modern/requestAnimationFrame/__tests__/test.js b/e2e/fake-timers/request-animation-frame/__tests__/requestAnimationFrame.test.js similarity index 92% rename from e2e/fake-timers/modern/requestAnimationFrame/__tests__/test.js rename to e2e/fake-timers/request-animation-frame/__tests__/requestAnimationFrame.test.js index 776036011cf8..5548e95b0005 100644 --- a/e2e/fake-timers/modern/requestAnimationFrame/__tests__/test.js +++ b/e2e/fake-timers/request-animation-frame/__tests__/requestAnimationFrame.test.js @@ -9,7 +9,7 @@ 'use strict'; -test('requestAnimationFrame', () => { +test('requestAnimationFrame test', () => { jest.useFakeTimers(); let frameTimestamp = -1; diff --git a/e2e/fake-timers/modern/requestAnimationFrame/package.json b/e2e/fake-timers/request-animation-frame/package.json similarity index 100% rename from e2e/fake-timers/modern/requestAnimationFrame/package.json rename to e2e/fake-timers/request-animation-frame/package.json diff --git a/e2e/fake-timers-set-immediate/__tests__/setImmediate.test.js b/e2e/fake-timers/set-immediate/__tests__/setImmediate.test.js similarity index 100% rename from e2e/fake-timers-set-immediate/__tests__/setImmediate.test.js rename to e2e/fake-timers/set-immediate/__tests__/setImmediate.test.js diff --git a/e2e/fake-timers-set-immediate/package.json b/e2e/fake-timers/set-immediate/package.json similarity index 100% rename from e2e/fake-timers-set-immediate/package.json rename to e2e/fake-timers/set-immediate/package.json diff --git a/e2e/fake-timers-modern/from-jest-object/__tests__/test.js b/e2e/fake-timers/use-fake-timers/__tests__/useFakeTimers.test.js similarity index 100% rename from e2e/fake-timers-modern/from-jest-object/__tests__/test.js rename to e2e/fake-timers/use-fake-timers/__tests__/useFakeTimers.test.js diff --git a/e2e/fake-timers/legacy/from-jest-object/package.json b/e2e/fake-timers/use-fake-timers/package.json similarity index 100% rename from e2e/fake-timers/legacy/from-jest-object/package.json rename to e2e/fake-timers/use-fake-timers/package.json diff --git a/e2e/fake-timers-use-real-timers/__tests__/useRealTimers.test.js b/e2e/fake-timers/use-real-timers/__tests__/useRealTimers.test.js similarity index 94% rename from e2e/fake-timers-use-real-timers/__tests__/useRealTimers.test.js rename to e2e/fake-timers/use-real-timers/__tests__/useRealTimers.test.js index a50c55be2f31..e82cccde9bc0 100644 --- a/e2e/fake-timers-use-real-timers/__tests__/useRealTimers.test.js +++ b/e2e/fake-timers/use-real-timers/__tests__/useRealTimers.test.js @@ -5,6 +5,8 @@ * LICENSE file in the root directory of this source tree. */ +'use strict'; + jest.useRealTimers(); test('bar', () => { diff --git a/e2e/fake-timers-use-real-timers/package.json b/e2e/fake-timers/use-real-timers/package.json similarity index 100% rename from e2e/fake-timers-use-real-timers/package.json rename to e2e/fake-timers/use-real-timers/package.json diff --git a/packages/jest-runtime/src/index.ts b/packages/jest-runtime/src/index.ts index f9d3017920a9..60ac6605fcb5 100644 --- a/packages/jest-runtime/src/index.ts +++ b/packages/jest-runtime/src/index.ts @@ -2171,7 +2171,7 @@ export default class Runtime { fakeTimers.setSystemTime(now); } else { throw new TypeError( - 'setSystemTime is not available when not using modern timers', + 'jest.setSystemTime() is not available when using legacy fake timers.', ); } }, From e3ec932f44eaaa5f4f6b893a3e8d33fa39f96b97 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Tue, 15 Mar 2022 12:54:51 +0200 Subject: [PATCH 17/69] rename `fakeTimers` --- .../__snapshots__/showConfig.test.ts.snap | 6 +-- .../enable-globally/package.json | 4 +- e2e/fake-timers-promise/asap/package.json | 4 +- .../immediate/package.json | 4 +- .../with-reset-mocks/package.json | 4 +- e2e/fake-timers/enable-globally/package.json | 4 +- e2e/fake-timers/set-immediate/package.json | 4 +- e2e/fake-timers/use-real-timers/package.json | 4 +- .../legacy-code-todo-rewrite/jestAdapter.ts | 6 +-- packages/jest-cli/src/cli/args.ts | 8 +-- .../__tests__/__snapshots__/init.test.js.snap | 10 ++-- packages/jest-config/src/Defaults.ts | 2 +- packages/jest-config/src/Descriptions.ts | 2 +- packages/jest-config/src/ValidConfig.ts | 52 +++++++++---------- packages/jest-config/src/index.ts | 2 +- packages/jest-config/src/normalize.ts | 2 +- .../logDebugMessages.test.ts.snap | 6 +-- .../src/__tests__/modernFakeTimers.test.ts | 4 +- .../jest-fake-timers/src/modernFakeTimers.ts | 8 +-- packages/jest-jasmine2/src/index.ts | 6 +-- packages/jest-runtime/src/index.ts | 2 +- .../ScriptTransformer.test.ts.snap | 34 ++++++------ packages/jest-types/src/Config.ts | 8 +-- .../src/__tests__/fixtures/jestConfig.ts | 4 +- packages/test-utils/src/config.ts | 2 +- 25 files changed, 96 insertions(+), 96 deletions(-) diff --git a/e2e/__tests__/__snapshots__/showConfig.test.ts.snap b/e2e/__tests__/__snapshots__/showConfig.test.ts.snap index c0759fbf5988..7445faef77f9 100644 --- a/e2e/__tests__/__snapshots__/showConfig.test.ts.snap +++ b/e2e/__tests__/__snapshots__/showConfig.test.ts.snap @@ -16,6 +16,9 @@ exports[`--showConfig outputs config info and exits 1`] = ` "detectOpenHandles": false, "errorOnDeprecated": false, "extensionsToTreatAsEsm": [], + "fakeTimers": { + "enableGlobally": false + }, "forceCoverageMatch": [], "globals": {}, "haste": { @@ -66,9 +69,6 @@ exports[`--showConfig outputs config info and exits 1`] = ` ], "testRegex": [], "testRunner": "<>/jest-circus/runner.js", - "timers": { - "enableGlobally": false - }, "transform": [ [ "\\\\.[jt]sx?$", diff --git a/e2e/fake-timers-legacy/enable-globally/package.json b/e2e/fake-timers-legacy/enable-globally/package.json index 853d36ce76b6..4c86b0be06e5 100644 --- a/e2e/fake-timers-legacy/enable-globally/package.json +++ b/e2e/fake-timers-legacy/enable-globally/package.json @@ -1,6 +1,6 @@ { "jest": { - "testEnvironment": "node", - "timers": {"enableGlobally": true, "legacyFakeTimers": true} + "fakeTimers": {"enableGlobally": true, "legacyFakeTimers": true}, + "testEnvironment": "node" } } diff --git a/e2e/fake-timers-promise/asap/package.json b/e2e/fake-timers-promise/asap/package.json index 26df20b681e2..59cdffb9baaa 100644 --- a/e2e/fake-timers-promise/asap/package.json +++ b/e2e/fake-timers-promise/asap/package.json @@ -1,9 +1,9 @@ { "jest": { + "fakeTimers": {"enableGlobally": true}, "setupFiles": [ "/fake-promises" ], - "testEnvironment": "node", - "timers": {"enableGlobally": true} + "testEnvironment": "node" } } diff --git a/e2e/fake-timers-promise/immediate/package.json b/e2e/fake-timers-promise/immediate/package.json index 26df20b681e2..59cdffb9baaa 100644 --- a/e2e/fake-timers-promise/immediate/package.json +++ b/e2e/fake-timers-promise/immediate/package.json @@ -1,9 +1,9 @@ { "jest": { + "fakeTimers": {"enableGlobally": true}, "setupFiles": [ "/fake-promises" ], - "testEnvironment": "node", - "timers": {"enableGlobally": true} + "testEnvironment": "node" } } diff --git a/e2e/fake-timers-reset-mocks/with-reset-mocks/package.json b/e2e/fake-timers-reset-mocks/with-reset-mocks/package.json index 999d643613f9..353a77de2693 100644 --- a/e2e/fake-timers-reset-mocks/with-reset-mocks/package.json +++ b/e2e/fake-timers-reset-mocks/with-reset-mocks/package.json @@ -1,7 +1,7 @@ { "jest": { + "fakeTimers": {"enableGlobally": true}, "resetMocks": true, - "testEnvironment": "node", - "timers": {"enableGlobally": true} + "testEnvironment": "node" } } diff --git a/e2e/fake-timers/enable-globally/package.json b/e2e/fake-timers/enable-globally/package.json index bccb45e57a44..348aedebac3b 100644 --- a/e2e/fake-timers/enable-globally/package.json +++ b/e2e/fake-timers/enable-globally/package.json @@ -1,6 +1,6 @@ { "jest": { - "testEnvironment": "node", - "timers": {"enableGlobally": true} + "fakeTimers": {"enableGlobally": true}, + "testEnvironment": "node" } } diff --git a/e2e/fake-timers/set-immediate/package.json b/e2e/fake-timers/set-immediate/package.json index bccb45e57a44..348aedebac3b 100644 --- a/e2e/fake-timers/set-immediate/package.json +++ b/e2e/fake-timers/set-immediate/package.json @@ -1,6 +1,6 @@ { "jest": { - "testEnvironment": "node", - "timers": {"enableGlobally": true} + "fakeTimers": {"enableGlobally": true}, + "testEnvironment": "node" } } diff --git a/e2e/fake-timers/use-real-timers/package.json b/e2e/fake-timers/use-real-timers/package.json index bccb45e57a44..348aedebac3b 100644 --- a/e2e/fake-timers/use-real-timers/package.json +++ b/e2e/fake-timers/use-real-timers/package.json @@ -1,6 +1,6 @@ { "jest": { - "testEnvironment": "node", - "timers": {"enableGlobally": true} + "fakeTimers": {"enableGlobally": true}, + "testEnvironment": "node" } } 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 84fada79e243..f311e354dca0 100644 --- a/packages/jest-circus/src/legacy-code-todo-rewrite/jestAdapter.ts +++ b/packages/jest-circus/src/legacy-code-todo-rewrite/jestAdapter.ts @@ -38,8 +38,8 @@ const jestAdapter = async ( testPath, }); - if (config.timers.enableGlobally) { - if (!config.timers.legacyFakeTimers) { + if (config.fakeTimers.enableGlobally) { + if (!config.fakeTimers.legacyFakeTimers) { // during setup, this cannot be null (and it's fine to explode if it is) environment.fakeTimersModern!.useFakeTimers(); } else { @@ -59,7 +59,7 @@ const jestAdapter = async ( if (config.resetMocks) { runtime.resetAllMocks(); - if (config.timers === 'legacy') { + if (config.fakeTimers.legacyFakeTimers) { // during setup, this cannot be null (and it's fine to explode if it is) environment.fakeTimers!.useFakeTimers(); } diff --git a/packages/jest-cli/src/cli/args.ts b/packages/jest-cli/src/cli/args.ts index bd6ec7ae0cc9..a8b9b4b0114b 100644 --- a/packages/jest-cli/src/cli/args.ts +++ b/packages/jest-cli/src/cli/args.ts @@ -260,6 +260,10 @@ export const options = { description: 'Use this flag to show full diffs instead of a patch.', type: 'boolean', }, + fakeTimers: { + description: 'A JSON string with configuration options for fake timers.', + type: 'string', + }, filter: { description: 'Path to a module exporting a filtering function. This method receives ' + @@ -622,10 +626,6 @@ export const options = { description: 'This option sets the default timeouts of test cases.', type: 'number', }, - timers: { - description: 'A JSON string with configuration options for fake timers.', - type: 'string', - }, transform: { description: 'A JSON string which maps from regular expressions to paths ' + diff --git a/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap b/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap index 97605e30a0ca..c06a68d33585 100644 --- a/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap +++ b/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap @@ -168,6 +168,11 @@ module.exports = { // Make calling deprecated APIs throw helpful error messages // errorOnDeprecated: false, + // The configuration for fake timers. + // fakeTimers: { + // "enableGlobally": false + // }, + // Force coverage collection from ignored files using an array of glob patterns // forceCoverageMatch: [], @@ -283,11 +288,6 @@ module.exports = { // This option allows use of a custom test runner // testRunner: "jest-circus/runner", - // The configuration for fake timers. - // timers: { - // "enableGlobally": false - // }, - // A map from regular expressions to paths to transformers // transform: undefined, diff --git a/packages/jest-config/src/Defaults.ts b/packages/jest-config/src/Defaults.ts index 4f6e57d1b819..2cd30288ecfa 100644 --- a/packages/jest-config/src/Defaults.ts +++ b/packages/jest-config/src/Defaults.ts @@ -31,6 +31,7 @@ const defaultOptions: Config.DefaultOptions = { errorOnDeprecated: false, expand: false, extensionsToTreatAsEsm: [], + fakeTimers: {enableGlobally: false}, forceCoverageMatch: [], globals: {}, haste: { @@ -72,7 +73,6 @@ const defaultOptions: Config.DefaultOptions = { testRegex: [], testRunner: 'jest-circus/runner', testSequencer: '@jest/test-sequencer', - timers: {enableGlobally: false}, transformIgnorePatterns: [NODE_MODULES_REGEXP, `\\.pnp\\.[^\\${sep}]+$`], useStderr: false, watch: false, diff --git a/packages/jest-config/src/Descriptions.ts b/packages/jest-config/src/Descriptions.ts index 75bad8ddccd5..fd27acc91ef4 100644 --- a/packages/jest-config/src/Descriptions.ts +++ b/packages/jest-config/src/Descriptions.ts @@ -31,6 +31,7 @@ const descriptions: {[key in keyof Config.InitialOptions]: string} = { dependencyExtractor: 'A path to a custom dependency extractor', errorOnDeprecated: 'Make calling deprecated APIs throw helpful error messages', + fakeTimers: 'The configuration for fake timers.', forceCoverageMatch: 'Force coverage collection from ignored files using an array of glob patterns', globalSetup: @@ -84,7 +85,6 @@ const descriptions: {[key in keyof Config.InitialOptions]: string} = { testResultsProcessor: 'This option allows the use of a custom results processor', testRunner: 'This option allows use of a custom test runner', - timers: 'The configuration for fake timers.', transform: 'A map from regular expressions to paths to transformers', transformIgnorePatterns: 'An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation', diff --git a/packages/jest-config/src/ValidConfig.ts b/packages/jest-config/src/ValidConfig.ts index ddd9a6a9e38e..c270639e8765 100644 --- a/packages/jest-config/src/ValidConfig.ts +++ b/packages/jest-config/src/ValidConfig.ts @@ -49,6 +49,32 @@ const initialOptions: Config.InitialOptions = { errorOnDeprecated: false, expand: false, extensionsToTreatAsEsm: [], + fakeTimers: { + advanceTimeDelta: 1000, + enableGlobally: true, + legacyFakeTimers: false, + now: multipleValidOptions(0, new Date()), + shouldAdvanceTime: false, + shouldClearNativeTimers: false, + timerLimit: 1000, + toFake: [ + 'Date', + 'hrtime', + 'nextTick', + 'performance', + // 'queueMicrotask', + 'requestAnimationFrame', + 'cancelAnimationFrame', + 'requestIdleCallback', + 'cancelIdleCallback', + 'setImmediate', + 'clearImmediate', + 'setInterval', + 'clearInterval', + 'setTimeout', + 'clearTimeout', + ], + }, filter: '/filter.js', forceCoverageMatch: ['**/*.t.js'], forceExit: false, @@ -132,32 +158,6 @@ const initialOptions: Config.InitialOptions = { testRunner: 'circus', testSequencer: '@jest/test-sequencer', testTimeout: 5000, - timers: { - advanceTimeDelta: 1000, - enableGlobally: true, - legacyFakeTimers: false, - now: multipleValidOptions(0, new Date()), - shouldAdvanceTime: false, - shouldClearNativeTimers: false, - timerLimit: 1000, - toFake: [ - 'Date', - 'hrtime', - 'nextTick', - 'performance', - // 'queueMicrotask', - 'requestAnimationFrame', - 'cancelAnimationFrame', - 'requestIdleCallback', - 'cancelIdleCallback', - 'setImmediate', - 'clearImmediate', - 'setInterval', - 'clearInterval', - 'setTimeout', - 'clearTimeout', - ], - }, transform: { '\\.js$': '/preprocessor.js', }, diff --git a/packages/jest-config/src/index.ts b/packages/jest-config/src/index.ts index 229bdf750921..e44d23bc5f23 100644 --- a/packages/jest-config/src/index.ts +++ b/packages/jest-config/src/index.ts @@ -185,6 +185,7 @@ const groupOptions = ( displayName: options.displayName, errorOnDeprecated: options.errorOnDeprecated, extensionsToTreatAsEsm: options.extensionsToTreatAsEsm, + fakeTimers: options.fakeTimers, filter: options.filter, forceCoverageMatch: options.forceCoverageMatch, globalSetup: options.globalSetup, @@ -223,7 +224,6 @@ const groupOptions = ( testPathIgnorePatterns: options.testPathIgnorePatterns, testRegex: options.testRegex, testRunner: options.testRunner, - timers: options.timers, transform: options.transform, transformIgnorePatterns: options.transformIgnorePatterns, unmockedModulePathPatterns: options.unmockedModulePathPatterns, diff --git a/packages/jest-config/src/normalize.ts b/packages/jest-config/src/normalize.ts index 6a09c510435f..a07ec04a372a 100644 --- a/packages/jest-config/src/normalize.ts +++ b/packages/jest-config/src/normalize.ts @@ -980,6 +980,7 @@ export default async function normalize( case 'expand': case 'extensionsToTreatAsEsm': case 'globals': + case 'fakeTimers': case 'findRelatedTests': case 'forceCoverageMatch': case 'forceExit': @@ -1014,7 +1015,6 @@ export default async function normalize( case 'testFailureExitCode': case 'testLocationInResults': case 'testNamePattern': - case 'timers': case 'useStderr': case 'verbose': case 'watch': diff --git a/packages/jest-core/src/lib/__tests__/__snapshots__/logDebugMessages.test.ts.snap b/packages/jest-core/src/lib/__tests__/__snapshots__/logDebugMessages.test.ts.snap index ba360b2ff815..fb42e183f896 100644 --- a/packages/jest-core/src/lib/__tests__/__snapshots__/logDebugMessages.test.ts.snap +++ b/packages/jest-core/src/lib/__tests__/__snapshots__/logDebugMessages.test.ts.snap @@ -13,6 +13,9 @@ exports[`prints the config object 1`] = ` "detectOpenHandles": false, "errorOnDeprecated": false, "extensionsToTreatAsEsm": [], + "fakeTimers": { + "enableGlobally": false + }, "forceCoverageMatch": [], "globals": {}, "haste": {}, @@ -52,9 +55,6 @@ exports[`prints the config object 1`] = ` "\\\\.test\\\\.js$" ], "testRunner": "myRunner", - "timers": { - "enableGlobally": false - }, "transform": [], "transformIgnorePatterns": [], "watchPathIgnorePatterns": [] diff --git a/packages/jest-fake-timers/src/__tests__/modernFakeTimers.test.ts b/packages/jest-fake-timers/src/__tests__/modernFakeTimers.test.ts index 5facabc8041c..a2cddb4a871d 100644 --- a/packages/jest-fake-timers/src/__tests__/modernFakeTimers.test.ts +++ b/packages/jest-fake-timers/src/__tests__/modernFakeTimers.test.ts @@ -189,7 +189,7 @@ describe('FakeTimers', () => { } as unknown as typeof globalThis; const timers = new FakeTimers({ - config: makeProjectConfig({timers: {timerLimit: 100}}), + config: makeProjectConfig({fakeTimers: {timerLimit: 100}}), global, }); @@ -346,7 +346,7 @@ describe('FakeTimers', () => { setTimeout, } as unknown as typeof globalThis; const timers = new FakeTimers({ - config: makeProjectConfig({timers: {timerLimit: 1000}}), + config: makeProjectConfig({fakeTimers: {timerLimit: 1000}}), global, }); timers.useFakeTimers(); diff --git a/packages/jest-fake-timers/src/modernFakeTimers.ts b/packages/jest-fake-timers/src/modernFakeTimers.ts index e67f6280b32d..532b797ec9cc 100644 --- a/packages/jest-fake-timers/src/modernFakeTimers.ts +++ b/packages/jest-fake-timers/src/modernFakeTimers.ts @@ -15,7 +15,7 @@ import {formatStackTrace} from 'jest-message-util'; export default class FakeTimers { private _clock!: InstalledClock; - private _config: Config.ProjectConfig; + private _projectConfig: Config.ProjectConfig; private _fakingTime: boolean; private _global: typeof globalThis; private _fakeTimers: FakeTimerWithContext; @@ -28,7 +28,7 @@ export default class FakeTimers { config: Config.ProjectConfig; }) { this._global = global; - this._config = config; + this._projectConfig = config; this._fakingTime = false; this._fakeTimers = withGlobal(global); @@ -99,7 +99,7 @@ export default class FakeTimers { const resolvedTimersConfig = { now: Date.now(), toFake, - ...this._config.timers, + ...this._projectConfig.fakeTimers, ...fakeTimersConfig, } as Config.ModernFakeTimersConfig; @@ -150,7 +150,7 @@ export default class FakeTimers { 'enable fake timers globally using "timers" option in the Jest ' + `configuration file\nStack Trace:\n${formatStackTrace( new Error().stack!, - this._config, + this._projectConfig, {noStackTrace: false}, )}`, ); diff --git a/packages/jest-jasmine2/src/index.ts b/packages/jest-jasmine2/src/index.ts index 6a7928b9a124..e57fa6e036a7 100644 --- a/packages/jest-jasmine2/src/index.ts +++ b/packages/jest-jasmine2/src/index.ts @@ -88,8 +88,8 @@ export default async function jasmine2( environment.global.describe.skip = environment.global.xdescribe; environment.global.describe.only = environment.global.fdescribe; - if (config.timers.enableGlobally) { - if (!config.timers.legacyFakeTimers) { + if (config.fakeTimers.enableGlobally) { + if (!config.fakeTimers.legacyFakeTimers) { environment.fakeTimersModern!.useFakeTimers(); } else { environment.fakeTimers!.useFakeTimers(); @@ -108,7 +108,7 @@ export default async function jasmine2( if (config.resetMocks) { runtime.resetAllMocks(); - if (config.timers === 'legacy') { + if (config.fakeTimers.legacyFakeTimers) { environment.fakeTimers!.useFakeTimers(); } } diff --git a/packages/jest-runtime/src/index.ts b/packages/jest-runtime/src/index.ts index 60ac6605fcb5..2a0325f510eb 100644 --- a/packages/jest-runtime/src/index.ts +++ b/packages/jest-runtime/src/index.ts @@ -279,7 +279,7 @@ export default class Runtime { this._shouldUnmockTransitiveDependenciesCache = new Map(); this._transitiveShouldMock = new Map(); - this._fakeTimersImplementation = !config.timers.legacyFakeTimers + this._fakeTimersImplementation = !config.fakeTimers.legacyFakeTimers ? this._environment.fakeTimersModern : this._environment.fakeTimers; diff --git a/packages/jest-transform/src/__tests__/__snapshots__/ScriptTransformer.test.ts.snap b/packages/jest-transform/src/__tests__/__snapshots__/ScriptTransformer.test.ts.snap index fd927c2ce04b..582da17801e8 100644 --- a/packages/jest-transform/src/__tests__/__snapshots__/ScriptTransformer.test.ts.snap +++ b/packages/jest-transform/src/__tests__/__snapshots__/ScriptTransformer.test.ts.snap @@ -34,6 +34,9 @@ exports[`ScriptTransformer in async mode, passes expected transform options to g "displayName": undefined, "errorOnDeprecated": false, "extensionsToTreatAsEsm": Array [], + "fakeTimers": Object { + "enableGlobally": false, + }, "filter": undefined, "forceCoverageMatch": Array [], "globalSetup": undefined, @@ -76,9 +79,6 @@ exports[`ScriptTransformer in async mode, passes expected transform options to g "\\.test\\.js$", ], "testRunner": "jest-circus/runner", - "timers": Object { - "enableGlobally": false, - }, "transform": Array [ Array [ "\\.js$", @@ -94,7 +94,7 @@ exports[`ScriptTransformer in async mode, passes expected transform options to g "unmockedModulePathPatterns": undefined, "watchPathIgnorePatterns": Array [], }, - "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"enableGlobally":false},"transform":[["\\\\.js$","test_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", + "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"fakeTimers":{"enableGlobally":false},"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","transform":[["\\\\.js$","test_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", "coverageProvider": "babel", "instrument": true, "supportsDynamicImport": false, @@ -120,7 +120,7 @@ exports[`ScriptTransformer in async mode, uses the supplied async preprocessor 1 "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"enableGlobally":false},"transform":[["\\\\.js$","test_async_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"enableGlobally\\":false},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_async_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"fakeTimers":{"enableGlobally":false},"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","transform":[["\\\\.js$","test_async_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"fakeTimers\\":{\\"enableGlobally\\":false},\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_async_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; @@ -130,7 +130,7 @@ exports[`ScriptTransformer in async mode, uses the supplied preprocessor 1`] = ` "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"enableGlobally":false},"transform":[["\\\\.js$","test_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"enableGlobally\\":false},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"fakeTimers":{"enableGlobally":false},"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","transform":[["\\\\.js$","test_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"fakeTimers\\":{\\"enableGlobally\\":false},\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; @@ -167,6 +167,9 @@ exports[`ScriptTransformer passes expected transform options to getCacheKey 1`] "displayName": undefined, "errorOnDeprecated": false, "extensionsToTreatAsEsm": Array [], + "fakeTimers": Object { + "enableGlobally": false, + }, "filter": undefined, "forceCoverageMatch": Array [], "globalSetup": undefined, @@ -209,9 +212,6 @@ exports[`ScriptTransformer passes expected transform options to getCacheKey 1`] "\\.test\\.js$", ], "testRunner": "jest-circus/runner", - "timers": Object { - "enableGlobally": false, - }, "transform": Array [ Array [ "\\.js$", @@ -227,7 +227,7 @@ exports[`ScriptTransformer passes expected transform options to getCacheKey 1`] "unmockedModulePathPatterns": undefined, "watchPathIgnorePatterns": Array [], }, - "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"enableGlobally":false},"transform":[["\\\\.js$","test_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", + "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"fakeTimers":{"enableGlobally":false},"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","transform":[["\\\\.js$","test_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", "coverageProvider": "babel", "instrument": true, "supportsDynamicImport": false, @@ -274,6 +274,9 @@ exports[`ScriptTransformer passes expected transform options to getCacheKeyAsync "displayName": undefined, "errorOnDeprecated": false, "extensionsToTreatAsEsm": Array [], + "fakeTimers": Object { + "enableGlobally": false, + }, "filter": undefined, "forceCoverageMatch": Array [], "globalSetup": undefined, @@ -316,9 +319,6 @@ exports[`ScriptTransformer passes expected transform options to getCacheKeyAsync "\\.test\\.js$", ], "testRunner": "jest-circus/runner", - "timers": Object { - "enableGlobally": false, - }, "transform": Array [ Array [ "\\.js$", @@ -334,7 +334,7 @@ exports[`ScriptTransformer passes expected transform options to getCacheKeyAsync "unmockedModulePathPatterns": undefined, "watchPathIgnorePatterns": Array [], }, - "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"enableGlobally":false},"transform":[["\\\\.js$","test_async_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", + "configString": "{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"fakeTimers":{"enableGlobally":false},"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","transform":[["\\\\.js$","test_async_preprocessor",{"configKey":"configValue"}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]}", "coverageProvider": "babel", "instrument": true, "supportsDynamicImport": false, @@ -682,7 +682,7 @@ exports[`ScriptTransformer uses mixture of sync/async preprocessors 1`] = ` "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"enableGlobally":false},"transform":[["\\\\.js$","test_async_preprocessor",{}],["\\\\.css$","css-preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"enableGlobally\\":false},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_async_preprocessor\\",{}],[\\"\\\\\\\\.css$\\",\\"css-preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"fakeTimers":{"enableGlobally":false},"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","transform":[["\\\\.js$","test_async_preprocessor",{}],["\\\\.css$","css-preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"fakeTimers\\":{\\"enableGlobally\\":false},\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_async_preprocessor\\",{}],[\\"\\\\\\\\.css$\\",\\"css-preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; @@ -699,7 +699,7 @@ exports[`ScriptTransformer uses multiple preprocessors 1`] = ` "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"enableGlobally":false},"transform":[["\\\\.js$","test_preprocessor",{}],["\\\\.css$","css-preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"enableGlobally\\":false},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}],[\\"\\\\\\\\.css$\\",\\"css-preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"fakeTimers":{"enableGlobally":false},"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","transform":[["\\\\.js$","test_preprocessor",{}],["\\\\.css$","css-preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"fakeTimers\\":{\\"enableGlobally\\":false},\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}],[\\"\\\\\\\\.css$\\",\\"css-preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; @@ -716,7 +716,7 @@ exports[`ScriptTransformer uses the supplied preprocessor 1`] = ` "const TRANSFORMED = { filename: '/fruits/banana.js', script: 'module.exports = "banana";', - config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","timers":{"enableGlobally":false},"transform":[["\\\\.js$","test_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"timers\\":{\\"enableGlobally\\":false},\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', + config: '{"collectCoverage":false,"collectCoverageFrom":[],"coverageProvider":"babel","supportsDynamicImport":false,"supportsExportNamespaceFrom":false,"supportsStaticESM":false,"supportsTopLevelAwait":false,"instrument":false,"cacheFS":{},"config":{"automock":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extensionsToTreatAsEsm":[],"fakeTimers":{"enableGlobally":false},"forceCoverageMatch":[],"globals":{},"haste":{},"injectGlobals":true,"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","runtime":"/test_module_loader_path","sandboxInjectedGlobals":[],"setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotFormat":{},"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-circus/runner","transform":[["\\\\.js$","test_preprocessor",{}]],"transformIgnorePatterns":["/node_modules/"],"watchPathIgnorePatterns":[]},"configString":"{\\"automock\\":false,\\"cache\\":true,\\"cacheDirectory\\":\\"/cache/\\",\\"clearMocks\\":false,\\"coveragePathIgnorePatterns\\":[],\\"cwd\\":\\"/test_root_dir/\\",\\"detectLeaks\\":false,\\"detectOpenHandles\\":false,\\"errorOnDeprecated\\":false,\\"extensionsToTreatAsEsm\\":[],\\"fakeTimers\\":{\\"enableGlobally\\":false},\\"forceCoverageMatch\\":[],\\"globals\\":{},\\"haste\\":{},\\"injectGlobals\\":true,\\"moduleDirectories\\":[],\\"moduleFileExtensions\\":[\\"js\\"],\\"moduleNameMapper\\":[],\\"modulePathIgnorePatterns\\":[],\\"modulePaths\\":[],\\"name\\":\\"test\\",\\"prettierPath\\":\\"prettier\\",\\"resetMocks\\":false,\\"resetModules\\":false,\\"restoreMocks\\":false,\\"rootDir\\":\\"/\\",\\"roots\\":[],\\"runner\\":\\"jest-runner\\",\\"runtime\\":\\"/test_module_loader_path\\",\\"sandboxInjectedGlobals\\":[],\\"setupFiles\\":[],\\"setupFilesAfterEnv\\":[],\\"skipFilter\\":false,\\"skipNodeResolution\\":false,\\"slowTestThreshold\\":5,\\"snapshotFormat\\":{},\\"snapshotSerializers\\":[],\\"testEnvironment\\":\\"node\\",\\"testEnvironmentOptions\\":{},\\"testLocationInResults\\":false,\\"testMatch\\":[],\\"testPathIgnorePatterns\\":[],\\"testRegex\\":[\\"\\\\\\\\.test\\\\\\\\.js$\\"],\\"testRunner\\":\\"jest-circus/runner\\",\\"transform\\":[[\\"\\\\\\\\.js$\\",\\"test_preprocessor\\",{}]],\\"transformIgnorePatterns\\":[\\"/node_modules/\\"],\\"watchPathIgnorePatterns\\":[]}","transformerConfig":{}}', };" `; diff --git a/packages/jest-types/src/Config.ts b/packages/jest-types/src/Config.ts index 03755a4bf6a9..3dc7db06a27d 100644 --- a/packages/jest-types/src/Config.ts +++ b/packages/jest-types/src/Config.ts @@ -175,6 +175,7 @@ export type DefaultOptions = { errorOnDeprecated: boolean; expand: boolean; extensionsToTreatAsEsm: Array; + fakeTimers: FakeTimersConfig; forceCoverageMatch: Array; globals: ConfigGlobals; haste: HasteConfig; @@ -211,7 +212,6 @@ export type DefaultOptions = { testRegex: Array; testRunner: string; testSequencer: string; - timers: FakeTimersConfig; transformIgnorePatterns: Array; useStderr: boolean; watch: boolean; @@ -257,6 +257,7 @@ export type InitialOptions = Partial<{ displayName: string | DisplayName; expand: boolean; extensionsToTreatAsEsm: Array; + fakeTimers: FakeTimersConfig; filter: string; findRelatedTests: boolean; forceCoverageMatch: Array; @@ -340,7 +341,6 @@ export type InitialOptions = Partial<{ testRunner: string; testSequencer: string; testTimeout: number; - timers: FakeTimersConfig; transform: { [regex: string]: string | TransformerConfig; }; @@ -462,6 +462,7 @@ export type ProjectConfig = { displayName?: DisplayName; errorOnDeprecated: boolean; extensionsToTreatAsEsm: Array; + fakeTimers: FakeTimersConfig; filter?: string; forceCoverageMatch: Array; globalSetup?: string; @@ -500,7 +501,6 @@ export type ProjectConfig = { testPathIgnorePatterns: Array; testRegex: Array; testRunner: string; - timers: FakeTimersConfig; transform: Array<[string, string, Record]>; transformIgnorePatterns: Array; watchPathIgnorePatterns: Array; @@ -533,6 +533,7 @@ export type Argv = Arguments< debug: boolean; env: string; expand: boolean; + fakeTimers: string; findRelatedTests: boolean; forceExit: boolean; globals: string; @@ -585,7 +586,6 @@ export type Argv = Arguments< testRunner: string; testSequencer: string; testTimeout: number | null | undefined; - timers: string; transform: string; transformIgnorePatterns: Array; unmockedModulePathPatterns: Array | null | undefined; diff --git a/packages/jest-validate/src/__tests__/fixtures/jestConfig.ts b/packages/jest-validate/src/__tests__/fixtures/jestConfig.ts index 6f2b022d2ee8..bcc54ead1baf 100644 --- a/packages/jest-validate/src/__tests__/fixtures/jestConfig.ts +++ b/packages/jest-validate/src/__tests__/fixtures/jestConfig.ts @@ -28,6 +28,7 @@ const defaultConfig = { coveragePathIgnorePatterns: [NODE_MODULES_REGEXP], coverageReporters: ['json', 'text', 'lcov', 'clover'], expand: false, + fakeTimers: {enableGlobally: false}, globals: {}, haste: {}, moduleDirectories: ['node_modules'], @@ -48,7 +49,6 @@ const defaultConfig = { testPathIgnorePatterns: [NODE_MODULES_REGEXP], testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.[jt]sx?$', testResultsProcessor: null, - timers: 'real', transformIgnorePatterns: [NODE_MODULES_REGEXP], useStderr: false, verbose: null, @@ -77,6 +77,7 @@ const validConfig = { }, }, expand: false, + fakeTimers: {enableGlobally: false}, forceExit: false, globals: {}, haste: {}, @@ -111,7 +112,6 @@ const validConfig = { testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.[jt]sx?$', testResultsProcessor: 'processor-node-module', testRunner: 'circus', - timers: 'real', transform: { '\\.js$': '/preprocessor.js', }, diff --git a/packages/test-utils/src/config.ts b/packages/test-utils/src/config.ts index b6c8deb6f106..448547d46749 100644 --- a/packages/test-utils/src/config.ts +++ b/packages/test-utils/src/config.ts @@ -78,6 +78,7 @@ const DEFAULT_PROJECT_CONFIG: Config.ProjectConfig = { displayName: undefined, errorOnDeprecated: false, extensionsToTreatAsEsm: [], + fakeTimers: {enableGlobally: false}, filter: undefined, forceCoverageMatch: [], globalSetup: undefined, @@ -116,7 +117,6 @@ const DEFAULT_PROJECT_CONFIG: Config.ProjectConfig = { testPathIgnorePatterns: [], testRegex: ['\\.test\\.js$'], testRunner: 'jest-circus/runner', - timers: {enableGlobally: false}, transform: [], transformIgnorePatterns: [], unmockedModulePathPatterns: undefined, From 1e33ec078118a278a2ea2a5881eae35c947b9073 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Tue, 15 Mar 2022 13:55:40 +0200 Subject: [PATCH 18/69] fix resetAllMocks and resetMocks e2e tests --- e2e/__tests__/fakeTimersLegacy.test.ts | 12 +++++++++ e2e/__tests__/fakeTimersResetMocks.test.ts | 18 ------------- .../enable-globally/package.json | 3 +-- .../__tests__/resetAllMocks.test.js | 23 +++++++++++++++++ .../reset-all-mocks/package.json | 6 +++++ .../reset-mocks/__tests__/resetMocks.test.js} | 8 +++++- .../reset-mocks/package.json | 6 +++++ .../__tests__/legacyFakeTimers.test.js | 20 +++++++++++++++ .../without-enable-globally/package.json | 5 ++++ .../after-reset-all-mocks/package.json | 6 ----- .../timerAndMock.test.js | 25 ------------------- .../with-reset-mocks/index.js | 8 ------ .../with-reset-mocks/package.json | 7 ------ .../with-reset-mocks/timerWithMock.test.js | 16 ------------ packages/jest-runtime/src/index.ts | 6 ++++- 15 files changed, 85 insertions(+), 84 deletions(-) delete mode 100644 e2e/__tests__/fakeTimersResetMocks.test.ts create mode 100644 e2e/fake-timers-legacy/reset-all-mocks/__tests__/resetAllMocks.test.js create mode 100644 e2e/fake-timers-legacy/reset-all-mocks/package.json rename e2e/{fake-timers-reset-mocks/after-reset-all-mocks/index.js => fake-timers-legacy/reset-mocks/__tests__/resetMocks.test.js} (52%) create mode 100644 e2e/fake-timers-legacy/reset-mocks/package.json create mode 100644 e2e/fake-timers-legacy/without-enable-globally/__tests__/legacyFakeTimers.test.js create mode 100644 e2e/fake-timers-legacy/without-enable-globally/package.json delete mode 100644 e2e/fake-timers-reset-mocks/after-reset-all-mocks/package.json delete mode 100644 e2e/fake-timers-reset-mocks/after-reset-all-mocks/timerAndMock.test.js delete mode 100644 e2e/fake-timers-reset-mocks/with-reset-mocks/index.js delete mode 100644 e2e/fake-timers-reset-mocks/with-reset-mocks/package.json delete mode 100644 e2e/fake-timers-reset-mocks/with-reset-mocks/timerWithMock.test.js diff --git a/e2e/__tests__/fakeTimersLegacy.test.ts b/e2e/__tests__/fakeTimersLegacy.test.ts index 833074cfba22..72c7489e829c 100644 --- a/e2e/__tests__/fakeTimersLegacy.test.ts +++ b/e2e/__tests__/fakeTimersLegacy.test.ts @@ -31,3 +31,15 @@ describe('requestAnimationFrame', () => { expect(result.exitCode).toBe(0); }); }); + +describe('when mocks are reset', () => { + test('calling resetAllMocks does not break tests', () => { + const result = runJest('fake-timers-legacy/reset-all-mocks'); + expect(result.exitCode).toBe(0); + }); + + test('setting resetMocks in Jest config does not break tests', () => { + const result = runJest('fake-timers-legacy/reset-mocks'); + expect(result.exitCode).toBe(0); + }); +}); diff --git a/e2e/__tests__/fakeTimersResetMocks.test.ts b/e2e/__tests__/fakeTimersResetMocks.test.ts deleted file mode 100644 index 586f50826886..000000000000 --- a/e2e/__tests__/fakeTimersResetMocks.test.ts +++ /dev/null @@ -1,18 +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. - */ - -import runJest from '../runJest'; - -test('run timers after resetAllMocks test', () => { - const result = runJest('fake-timers-reset-mocks/after-reset-all-mocks'); - expect(result.exitCode).toBe(0); -}); - -test('run timers with resetMocks in config test', () => { - const result = runJest('fake-timers-reset-mocks/with-reset-mocks'); - expect(result.exitCode).toBe(0); -}); diff --git a/e2e/fake-timers-legacy/enable-globally/package.json b/e2e/fake-timers-legacy/enable-globally/package.json index 4c86b0be06e5..543e40eb7fba 100644 --- a/e2e/fake-timers-legacy/enable-globally/package.json +++ b/e2e/fake-timers-legacy/enable-globally/package.json @@ -1,6 +1,5 @@ { "jest": { - "fakeTimers": {"enableGlobally": true, "legacyFakeTimers": true}, - "testEnvironment": "node" + "fakeTimers": {"enableGlobally": true, "legacyFakeTimers": true} } } diff --git a/e2e/fake-timers-legacy/reset-all-mocks/__tests__/resetAllMocks.test.js b/e2e/fake-timers-legacy/reset-all-mocks/__tests__/resetAllMocks.test.js new file mode 100644 index 000000000000..912f751164c6 --- /dev/null +++ b/e2e/fake-timers-legacy/reset-all-mocks/__tests__/resetAllMocks.test.js @@ -0,0 +1,23 @@ +/** + * 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. + */ + +test('works before resetAllMocks is called', () => { + jest.useFakeTimers(); + const f = jest.fn(); + setTimeout(f, 0); + jest.runAllTimers(); + expect(f).toHaveBeenCalledTimes(1); +}); + +test('works after resetAllMocks is called', () => { + jest.resetAllMocks(); + jest.useFakeTimers(); + const f = jest.fn(); + setTimeout(f, 0); + jest.runAllTimers(); + expect(f).toHaveBeenCalledTimes(1); +}); diff --git a/e2e/fake-timers-legacy/reset-all-mocks/package.json b/e2e/fake-timers-legacy/reset-all-mocks/package.json new file mode 100644 index 000000000000..d87227b64ad0 --- /dev/null +++ b/e2e/fake-timers-legacy/reset-all-mocks/package.json @@ -0,0 +1,6 @@ +{ + "jest": { + "fakeTimers": {"legacyFakeTimers": true}, + "resetMocks": false + } +} diff --git a/e2e/fake-timers-reset-mocks/after-reset-all-mocks/index.js b/e2e/fake-timers-legacy/reset-mocks/__tests__/resetMocks.test.js similarity index 52% rename from e2e/fake-timers-reset-mocks/after-reset-all-mocks/index.js rename to e2e/fake-timers-legacy/reset-mocks/__tests__/resetMocks.test.js index 3f40dc0d6bd1..fa1595126a87 100644 --- a/e2e/fake-timers-reset-mocks/after-reset-all-mocks/index.js +++ b/e2e/fake-timers-legacy/reset-mocks/__tests__/resetMocks.test.js @@ -5,4 +5,10 @@ * LICENSE file in the root directory of this source tree. */ -module.exports = () => {}; +test('works when resetMocks is set in Jest config', () => { + jest.useFakeTimers(); + const f = jest.fn(); + setTimeout(f, 0); + jest.runAllTimers(); + expect(f).toHaveBeenCalledTimes(1); +}); diff --git a/e2e/fake-timers-legacy/reset-mocks/package.json b/e2e/fake-timers-legacy/reset-mocks/package.json new file mode 100644 index 000000000000..c9a5c3dfbafa --- /dev/null +++ b/e2e/fake-timers-legacy/reset-mocks/package.json @@ -0,0 +1,6 @@ +{ + "jest": { + "fakeTimers": {"legacyFakeTimers": true}, + "resetMocks": true + } +} diff --git a/e2e/fake-timers-legacy/without-enable-globally/__tests__/legacyFakeTimers.test.js b/e2e/fake-timers-legacy/without-enable-globally/__tests__/legacyFakeTimers.test.js new file mode 100644 index 000000000000..b06d5e7152c2 --- /dev/null +++ b/e2e/fake-timers-legacy/without-enable-globally/__tests__/legacyFakeTimers.test.js @@ -0,0 +1,20 @@ +/** + * 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'; + +test('fake timers', () => { + jest.useFakeTimers(); + const f = jest.fn(); + setTimeout(f, 0); + jest.runAllTimers(); + expect(f).toHaveBeenCalledTimes(1); + + expect(() => jest.setSystemTime(0)).toThrow( + 'jest.setSystemTime() is not available when using legacy fake timers.', + ); +}); diff --git a/e2e/fake-timers-legacy/without-enable-globally/package.json b/e2e/fake-timers-legacy/without-enable-globally/package.json new file mode 100644 index 000000000000..175a8e97391f --- /dev/null +++ b/e2e/fake-timers-legacy/without-enable-globally/package.json @@ -0,0 +1,5 @@ +{ + "jest": { + "fakeTimers": {"legacyFakeTimers": true} + } +} diff --git a/e2e/fake-timers-reset-mocks/after-reset-all-mocks/package.json b/e2e/fake-timers-reset-mocks/after-reset-all-mocks/package.json deleted file mode 100644 index 24b23cafe0e3..000000000000 --- a/e2e/fake-timers-reset-mocks/after-reset-all-mocks/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "jest": { - "testEnvironment": "node", - "resetMocks": false - } -} diff --git a/e2e/fake-timers-reset-mocks/after-reset-all-mocks/timerAndMock.test.js b/e2e/fake-timers-reset-mocks/after-reset-all-mocks/timerAndMock.test.js deleted file mode 100644 index 67c095a6f57f..000000000000 --- a/e2e/fake-timers-reset-mocks/after-reset-all-mocks/timerAndMock.test.js +++ /dev/null @@ -1,25 +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. - */ - -describe('timers', () => { - it('should work before calling resetAllMocks', () => { - jest.useFakeTimers(); - const f = jest.fn(); - setTimeout(f, 0); - jest.runAllTimers(); - expect(f).toHaveBeenCalledTimes(1); - }); - - it('should not break after calling resetAllMocks', () => { - jest.resetAllMocks(); - jest.useFakeTimers(); - const f = jest.fn(); - setTimeout(f, 0); - jest.runAllTimers(); - expect(f).toHaveBeenCalledTimes(1); - }); -}); diff --git a/e2e/fake-timers-reset-mocks/with-reset-mocks/index.js b/e2e/fake-timers-reset-mocks/with-reset-mocks/index.js deleted file mode 100644 index 3f40dc0d6bd1..000000000000 --- a/e2e/fake-timers-reset-mocks/with-reset-mocks/index.js +++ /dev/null @@ -1,8 +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. - */ - -module.exports = () => {}; diff --git a/e2e/fake-timers-reset-mocks/with-reset-mocks/package.json b/e2e/fake-timers-reset-mocks/with-reset-mocks/package.json deleted file mode 100644 index 353a77de2693..000000000000 --- a/e2e/fake-timers-reset-mocks/with-reset-mocks/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "jest": { - "fakeTimers": {"enableGlobally": true}, - "resetMocks": true, - "testEnvironment": "node" - } -} diff --git a/e2e/fake-timers-reset-mocks/with-reset-mocks/timerWithMock.test.js b/e2e/fake-timers-reset-mocks/with-reset-mocks/timerWithMock.test.js deleted file mode 100644 index d45bb7b54ed5..000000000000 --- a/e2e/fake-timers-reset-mocks/with-reset-mocks/timerWithMock.test.js +++ /dev/null @@ -1,16 +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. - */ - -describe('timers', () => { - it('should work before calling resetAllMocks', () => { - const f = jest.fn(); - jest.useFakeTimers(); - setTimeout(f, 0); - jest.runAllTimers(); - expect(f).toHaveBeenCalledTimes(1); - }); -}); diff --git a/packages/jest-runtime/src/index.ts b/packages/jest-runtime/src/index.ts index 2a0325f510eb..3300812ef169 100644 --- a/packages/jest-runtime/src/index.ts +++ b/packages/jest-runtime/src/index.ts @@ -2065,7 +2065,11 @@ export default class Runtime { return this._fakeTimersImplementation!; }; const useFakeTimers: Jest['useFakeTimers'] = fakeTimersConfig => { - if (!fakeTimersConfig?.legacyFakeTimers) { + const resolvedFakeTimersConfig = { + ...this._config.fakeTimers, + ...fakeTimersConfig, + }; + if (!resolvedFakeTimersConfig?.legacyFakeTimers) { this._fakeTimersImplementation = this._environment.fakeTimersModern; } else { this._fakeTimersImplementation = this._environment.fakeTimers; From 8df6ae50d38acbc21129a0a8f2dc0f23e7abe4fc Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Tue, 15 Mar 2022 14:00:24 +0200 Subject: [PATCH 19/69] legacyFakeTimers test --- e2e/__tests__/fakeTimersLegacy.test.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/e2e/__tests__/fakeTimersLegacy.test.ts b/e2e/__tests__/fakeTimersLegacy.test.ts index 72c7489e829c..8ea0e996f93d 100644 --- a/e2e/__tests__/fakeTimersLegacy.test.ts +++ b/e2e/__tests__/fakeTimersLegacy.test.ts @@ -8,12 +8,19 @@ import runJest from '../runJest'; describe('enableGlobally', () => { - test('enables legacy fake timers from Jest Config', () => { + test('enables legacy fake timers from Jest config', () => { const result = runJest('fake-timers-legacy/enable-globally'); expect(result.exitCode).toBe(0); }); }); +describe('legacyFakeTimers', () => { + test('toggles legacy fake timers from Jest config', () => { + const result = runJest('fake-timers-legacy/without-enable-globally'); + expect(result.exitCode).toBe(0); + }); +}); + describe('useFakeTimers', () => { test('enables legacy fake timers from Jest Object', () => { const result = runJest('fake-timers-legacy/use-fake-timers'); From 78225a55e916ac88e3d148e8894c2aaae4a874eb Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Tue, 15 Mar 2022 14:43:10 +0200 Subject: [PATCH 20/69] add timerLimit test --- e2e/__tests__/fakeTimers.test.ts | 5 +++++ e2e/fake-timers/enable-globally/package.json | 3 +-- e2e/fake-timers/set-immediate/package.json | 3 +-- .../timer-limit/__tests__/timerLimit.test.js | 22 +++++++++++++++++++ e2e/fake-timers/timer-limit/package.json | 5 +++++ e2e/fake-timers/use-real-timers/package.json | 3 +-- packages/jest-types/src/Config.ts | 4 ++-- 7 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 e2e/fake-timers/timer-limit/__tests__/timerLimit.test.js create mode 100644 e2e/fake-timers/timer-limit/package.json diff --git a/e2e/__tests__/fakeTimers.test.ts b/e2e/__tests__/fakeTimers.test.ts index a1e3a76705e1..cb3e90fabea7 100644 --- a/e2e/__tests__/fakeTimers.test.ts +++ b/e2e/__tests__/fakeTimers.test.ts @@ -19,6 +19,11 @@ describe('useFakeTimers', () => { const result = runJest('fake-timers/use-fake-timers'); expect(result.exitCode).toBe(0); }); + + test('allows to pass timerLimit option', () => { + const result = runJest('fake-timers/timer-limit'); + expect(result.exitCode).toBe(0); + }); }); describe('useRealTimers', () => { diff --git a/e2e/fake-timers/enable-globally/package.json b/e2e/fake-timers/enable-globally/package.json index 348aedebac3b..2883cedbce8f 100644 --- a/e2e/fake-timers/enable-globally/package.json +++ b/e2e/fake-timers/enable-globally/package.json @@ -1,6 +1,5 @@ { "jest": { - "fakeTimers": {"enableGlobally": true}, - "testEnvironment": "node" + "fakeTimers": {"enableGlobally": true} } } diff --git a/e2e/fake-timers/set-immediate/package.json b/e2e/fake-timers/set-immediate/package.json index 348aedebac3b..2883cedbce8f 100644 --- a/e2e/fake-timers/set-immediate/package.json +++ b/e2e/fake-timers/set-immediate/package.json @@ -1,6 +1,5 @@ { "jest": { - "fakeTimers": {"enableGlobally": true}, - "testEnvironment": "node" + "fakeTimers": {"enableGlobally": true} } } diff --git a/e2e/fake-timers/timer-limit/__tests__/timerLimit.test.js b/e2e/fake-timers/timer-limit/__tests__/timerLimit.test.js new file mode 100644 index 000000000000..e830f77aed36 --- /dev/null +++ b/e2e/fake-timers/timer-limit/__tests__/timerLimit.test.js @@ -0,0 +1,22 @@ +/** + * 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'; + +test('timerLimit test', () => { + jest.useFakeTimers({timerLimit: 10}); + + setTimeout(function infinitelyRecursingCallback() { + setTimeout(infinitelyRecursingCallback, 0); + }, 0); + + expect(() => { + jest.runAllTimers(); + }).toThrow( + new Error('Aborting after running 10 timers, assuming an infinite loop!'), + ); +}); diff --git a/e2e/fake-timers/timer-limit/package.json b/e2e/fake-timers/timer-limit/package.json new file mode 100644 index 000000000000..148788b25446 --- /dev/null +++ b/e2e/fake-timers/timer-limit/package.json @@ -0,0 +1,5 @@ +{ + "jest": { + "testEnvironment": "node" + } +} diff --git a/e2e/fake-timers/use-real-timers/package.json b/e2e/fake-timers/use-real-timers/package.json index 348aedebac3b..2883cedbce8f 100644 --- a/e2e/fake-timers/use-real-timers/package.json +++ b/e2e/fake-timers/use-real-timers/package.json @@ -1,6 +1,5 @@ { "jest": { - "fakeTimers": {"enableGlobally": true}, - "testEnvironment": "node" + "fakeTimers": {"enableGlobally": true} } } diff --git a/packages/jest-types/src/Config.ts b/packages/jest-types/src/Config.ts index 3dc7db06a27d..2f2f3a01d38f 100644 --- a/packages/jest-types/src/Config.ts +++ b/packages/jest-types/src/Config.ts @@ -44,7 +44,7 @@ export type LegacyFakeTimersConfig = { * Use the old fake timers implementation instead of one backed by `@sinonjs/fake-timers`. * * @defaultValue - * The default is `'false'`. + * The default is `false`. */ legacyFakeTimers?: true; }; @@ -105,7 +105,7 @@ export type ModernFakeTimersConfig = { * Use the old fake timers implementation instead of one backed by `@sinonjs/fake-timers`. * * @defaultValue - * The default is `'false'`. + * The default is `false`. */ legacyFakeTimers?: false; }; From c61f4dab18cce843eebad13788be546654b5c595 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Tue, 15 Mar 2022 17:14:43 +0200 Subject: [PATCH 21/69] fix timerLimit --- .../timer-limit/__tests__/timerLimit.test.js | 32 ++++++++++++- e2e/fake-timers/timer-limit/package.json | 2 +- .../jest-fake-timers/src/modernFakeTimers.ts | 46 ++++++++++--------- packages/jest-runtime/src/index.ts | 2 +- 4 files changed, 56 insertions(+), 26 deletions(-) diff --git a/e2e/fake-timers/timer-limit/__tests__/timerLimit.test.js b/e2e/fake-timers/timer-limit/__tests__/timerLimit.test.js index e830f77aed36..7f326e93f54c 100644 --- a/e2e/fake-timers/timer-limit/__tests__/timerLimit.test.js +++ b/e2e/fake-timers/timer-limit/__tests__/timerLimit.test.js @@ -7,8 +7,8 @@ 'use strict'; -test('timerLimit test', () => { - jest.useFakeTimers({timerLimit: 10}); +test('reads timerLimit from Jest config', () => { + jest.useFakeTimers(); setTimeout(function infinitelyRecursingCallback() { setTimeout(infinitelyRecursingCallback, 0); @@ -20,3 +20,31 @@ test('timerLimit test', () => { new Error('Aborting after running 10 timers, assuming an infinite loop!'), ); }); + +test('allows to override timerLimit set via Jest config', () => { + jest.useFakeTimers({timerLimit: 100}); + + setTimeout(function infinitelyRecursingCallback() { + setTimeout(infinitelyRecursingCallback, 0); + }, 0); + + expect(() => { + jest.runAllTimers(); + }).toThrow( + new Error('Aborting after running 100 timers, assuming an infinite loop!'), + ); +}); + +test('allows to override timerLimit set via Jest object', () => { + jest.useFakeTimers({timerLimit: 1000}); + + setTimeout(function infinitelyRecursingCallback() { + setTimeout(infinitelyRecursingCallback, 0); + }, 0); + + expect(() => { + jest.runAllTimers(); + }).toThrow( + new Error('Aborting after running 1000 timers, assuming an infinite loop!'), + ); +}); diff --git a/e2e/fake-timers/timer-limit/package.json b/e2e/fake-timers/timer-limit/package.json index 148788b25446..1a2303eb7a80 100644 --- a/e2e/fake-timers/timer-limit/package.json +++ b/e2e/fake-timers/timer-limit/package.json @@ -1,5 +1,5 @@ { "jest": { - "testEnvironment": "node" + "fakeTimers": {"enableGlobally": true, "timerLimit": 10} } } diff --git a/packages/jest-fake-timers/src/modernFakeTimers.ts b/packages/jest-fake-timers/src/modernFakeTimers.ts index 532b797ec9cc..e4310a49d255 100644 --- a/packages/jest-fake-timers/src/modernFakeTimers.ts +++ b/packages/jest-fake-timers/src/modernFakeTimers.ts @@ -91,29 +91,31 @@ export default class FakeTimers { } useFakeTimers(fakeTimersConfig?: Config.FakeTimersConfig): void { - if (!this._fakingTime) { - const toFake = Object.keys(this._fakeTimers.timers) as Array< - keyof FakeTimerWithContext['timers'] - >; - - const resolvedTimersConfig = { - now: Date.now(), - toFake, - ...this._projectConfig.fakeTimers, - ...fakeTimersConfig, - } as Config.ModernFakeTimersConfig; - - this._clock = this._fakeTimers.install({ - advanceTimeDelta: resolvedTimersConfig.advanceTimeDelta, - loopLimit: resolvedTimersConfig.timerLimit, - now: resolvedTimersConfig.now, - shouldAdvanceTime: resolvedTimersConfig.shouldAdvanceTime, - shouldClearNativeTimers: resolvedTimersConfig.shouldClearNativeTimers, - toFake: resolvedTimersConfig.toFake, - }); - - this._fakingTime = true; + if (this._fakingTime) { + this._clock.uninstall(); } + + const toFake = Object.keys(this._fakeTimers.timers) as Array< + keyof FakeTimerWithContext['timers'] + >; + + const resolvedTimersConfig = { + now: Date.now(), + toFake, + ...this._projectConfig.fakeTimers, + ...fakeTimersConfig, + } as Config.ModernFakeTimersConfig; + + this._clock = this._fakeTimers.install({ + advanceTimeDelta: resolvedTimersConfig.advanceTimeDelta, + loopLimit: resolvedTimersConfig.timerLimit, + now: resolvedTimersConfig.now, + shouldAdvanceTime: resolvedTimersConfig.shouldAdvanceTime, + shouldClearNativeTimers: resolvedTimersConfig.shouldClearNativeTimers, + toFake: resolvedTimersConfig.toFake, + }); + + this._fakingTime = true; } reset(): void { diff --git a/packages/jest-runtime/src/index.ts b/packages/jest-runtime/src/index.ts index 3300812ef169..e826ebd4c2a2 100644 --- a/packages/jest-runtime/src/index.ts +++ b/packages/jest-runtime/src/index.ts @@ -2074,7 +2074,7 @@ export default class Runtime { } else { this._fakeTimersImplementation = this._environment.fakeTimers; } - this._fakeTimersImplementation!.useFakeTimers(fakeTimersConfig); + this._fakeTimersImplementation!.useFakeTimers(resolvedFakeTimersConfig); return jestObject; }; const useRealTimers = () => { From c96a4c94b42a9dcf7919f07388337b89e5cc3df6 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Tue, 15 Mar 2022 18:24:43 +0200 Subject: [PATCH 22/69] add deprecation warning --- packages/jest-config/src/Deprecated.ts | 6 +++++ .../__snapshots__/normalize.test.ts.snap | 24 +++++++++++++++++++ .../src/__tests__/normalize.test.ts | 18 ++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/packages/jest-config/src/Deprecated.ts b/packages/jest-config/src/Deprecated.ts index 4568d7fed3c0..905d3ebdde5b 100644 --- a/packages/jest-config/src/Deprecated.ts +++ b/packages/jest-config/src/Deprecated.ts @@ -94,6 +94,12 @@ const deprecatedOptions: DeprecatedOptions = { )}. Please update your configuration.`, + + timers: (_options: {timers?: string}) => ` Option ${chalk.bold( + '"timers"', + )} was replaced by ${chalk.bold('"fakeTimers"')}. + + Please update your configuration.`, }; export default deprecatedOptions; diff --git a/packages/jest-config/src/__tests__/__snapshots__/normalize.test.ts.snap b/packages/jest-config/src/__tests__/__snapshots__/normalize.test.ts.snap index 46538f039b17..a3d700f5b943 100644 --- a/packages/jest-config/src/__tests__/__snapshots__/normalize.test.ts.snap +++ b/packages/jest-config/src/__tests__/__snapshots__/normalize.test.ts.snap @@ -301,6 +301,30 @@ exports[`testURL logs a deprecation warning when \`testURL\` is used 1`] = ` } `; +exports[`timers logs a deprecation warning when \`timers\` is used 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + " Deprecation Warning: + + Option "timers" was replaced by "fakeTimers". + + Please update your configuration. + + Configuration Documentation: + https://jestjs.io/docs/configuration +", + ], + ], + "results": Array [ + Object { + "type": "return", + "value": undefined, + }, + ], +} +`; + exports[`watchPlugins throw error when a watch plugin is not found 1`] = ` "Validation Error: diff --git a/packages/jest-config/src/__tests__/normalize.test.ts b/packages/jest-config/src/__tests__/normalize.test.ts index ccca146c1c54..4240d1a9125a 100644 --- a/packages/jest-config/src/__tests__/normalize.test.ts +++ b/packages/jest-config/src/__tests__/normalize.test.ts @@ -1937,6 +1937,24 @@ describe('testURL', () => { }); }); +describe('timers', () => { + beforeEach(() => { + jest.mocked(console.warn).mockImplementation(() => {}); + }); + + it('logs a deprecation warning when `timers` is used', async () => { + await normalize( + { + rootDir: '/root/', + timers: 'real', + }, + {} as Config.Argv, + ); + + expect(console.warn).toMatchSnapshot(); + }); +}); + describe('extraGlobals', () => { beforeEach(() => { jest.mocked(console.warn).mockImplementation(() => {}); From 37267012e1cc3fb5a20af7a4ad7c7bb1dfef695c Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Tue, 15 Mar 2022 21:29:57 +0200 Subject: [PATCH 23/69] implement advanceTimers option --- docs/JestObjectAPI.md | 5 -- e2e/__tests__/fakeTimers.test.ts | 5 ++ .../__tests__/advanceTimers.test.js | 43 +++++++++++++++ e2e/fake-timers/advance-timers/package.json | 3 ++ packages/jest-config/src/ValidConfig.ts | 4 +- .../jest-fake-timers/src/modernFakeTimers.ts | 52 ++++++++++++------- packages/jest-runtime/src/index.ts | 6 +-- packages/jest-types/src/Config.ts | 34 +++--------- 8 files changed, 96 insertions(+), 56 deletions(-) create mode 100644 e2e/fake-timers/advance-timers/__tests__/advanceTimers.test.js create mode 100644 e2e/fake-timers/advance-timers/package.json diff --git a/docs/JestObjectAPI.md b/docs/JestObjectAPI.md index 6607aa9230f2..b8b439319e97 100644 --- a/docs/JestObjectAPI.md +++ b/docs/JestObjectAPI.md @@ -675,11 +675,6 @@ type FakeTimersConfig = { doNotFake?: Array; /** Sets current system time to be used by fake timers. The default is `Date.now()`. */ now?: number | Date; - /** - * Forwards clear timer calls to native functions if they are not fakes. - * The default is `false`. - */ - shouldClearNativeTimers?: boolean; /** Maximum number of timers that will be run. The default is `100_000` timers. */ timerLimit?: number; }; diff --git a/e2e/__tests__/fakeTimers.test.ts b/e2e/__tests__/fakeTimers.test.ts index cb3e90fabea7..07d79d757cdf 100644 --- a/e2e/__tests__/fakeTimers.test.ts +++ b/e2e/__tests__/fakeTimers.test.ts @@ -20,6 +20,11 @@ describe('useFakeTimers', () => { expect(result.exitCode).toBe(0); }); + test('allows to pass advanceTimers option', () => { + const result = runJest('fake-timers/advance-timers'); + expect(result.exitCode).toBe(0); + }); + test('allows to pass timerLimit option', () => { const result = runJest('fake-timers/timer-limit'); expect(result.exitCode).toBe(0); diff --git a/e2e/fake-timers/advance-timers/__tests__/advanceTimers.test.js b/e2e/fake-timers/advance-timers/__tests__/advanceTimers.test.js new file mode 100644 index 000000000000..c62b7cda7260 --- /dev/null +++ b/e2e/fake-timers/advance-timers/__tests__/advanceTimers.test.js @@ -0,0 +1,43 @@ +/** + * 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'; + +test('advances timers if true is passed', done => { + jest.useFakeTimers({advanceTimers: true}); + + const start = Date.now(); + + setTimeout(() => { + done(); + expect(Date.now() - start).toEqual(45); + }, 45); +}); + +test('advances timers if a number is passed', done => { + jest.useFakeTimers({advanceTimers: 40}); + + const start = Date.now(); + + setTimeout(() => { + done(); + expect(Date.now() - start).toEqual(35); + }, 35); +}); + +test('works with `now` option', done => { + jest.useFakeTimers({advanceTimers: 30, now: new Date('2015-09-25')}); + + expect(Date.now()).toEqual(1443139200000); + + const start = Date.now(); + + setTimeout(() => { + done(); + expect(Date.now() - start).toEqual(25); + }, 25); +}); diff --git a/e2e/fake-timers/advance-timers/package.json b/e2e/fake-timers/advance-timers/package.json new file mode 100644 index 000000000000..19979034fc88 --- /dev/null +++ b/e2e/fake-timers/advance-timers/package.json @@ -0,0 +1,3 @@ +{ + "name": "advance-timers" +} diff --git a/packages/jest-config/src/ValidConfig.ts b/packages/jest-config/src/ValidConfig.ts index c270639e8765..d5a039a01e1d 100644 --- a/packages/jest-config/src/ValidConfig.ts +++ b/packages/jest-config/src/ValidConfig.ts @@ -50,12 +50,10 @@ const initialOptions: Config.InitialOptions = { expand: false, extensionsToTreatAsEsm: [], fakeTimers: { - advanceTimeDelta: 1000, + advanceTimers: multipleValidOptions(40, true), enableGlobally: true, legacyFakeTimers: false, now: multipleValidOptions(0, new Date()), - shouldAdvanceTime: false, - shouldClearNativeTimers: false, timerLimit: 1000, toFake: [ 'Date', diff --git a/packages/jest-fake-timers/src/modernFakeTimers.ts b/packages/jest-fake-timers/src/modernFakeTimers.ts index e4310a49d255..b4c5737e8b72 100644 --- a/packages/jest-fake-timers/src/modernFakeTimers.ts +++ b/packages/jest-fake-timers/src/modernFakeTimers.ts @@ -8,6 +8,7 @@ import { FakeTimerWithContext, InstalledClock, + FakeTimerInstallOpts as SinonFakeTimersConfig, withGlobal, } from '@sinonjs/fake-timers'; import type {Config} from '@jest/types'; @@ -95,25 +96,38 @@ export default class FakeTimers { this._clock.uninstall(); } - const toFake = Object.keys(this._fakeTimers.timers) as Array< - keyof FakeTimerWithContext['timers'] - >; - - const resolvedTimersConfig = { - now: Date.now(), - toFake, - ...this._projectConfig.fakeTimers, - ...fakeTimersConfig, - } as Config.ModernFakeTimersConfig; - - this._clock = this._fakeTimers.install({ - advanceTimeDelta: resolvedTimersConfig.advanceTimeDelta, - loopLimit: resolvedTimersConfig.timerLimit, - now: resolvedTimersConfig.now, - shouldAdvanceTime: resolvedTimersConfig.shouldAdvanceTime, - shouldClearNativeTimers: resolvedTimersConfig.shouldClearNativeTimers, - toFake: resolvedTimersConfig.toFake, - }); + const toSinonFakeTimersConfig = ( + fakeTimersConfig?: Config.FakeTimersConfig, + ): SinonFakeTimersConfig => { + fakeTimersConfig = { + ...this._projectConfig.fakeTimers, + ...fakeTimersConfig, + } as Config.ModernFakeTimersConfig; + + const advanceTimeDelta = + typeof fakeTimersConfig.advanceTimers === 'number' + ? fakeTimersConfig.advanceTimers + : undefined; + + const toFake = + fakeTimersConfig.toFake || + (Object.keys(this._fakeTimers.timers) as Array< + keyof FakeTimerWithContext['timers'] + >); + + return { + advanceTimeDelta, + loopLimit: fakeTimersConfig.timerLimit, + now: fakeTimersConfig.now || Date.now(), + shouldAdvanceTime: !!fakeTimersConfig.advanceTimers, + shouldClearNativeTimers: true, + toFake, + }; + }; + + this._clock = this._fakeTimers.install( + toSinonFakeTimersConfig(fakeTimersConfig), + ); this._fakingTime = true; } diff --git a/packages/jest-runtime/src/index.ts b/packages/jest-runtime/src/index.ts index e826ebd4c2a2..0d9f79a7e227 100644 --- a/packages/jest-runtime/src/index.ts +++ b/packages/jest-runtime/src/index.ts @@ -2065,16 +2065,16 @@ export default class Runtime { return this._fakeTimersImplementation!; }; const useFakeTimers: Jest['useFakeTimers'] = fakeTimersConfig => { - const resolvedFakeTimersConfig = { + fakeTimersConfig = { ...this._config.fakeTimers, ...fakeTimersConfig, }; - if (!resolvedFakeTimersConfig?.legacyFakeTimers) { + if (!fakeTimersConfig?.legacyFakeTimers) { this._fakeTimersImplementation = this._environment.fakeTimersModern; } else { this._fakeTimersImplementation = this._environment.fakeTimers; } - this._fakeTimersImplementation!.useFakeTimers(resolvedFakeTimersConfig); + this._fakeTimersImplementation!.useFakeTimers(fakeTimersConfig); return jestObject; }; const useRealTimers = () => { diff --git a/packages/jest-types/src/Config.ts b/packages/jest-types/src/Config.ts index 2f2f3a01d38f..4787da970090 100644 --- a/packages/jest-types/src/Config.ts +++ b/packages/jest-types/src/Config.ts @@ -50,6 +50,14 @@ export type LegacyFakeTimersConfig = { }; export type ModernFakeTimersConfig = { + /** + * If set to `true` all timers will be advanced automatically by 20 milliseconds + * every 20 milliseconds. A custom time delta may be provided by passing a number. + * + * @defaultValue + * The default is `false`. + */ + advanceTimers?: boolean | number; /** * Sets the default unix epoch. May be a number (in milliseconds) or a Date object. * @@ -75,32 +83,6 @@ export type ModernFakeTimersConfig = { * The default is `100_000` timers. */ timerLimit?: number; - /** - * Whether to increment mocked time automatically based on the real system time - * shift. If `shouldAdvanceTime` is not set, the mocked time will be incremented - * by 20 milliseconds for every 20 milliseconds change in the real system time. - * - * @defaultValue - * The default is `false`. - */ - shouldAdvanceTime?: boolean; - /** - * Relevant only when using with `shouldAdvanceTime: true`. Increment mocked - * time by `advanceTimeDelta` milliseconds every `advanceTimeDelta` milliseconds. - * - * @defaultValue - * The default is `20` milliseconds. - */ - advanceTimeDelta?: number; - /** - * Forwards clear timer calls to native functions if they are not fakes. - * These are not cleared by default, leading to potentially unexpected behavior - * if timers existed prior to installing fake timers. - * - * @defaultValue - * The default is `false`. - */ - shouldClearNativeTimers?: boolean; /** * Use the old fake timers implementation instead of one backed by `@sinonjs/fake-timers`. * From 84a2a0c88eb5184e00b7d2c6124b04e3bd632995 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Tue, 15 Mar 2022 21:39:41 +0200 Subject: [PATCH 24/69] allow clearing not faked timers --- e2e/__tests__/fakeTimers.test.ts | 5 +++++ .../__tests__/clearRealTimers.test.js | 16 ++++++++++++++++ e2e/fake-timers/clear-real-timers/package.json | 3 +++ 3 files changed, 24 insertions(+) create mode 100644 e2e/fake-timers/clear-real-timers/__tests__/clearRealTimers.test.js create mode 100644 e2e/fake-timers/clear-real-timers/package.json diff --git a/e2e/__tests__/fakeTimers.test.ts b/e2e/__tests__/fakeTimers.test.ts index 07d79d757cdf..4f96aef1790a 100644 --- a/e2e/__tests__/fakeTimers.test.ts +++ b/e2e/__tests__/fakeTimers.test.ts @@ -29,6 +29,11 @@ describe('useFakeTimers', () => { const result = runJest('fake-timers/timer-limit'); expect(result.exitCode).toBe(0); }); + + test('allows clearing not faked timers', () => { + const result = runJest('fake-timers/clear-real-timers'); + expect(result.exitCode).toBe(0); + }); }); describe('useRealTimers', () => { diff --git a/e2e/fake-timers/clear-real-timers/__tests__/clearRealTimers.test.js b/e2e/fake-timers/clear-real-timers/__tests__/clearRealTimers.test.js new file mode 100644 index 000000000000..f65d1452bd69 --- /dev/null +++ b/e2e/fake-timers/clear-real-timers/__tests__/clearRealTimers.test.js @@ -0,0 +1,16 @@ +/** + * 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'; + +test('allows clearing not faked timers', () => { + const timer = setTimeout(() => console.log('should not be called'), 1000); + + jest.useFakeTimers(); + + clearTimeout(timer); +}); diff --git a/e2e/fake-timers/clear-real-timers/package.json b/e2e/fake-timers/clear-real-timers/package.json new file mode 100644 index 000000000000..7c7d151e8229 --- /dev/null +++ b/e2e/fake-timers/clear-real-timers/package.json @@ -0,0 +1,3 @@ +{ + "name": "clear-real-timers" +} From 5fef5ce6d8b2198e782691c44bcb8cec14d4efd5 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Tue, 15 Mar 2022 21:46:10 +0200 Subject: [PATCH 25/69] fix type tests --- packages/jest-types/__typetests__/jest.test.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/jest-types/__typetests__/jest.test.ts b/packages/jest-types/__typetests__/jest.test.ts index 7c120117219e..b22b3d2ed98d 100644 --- a/packages/jest-types/__typetests__/jest.test.ts +++ b/packages/jest-types/__typetests__/jest.test.ts @@ -247,14 +247,13 @@ expectType(jest.setSystemTime(new Date(1995, 11, 17))); expectError(jest.setSystemTime('1995-12-17T03:24:00')); expectType(jest.useFakeTimers()); +expectType(jest.useFakeTimers({advanceTimers: true})); +expectType(jest.useFakeTimers({advanceTimers: 10})); expectType(jest.useFakeTimers({legacyFakeTimers: true})); expectType(jest.useFakeTimers({now: 1483228800000})); expectType(jest.useFakeTimers({now: Date.now()})); expectType(jest.useFakeTimers({now: new Date(1995, 11, 17)})); expectType(jest.useFakeTimers({timerLimit: 1000})); -expectType(jest.useFakeTimers({shouldAdvanceTime: true})); -expectType(jest.useFakeTimers({advanceTimeDelta: 10})); -expectType(jest.useFakeTimers({shouldClearNativeTimers: false})); expectType(jest.useFakeTimers({toFake: ['Date']})); expectType( jest.useFakeTimers({ From aa8d7a959be705a481733b217ba9a871c7f303d4 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Wed, 16 Mar 2022 08:37:18 +0200 Subject: [PATCH 26/69] implement doNotFake option --- e2e/__tests__/fakeTimers.test.ts | 5 ++++ .../do-not-fake/__tests__/doNotFake.test.js | 25 +++++++++++++++++++ e2e/fake-timers/do-not-fake/package.json | 6 +++++ packages/jest-config/src/ValidConfig.ts | 12 ++++----- .../jest-fake-timers/src/modernFakeTimers.ts | 16 +++++++----- .../jest-types/__typetests__/jest.test.ts | 16 ++++++------ packages/jest-types/src/Config.ts | 23 ++++++++--------- 7 files changed, 70 insertions(+), 33 deletions(-) create mode 100644 e2e/fake-timers/do-not-fake/__tests__/doNotFake.test.js create mode 100644 e2e/fake-timers/do-not-fake/package.json diff --git a/e2e/__tests__/fakeTimers.test.ts b/e2e/__tests__/fakeTimers.test.ts index 4f96aef1790a..a07338707373 100644 --- a/e2e/__tests__/fakeTimers.test.ts +++ b/e2e/__tests__/fakeTimers.test.ts @@ -25,6 +25,11 @@ describe('useFakeTimers', () => { expect(result.exitCode).toBe(0); }); + test('allows to pass doNotFake option', () => { + const result = runJest('fake-timers/do-not-fake'); + expect(result.exitCode).toBe(0); + }); + test('allows to pass timerLimit option', () => { const result = runJest('fake-timers/timer-limit'); expect(result.exitCode).toBe(0); diff --git a/e2e/fake-timers/do-not-fake/__tests__/doNotFake.test.js b/e2e/fake-timers/do-not-fake/__tests__/doNotFake.test.js new file mode 100644 index 000000000000..d3382fccfc7a --- /dev/null +++ b/e2e/fake-timers/do-not-fake/__tests__/doNotFake.test.js @@ -0,0 +1,25 @@ +/** + * 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. + */ + +/* global window */ + +'use strict'; + +const mockPerformanceMark = jest.fn(); +window.performance.mark = mockPerformanceMark; + +test('fakes all timers APIs', () => { + jest.useFakeTimers(); + + expect(window.performance.mark).toBeUndefined(); +}); + +test('does not fake `performance` instance', () => { + jest.useFakeTimers({doNotFake: ['performance']}); + + expect(window.performance.mark).toBe(mockPerformanceMark); +}); diff --git a/e2e/fake-timers/do-not-fake/package.json b/e2e/fake-timers/do-not-fake/package.json new file mode 100644 index 000000000000..eed48bf98af2 --- /dev/null +++ b/e2e/fake-timers/do-not-fake/package.json @@ -0,0 +1,6 @@ +{ + "name": "do-not-fake", + "jest": { + "testEnvironment": "jsdom" + } +} diff --git a/packages/jest-config/src/ValidConfig.ts b/packages/jest-config/src/ValidConfig.ts index d5a039a01e1d..919831f1b786 100644 --- a/packages/jest-config/src/ValidConfig.ts +++ b/packages/jest-config/src/ValidConfig.ts @@ -51,16 +51,12 @@ const initialOptions: Config.InitialOptions = { extensionsToTreatAsEsm: [], fakeTimers: { advanceTimers: multipleValidOptions(40, true), - enableGlobally: true, - legacyFakeTimers: false, - now: multipleValidOptions(0, new Date()), - timerLimit: 1000, - toFake: [ + doNotFake: [ 'Date', 'hrtime', 'nextTick', 'performance', - // 'queueMicrotask', + 'queueMicrotask', 'requestAnimationFrame', 'cancelAnimationFrame', 'requestIdleCallback', @@ -72,6 +68,10 @@ const initialOptions: Config.InitialOptions = { 'setTimeout', 'clearTimeout', ], + enableGlobally: true, + legacyFakeTimers: false, + now: multipleValidOptions(0, new Date()), + timerLimit: 1000, }, filter: '/filter.js', forceCoverageMatch: ['**/*.t.js'], diff --git a/packages/jest-fake-timers/src/modernFakeTimers.ts b/packages/jest-fake-timers/src/modernFakeTimers.ts index b4c5737e8b72..84b921eeb5a7 100644 --- a/packages/jest-fake-timers/src/modernFakeTimers.ts +++ b/packages/jest-fake-timers/src/modernFakeTimers.ts @@ -7,6 +7,7 @@ import { FakeTimerWithContext, + FakeMethod as FakeableAPI, InstalledClock, FakeTimerInstallOpts as SinonFakeTimersConfig, withGlobal, @@ -109,11 +110,14 @@ export default class FakeTimers { ? fakeTimersConfig.advanceTimers : undefined; - const toFake = - fakeTimersConfig.toFake || - (Object.keys(this._fakeTimers.timers) as Array< - keyof FakeTimerWithContext['timers'] - >); + const toFake = new Set( + Object.keys(this._fakeTimers.timers) as Array, + ); + + fakeTimersConfig?.doNotFake?.forEach(nameOfFakeableAPI => { + // @ts-expect-error: TODO remove after merging https://github.com/DefinitelyTyped/DefinitelyTyped/pull/59269 + toFake.delete(nameOfFakeableAPI); + }); return { advanceTimeDelta, @@ -121,7 +125,7 @@ export default class FakeTimers { now: fakeTimersConfig.now || Date.now(), shouldAdvanceTime: !!fakeTimersConfig.advanceTimers, shouldClearNativeTimers: true, - toFake, + toFake: Array.from(toFake), }; }; diff --git a/packages/jest-types/__typetests__/jest.test.ts b/packages/jest-types/__typetests__/jest.test.ts index b22b3d2ed98d..8539c8f7f499 100644 --- a/packages/jest-types/__typetests__/jest.test.ts +++ b/packages/jest-types/__typetests__/jest.test.ts @@ -249,20 +249,15 @@ expectError(jest.setSystemTime('1995-12-17T03:24:00')); expectType(jest.useFakeTimers()); expectType(jest.useFakeTimers({advanceTimers: true})); expectType(jest.useFakeTimers({advanceTimers: 10})); -expectType(jest.useFakeTimers({legacyFakeTimers: true})); -expectType(jest.useFakeTimers({now: 1483228800000})); -expectType(jest.useFakeTimers({now: Date.now()})); -expectType(jest.useFakeTimers({now: new Date(1995, 11, 17)})); -expectType(jest.useFakeTimers({timerLimit: 1000})); -expectType(jest.useFakeTimers({toFake: ['Date']})); +expectType(jest.useFakeTimers({doNotFake: ['Date']})); expectType( jest.useFakeTimers({ - toFake: [ + doNotFake: [ 'Date', 'hrtime', 'nextTick', 'performance', - // 'queueMicrotask', + 'queueMicrotask', 'requestAnimationFrame', 'cancelAnimationFrame', 'requestIdleCallback', @@ -276,6 +271,11 @@ expectType( ], }), ); +expectType(jest.useFakeTimers({legacyFakeTimers: true})); +expectType(jest.useFakeTimers({now: 1483228800000})); +expectType(jest.useFakeTimers({now: Date.now()})); +expectType(jest.useFakeTimers({now: new Date(1995, 11, 17)})); +expectType(jest.useFakeTimers({timerLimit: 1000})); expectError(jest.useFakeTimers({enableGlobally: true})); expectError( jest.useFakeTimers({enableGlobally: true, legacyFakeTimers: false}), diff --git a/packages/jest-types/src/Config.ts b/packages/jest-types/src/Config.ts index 4787da970090..6e56bfe9d581 100644 --- a/packages/jest-types/src/Config.ts +++ b/packages/jest-types/src/Config.ts @@ -12,12 +12,12 @@ import type {SnapshotFormat} from '@jest/schemas'; type CoverageProvider = 'babel' | 'v8'; -export type FakeableTimerAPIs = +export type FakeableTimersAPI = | 'Date' | 'hrtime' | 'nextTick' | 'performance' - // | 'queueMicrotask' + | 'queueMicrotask' | 'requestAnimationFrame' | 'cancelAnimationFrame' | 'requestIdleCallback' @@ -59,23 +59,20 @@ export type ModernFakeTimersConfig = { */ advanceTimers?: boolean | number; /** - * Sets the default unix epoch. May be a number (in milliseconds) or a Date object. + * List of names of APIs (e.g. `setTimeout()`, `setImmediate()`, `Date`, + * `nextTick`, `performance`) that should not be faked. * * @defaultValue - * The default is `Date.now()`. - */ - now?: number | Date; + * The default is `[]`. + * */ + doNotFake?: Array; /** - * Allows to cherry pick the timer methods and objects (e.g. `setTimeout()`, - * `setImmediate()`, `Date`, `nextTick`, `performance`) that should be faked. + * Sets the default unix epoch. May be a number (in milliseconds) or a Date object. * * @defaultValue - * All timer APIs are faked by default. - * - * @example - * {toFake: ['nextTick', 'setTimeout']} + * The default is `Date.now()`. */ - toFake?: Array; + now?: number | Date; /** * The maximum number of timers that will be run when calling `jest.runAllTimers()`. * From f4758c5d71d3ce05ad6e7ab4914f6d510d232fa3 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Wed, 16 Mar 2022 10:37:06 +0200 Subject: [PATCH 27/69] fix messages --- e2e/__tests__/fakeTimers.test.ts | 2 +- .../legacyFakeTimers.test.ts.snap | 6 +----- .../modernFakeTimers.test.ts.snap | 2 +- .../jest-fake-timers/src/legacyFakeTimers.ts | 19 +++++++++---------- .../jest-fake-timers/src/modernFakeTimers.ts | 8 ++++---- 5 files changed, 16 insertions(+), 21 deletions(-) diff --git a/e2e/__tests__/fakeTimers.test.ts b/e2e/__tests__/fakeTimers.test.ts index a07338707373..a9b4b850d86a 100644 --- a/e2e/__tests__/fakeTimers.test.ts +++ b/e2e/__tests__/fakeTimers.test.ts @@ -44,7 +44,7 @@ describe('useFakeTimers', () => { describe('useRealTimers', () => { test('restores timers to the native implementation', () => { const result = runJest('fake-timers/use-real-timers'); - expect(result.stdout).toMatch('API is not mocked with fake timers.'); + expect(result.stdout).toMatch('APIs are not replaced with fake timers.'); expect(result.exitCode).toBe(0); }); }); diff --git a/packages/jest-fake-timers/src/__tests__/__snapshots__/legacyFakeTimers.test.ts.snap b/packages/jest-fake-timers/src/__tests__/__snapshots__/legacyFakeTimers.test.ts.snap index 035160d483e5..4a1286a87aed 100644 --- a/packages/jest-fake-timers/src/__tests__/__snapshots__/legacyFakeTimers.test.ts.snap +++ b/packages/jest-fake-timers/src/__tests__/__snapshots__/legacyFakeTimers.test.ts.snap @@ -1,7 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`FakeTimers runAllTimers warns when trying to advance timers while real timers are used 1`] = ` -"A function to advance timers was called but the timers API is not mocked with fake timers. Call \`jest.useFakeTimers()\` in this test or enable fake timers globally by setting \`"timers": "fake"\` in the configuration file. This warning is likely a result of a default configuration change in Jest 15. - -Release Blog Post: https://jestjs.io/blog/2016/09/01/jest-15" -`; +exports[`FakeTimers runAllTimers warns when trying to advance timers while real timers are used 1`] = `"A function to advance timers was called but the timers APIs are not mocked with fake timers. Call \`jest.useFakeTimers({legacyFakeTimers: true})\` in this test file or enable fake timers for all tests by setting {'enableGlobally': true, 'legacyFakeTimers': true} in Jest configuration file."`; diff --git a/packages/jest-fake-timers/src/__tests__/__snapshots__/modernFakeTimers.test.ts.snap b/packages/jest-fake-timers/src/__tests__/__snapshots__/modernFakeTimers.test.ts.snap index 73a88e4969c3..daf980ad8701 100644 --- a/packages/jest-fake-timers/src/__tests__/__snapshots__/modernFakeTimers.test.ts.snap +++ b/packages/jest-fake-timers/src/__tests__/__snapshots__/modernFakeTimers.test.ts.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`FakeTimers runAllTimers warns when trying to advance timers while real timers are used 1`] = `"A function to advance timers was called but the timers API is not mocked with fake timers. Call \`jest.useFakeTimers()\` in this test or enable fake timers globally using "timers" option in the Jest configuration file"`; +exports[`FakeTimers runAllTimers warns when trying to advance timers while real timers are used 1`] = `"A function to advance timers was called but the timers APIs are not replaced with fake timers. Call \`jest.useFakeTimers()\` in this test file or enable fake timers for all tests by setting 'fakeTimers': {'enableGlobally': true} in Jest configuration file."`; diff --git a/packages/jest-fake-timers/src/legacyFakeTimers.ts b/packages/jest-fake-timers/src/legacyFakeTimers.ts index 2c897251443a..66cbf18ab247 100644 --- a/packages/jest-fake-timers/src/legacyFakeTimers.ts +++ b/packages/jest-fake-timers/src/legacyFakeTimers.ts @@ -392,16 +392,15 @@ export default class FakeTimers { private _checkFakeTimers() { if (this._global.setTimeout !== this._fakeTimerAPIs?.setTimeout) { this._global.console.warn( - 'A function to advance timers was called but the timers API is not ' + - 'mocked with fake timers. Call `jest.useFakeTimers()` in this ' + - 'test or enable fake timers globally by setting ' + - '`"timers": "fake"` in ' + - 'the configuration file. This warning is likely a result of a ' + - 'default configuration change in Jest 15.\n\n' + - 'Release Blog Post: https://jestjs.io/blog/2016/09/01/jest-15\n' + - `Stack Trace:\n${formatStackTrace(new Error().stack!, this._config, { - noStackTrace: false, - })}`, + 'A function to advance timers was called but the timers APIs are not mocked ' + + 'with fake timers. Call `jest.useFakeTimers({legacyFakeTimers: true})` ' + + 'in this test file or enable fake timers for all tests by setting ' + + "{'enableGlobally': true, 'legacyFakeTimers': true} in " + + `Jest configuration file.\nStack Trace:\n${formatStackTrace( + new Error().stack!, + this._config, + {noStackTrace: false}, + )}`, ); } } diff --git a/packages/jest-fake-timers/src/modernFakeTimers.ts b/packages/jest-fake-timers/src/modernFakeTimers.ts index 84b921eeb5a7..e7eb76b8494b 100644 --- a/packages/jest-fake-timers/src/modernFakeTimers.ts +++ b/packages/jest-fake-timers/src/modernFakeTimers.ts @@ -165,10 +165,10 @@ export default class FakeTimers { private _checkFakeTimers() { if (!this._fakingTime) { this._global.console.warn( - 'A function to advance timers was called but the timers API is not ' + - 'mocked with fake timers. Call `jest.useFakeTimers()` in this test or ' + - 'enable fake timers globally using "timers" option in the Jest ' + - `configuration file\nStack Trace:\n${formatStackTrace( + 'A function to advance timers was called but the timers APIs are not replaced ' + + 'with fake timers. Call `jest.useFakeTimers()` in this test file or enable ' + + "fake timers for all tests by setting 'fakeTimers': {'enableGlobally': true} " + + `in Jest configuration file.\nStack Trace:\n${formatStackTrace( new Error().stack!, this._projectConfig, {noStackTrace: false}, From a1bc0f68a56e21779e57995d00332db093d3c62a Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Wed, 16 Mar 2022 10:37:19 +0200 Subject: [PATCH 28/69] clean up CLI docs --- docs/Configuration.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/docs/Configuration.md b/docs/Configuration.md index 9114a62e02d4..a66817a194b8 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -442,11 +442,6 @@ type ModernFakeTimersConfig = { enableGlobally?: boolean; /** Sets current system time to be used by fake timers. The default is `Date.now()`. */ now?: number | Date; - /** - * Forwards clear timer calls to native functions if they are not fakes. - * The default is `false`. - */ - shouldClearNativeTimers?: boolean; /** Maximum number of timers that will be run. The default is `100_000` timers. */ timerLimit?: number; }; From 41711788c0cd184de8b1cf25ddfc36d1dfb72ef4 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Wed, 16 Mar 2022 13:54:34 +0200 Subject: [PATCH 29/69] even more docs --- docs/JestObjectAPI.md | 49 +++++++++++---- docs/TimerMocks.md | 86 +++++++++++++------------- packages/jest-environment/src/index.ts | 17 +++-- 3 files changed, 90 insertions(+), 62 deletions(-) diff --git a/docs/JestObjectAPI.md b/docs/JestObjectAPI.md index b8b439319e97..f5c76911e4b9 100644 --- a/docs/JestObjectAPI.md +++ b/docs/JestObjectAPI.md @@ -638,12 +638,6 @@ Fake timers will swap out `Date`, `performance.now()`, `queueMicrotask()`, `setI In node environment `process.hrtime`, `process.nextTick()` and in jsdom environment `requestAnimationFrame()`, `cancelAnimationFrame()`, `requestIdleCallback()`, `cancelIdleCallback()` will be replaced as well. -:::tip - -The fake `performance` instance includes only `.now()` method. In case if your code requires `performance.mark()`, use `doNotFake` option to preserve the original instance. - -::: - Configuration options: ```ts @@ -675,18 +669,32 @@ type FakeTimersConfig = { doNotFake?: Array; /** Sets current system time to be used by fake timers. The default is `Date.now()`. */ now?: number | Date; - /** Maximum number of timers that will be run. The default is `100_000` timers. */ + /** + * The maximum number of timers that will be run when calling `jest.runAllTimers()`. + * The default is `100_000` timers. + */ timerLimit?: number; }; ``` -Example: +Calling `jest.useRealTimers()` will use fake timers for all tests within the file, until original timers are restored with `jest.useRealTimers()`. + +You can call `jest.useFakeTimers()` or `jest.useRealTimers()` from anywhere: top level, inside an `test` block, etc. Keep in mind that this is a **global operation** and will affect other tests within the same file. Calling `jest.useFakeTimers()` once again in the same test file would reset the internal state (e.g. timer count) and reinstall fake timers using the provided options: ```js -jest.useFakeTimers({ - doNotFake: ['nextTick', 'performance'], - now: new Date(1990, 12, 1), - advanceTimers: true, +test('advance the timers automatically', () => { + jest.useFakeTimers({advanceTimers: true}); + // ... +}); + +test('do not advance the timers and do not fake `performance`', () => { + jest.useFakeTimers({doNotFake: ['performance']}); + // ... +}); + +test('uninstall fake timers for the rest of tests in the file', () => { + jest.useRealTimers(); + // ... }); ``` @@ -708,7 +716,22 @@ Returns the `jest` object for chaining. ### `jest.useRealTimers()` -Instructs Jest to use the real versions of the global date, performance and timers APIs. +Instructs Jest to restore the original implementations of the global date, performance, time and timers APIs. For example, you may call `jest.useRealTimers()` inside `afterEach` hook to restore timers after each test: + +```js +afterEach(() => { + jest.useRealTimers(); +}); + +test('do something with fake timers', () => { + jest.useFakeTimers(); + // ... +}); + +test('do something with real timers', () => { + // ... +}); +``` Returns the `jest` object for chaining. diff --git a/docs/TimerMocks.md b/docs/TimerMocks.md index c9f62550ea63..c8e466945cc6 100644 --- a/docs/TimerMocks.md +++ b/docs/TimerMocks.md @@ -3,11 +3,19 @@ id: timer-mocks title: Timer Mocks --- -The native timer functions (i.e., `setTimeout`, `setInterval`, `clearTimeout`, `clearInterval`) are less than ideal for a testing environment since they depend on real time to elapse. Jest can swap out timers with functions that allow you to control the passage of time. [Great Scott!](https://www.youtube.com/watch?v=QZoJ2Pt27BY) +The native timer functions (i.e., `setTimeout()`, `setInterval()`, `clearTimeout()`, `clearInterval()`) are less than ideal for a testing environment since they depend on real time to elapse. Jest can swap out timers with functions that allow you to control the passage of time. [Great Scott!](https://www.youtube.com/watch?v=QZoJ2Pt27BY) -```javascript title="timerGame.js" -'use strict'; +:::info + +Also see [Fake Timers](JestObjectAPI.md#fake-timers) API documentation. + +::: + +## Enable Fake Timers +In the following example we enable fake timers by calling `jest.useFakeTimers()`. This replace the original implementation of `setTimeout()` and other timer functions. Timers can be restored to their normal behavior with `jest.useRealTimers()`. + +```javascript title="timerGame.js" function timerGame(callback) { console.log('Ready....go!'); setTimeout(() => { @@ -20,10 +28,8 @@ module.exports = timerGame; ``` ```javascript title="__tests__/timerGame-test.js" -'use strict'; - jest.useFakeTimers(); -jest.spyOn(global, 'setTimeout'); +jest.spyOn(globalThis, 'setTimeout'); test('waits 1 second before ending the game', () => { const timerGame = require('../timerGame'); @@ -34,31 +40,6 @@ test('waits 1 second before ending the game', () => { }); ``` -Here we enable fake timers by calling `jest.useFakeTimers()`. This mocks out `setTimeout` and other timer functions with mock functions. Timers can be restored to their normal behavior with `jest.useRealTimers()`. - -While you can call `jest.useFakeTimers()` or `jest.useRealTimers()` from anywhere (top level, inside an `it` block, etc.), it is a **global operation** and will affect other tests within the same file. Additionally, you need to call `jest.useFakeTimers()` to reset internal counters before each test. If you plan to not use fake timers in all your tests, you will want to clean up manually, as otherwise the faked timers will leak across tests: - -```javascript -afterEach(() => { - jest.useRealTimers(); -}); - -test('do something with fake timers', () => { - jest.useFakeTimers(); - // ... -}); - -test('do something with real timers', () => { - // ... -}); -``` - -:::info - -For more details see [Fake Timers](JestObjectAPI.md#fake-timers) documentation. - -::: - ## Run All Timers Another test we might want to write for this module is one that asserts that the callback is called after 1 second. To do this, we're going to use Jest's timer control APIs to fast-forward time right in the middle of the test: @@ -85,17 +66,11 @@ test('calls the callback after 1 second', () => { ## Run Pending Timers -There are also scenarios where you might have a recursive timer -- that is a timer that sets a new timer in its own callback. For these, running all the timers would be an endless loop, throwing the following error: - -``` -Ran 100000 timers, and there are still more! Assuming we've hit an infinite recursion and bailing out... -``` +There are also scenarios where you might have a recursive timer – that is a timer that sets a new timer in its own callback. For these, running all the timers would be an endless loop, throwing the following error: "Aborting after running 100000 timers, assuming an infinite loop!" -So something like `jest.runAllTimers()` is not desirable. For these cases you might use `jest.runOnlyPendingTimers()`: +If that is your case, using `jest.runOnlyPendingTimers()` will solve the problem: ```javascript title="infiniteTimerGame.js" -'use strict'; - function infiniteTimerGame(callback) { console.log('Ready....go!'); @@ -114,8 +89,6 @@ module.exports = infiniteTimerGame; ``` ```javascript title="__tests__/infiniteTimerGame-test.js" -'use strict'; - jest.useFakeTimers(); jest.spyOn(global, 'setTimeout'); @@ -146,13 +119,21 @@ describe('infiniteTimerGame', () => { }); ``` +:::note + +For debugging or any other reason you can change the limit of timers that will be run before throwing an error: + +```js +jest.useFakeTimers({timerLimit: 100}); +``` + +::: + ## Advance Timers by Time Another possibility is use `jest.advanceTimersByTime(msToRun)`. When this API is called, all timers are advanced by `msToRun` milliseconds. All pending "macro-tasks" that have been queued via setTimeout() or setInterval(), and would be executed during this time frame, will be executed. Additionally, if those macro-tasks schedule new macro-tasks that would be executed within the same time frame, those will be executed until there are no more macro-tasks remaining in the queue that should be run within msToRun milliseconds. ```javascript title="timerGame.js" -'use strict'; - function timerGame(callback) { console.log('Ready....go!'); setTimeout(() => { @@ -186,4 +167,21 @@ it('calls the callback after 1 second via advanceTimersByTime', () => { Lastly, it may occasionally be useful in some tests to be able to clear all of the pending timers. For this, we have `jest.clearAllTimers()`. -The code for this example is available at [examples/timer](https://github.com/facebook/jest/tree/main/examples/timer). +## Selective Faking + +By default, calling `jest.useFakeTimers()` will fake all timers API. Sometimes your code may require to avoid overwriting the original implementations. If that is the case, you can use `doNotFake` option. For example, here is how you could provide a custom mock function for `performance.mark()` in jsdom environment: + +```js +/** + * @jest-environment jsdom + */ + +const mockPerformanceMark = jest.fn(); +window.performance.mark = mockPerformanceMark; + +test('allows mocking `performance.mark()`', () => { + jest.useFakeTimers({doNotFake: ['performance']}); + + expect(window.performance.mark).toBe(mockPerformanceMark); +}); +``` diff --git a/packages/jest-environment/src/index.ts b/packages/jest-environment/src/index.ts index 90e9a0e79751..69acfa00e094 100644 --- a/packages/jest-environment/src/index.ts +++ b/packages/jest-environment/src/index.ts @@ -140,7 +140,7 @@ export interface Jest { * need access to the real current time, you can invoke this function. * * @remarks - * Only available when using 'modern' fake timers implementation. + * Not available when using legacy fake timers implementation. */ getRealSystemTime(): number; /** @@ -236,7 +236,7 @@ export interface Jest { * Exhausts tasks queued by `setImmediate()`. * * @remarks - * Not available when using 'modern' timers implementation. + * Only available when using legacy fake timers implementation. */ runAllImmediates(): void; /** @@ -272,7 +272,7 @@ export interface Jest { * as they would have done without the call to `jest.setSystemTime()`. * * @remarks - * Only available when using 'modern' fake timers implementation. + * Not available when using legacy fake timers implementation. */ setSystemTime(now?: number | Date): void; /** @@ -302,7 +302,13 @@ export interface Jest { */ unmock(moduleName: string): Jest; /** - * Instructs Jest to use fake versions of the standard timer functions. + * Instructs Jest to use fake versions of the global date, performance, + * time and timers APIs. Fake timers implementation is backed by + * [@sinonjs/fake-timers](https://github.com/sinonjs/fake-timers). + * + * @remarks + * Calling `jest.useFakeTimers()` once again in the same test file would reinstall + * fake timers using the provided options. */ useFakeTimers( fakeTimersConfig?: @@ -310,7 +316,8 @@ export interface Jest { | Config.ModernFakeTimersConfig, ): Jest; /** - * Instructs Jest to use the real versions of the standard timer functions. + * Instructs Jest to restore the original implementations of the global date, + * performance, time and timers APIs. */ useRealTimers(): Jest; } From a3c7e4cefe8dab31e12a1fd36fad4547ac0c4b30 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Wed, 16 Mar 2022 14:18:07 +0200 Subject: [PATCH 30/69] better errors --- .../enable-globally/__tests__/enableGlobally.test.js | 10 ++++++++-- .../use-fake-timers/__tests__/useFakeTimers.test.js | 2 +- .../__tests__/legacyFakeTimers.test.js | 2 +- .../enable-globally/__tests__/enableGlobally.test.js | 6 ++++++ packages/jest-runtime/src/index.ts | 6 +++--- 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/e2e/fake-timers-legacy/enable-globally/__tests__/enableGlobally.test.js b/e2e/fake-timers-legacy/enable-globally/__tests__/enableGlobally.test.js index 0b58d6550132..42734c25b369 100644 --- a/e2e/fake-timers-legacy/enable-globally/__tests__/enableGlobally.test.js +++ b/e2e/fake-timers-legacy/enable-globally/__tests__/enableGlobally.test.js @@ -7,8 +7,14 @@ 'use strict'; -test('fake timers', () => { +test('getRealSystemTime', () => { + expect(() => jest.getRealSystemTime()).toThrow( + '`jest.getRealSystemTime()` is not available when using legacy fake timers.', + ); +}); + +test('setSystemTime', () => { expect(() => jest.setSystemTime(0)).toThrow( - 'jest.setSystemTime() is not available when using legacy fake timers.', + '`jest.setSystemTime()` is not available when using legacy fake timers.', ); }); diff --git a/e2e/fake-timers-legacy/use-fake-timers/__tests__/useFakeTimers.test.js b/e2e/fake-timers-legacy/use-fake-timers/__tests__/useFakeTimers.test.js index 390676f3391a..843dace7b7af 100644 --- a/e2e/fake-timers-legacy/use-fake-timers/__tests__/useFakeTimers.test.js +++ b/e2e/fake-timers-legacy/use-fake-timers/__tests__/useFakeTimers.test.js @@ -13,6 +13,6 @@ test('fake timers', () => { }); expect(() => jest.setSystemTime(0)).toThrow( - 'jest.setSystemTime() is not available when using legacy fake timers.', + '`jest.setSystemTime()` is not available when using legacy fake timers.', ); }); diff --git a/e2e/fake-timers-legacy/without-enable-globally/__tests__/legacyFakeTimers.test.js b/e2e/fake-timers-legacy/without-enable-globally/__tests__/legacyFakeTimers.test.js index b06d5e7152c2..e772b915432a 100644 --- a/e2e/fake-timers-legacy/without-enable-globally/__tests__/legacyFakeTimers.test.js +++ b/e2e/fake-timers-legacy/without-enable-globally/__tests__/legacyFakeTimers.test.js @@ -15,6 +15,6 @@ test('fake timers', () => { expect(f).toHaveBeenCalledTimes(1); expect(() => jest.setSystemTime(0)).toThrow( - 'jest.setSystemTime() is not available when using legacy fake timers.', + '`jest.setSystemTime()` is not available when using legacy fake timers.', ); }); diff --git a/e2e/fake-timers/enable-globally/__tests__/enableGlobally.test.js b/e2e/fake-timers/enable-globally/__tests__/enableGlobally.test.js index 9974cab6c89b..d5dbdc8878bd 100644 --- a/e2e/fake-timers/enable-globally/__tests__/enableGlobally.test.js +++ b/e2e/fake-timers/enable-globally/__tests__/enableGlobally.test.js @@ -26,3 +26,9 @@ test('fake timers with Date argument', () => { expect(Date.now()).toBe(1000); }); + +test('runAllImmediates', () => { + expect(() => jest.runAllImmediates()).toThrow( + '`jest.runAllImmediates()` is only available when using legacy fake timers.', + ); +}); diff --git a/packages/jest-runtime/src/index.ts b/packages/jest-runtime/src/index.ts index 0d9f79a7e227..02f8168d988a 100644 --- a/packages/jest-runtime/src/index.ts +++ b/packages/jest-runtime/src/index.ts @@ -2137,7 +2137,7 @@ export default class Runtime { return fakeTimers.getRealSystemTime(); } else { throw new TypeError( - 'getRealSystemTime is not available when not using modern timers', + '`jest.getRealSystemTime()` is not available when using legacy fake timers.', ); } }, @@ -2159,7 +2159,7 @@ export default class Runtime { fakeTimers.runAllImmediates(); } else { throw new TypeError( - 'runAllImmediates is not available when using modern timers', + '`jest.runAllImmediates()` is only available when using legacy fake timers.', ); } }, @@ -2175,7 +2175,7 @@ export default class Runtime { fakeTimers.setSystemTime(now); } else { throw new TypeError( - 'jest.setSystemTime() is not available when using legacy fake timers.', + '`jest.setSystemTime()` is not available when using legacy fake timers.', ); } }, From cd017105a59e6f414563490cd35d58a1204c9b5c Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Thu, 17 Mar 2022 09:30:42 +0200 Subject: [PATCH 31/69] add unit test --- .../src/__tests__/sinon-integration.test.ts | 192 ++++++++++++++++++ .../jest-fake-timers/src/modernFakeTimers.ts | 2 +- 2 files changed, 193 insertions(+), 1 deletion(-) create mode 100644 packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts diff --git a/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts b/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts new file mode 100644 index 000000000000..c26e97445a34 --- /dev/null +++ b/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts @@ -0,0 +1,192 @@ +/** + * 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 {withGlobal} from '@sinonjs/fake-timers'; +import {makeProjectConfig} from '@jest/test-utils'; +import FakeTimers from '../modernFakeTimers'; + +const mockInstall = jest.fn(); + +const mockWithGlobal = { + install: mockInstall, + timers: { + Date, + clearImmediate, + clearInterval, + clearTimeout, + hrtime: process.hrtime, + nextTick: process.nextTick, + performance, + queueMicrotask, + setImmediate, + setInterval, + setTimeout, + }, +}; + +jest.mock('@sinonjs/fake-timers', () => { + return { + withGlobal: jest.fn(() => mockWithGlobal), + }; +}); + +afterEach(() => { + jest.clearAllMocks(); +}); + +describe('`@sinonjs/fake-timers` integration', () => { + test('passes `globalThis` to `withGlobal()` method', () => { + const timers = new FakeTimers({ + config: makeProjectConfig(), + global: globalThis, + }); + + expect(withGlobal).toBeCalledWith(globalThis); + }); + + test('passes default options to `install()` method', () => { + const timers = new FakeTimers({ + config: makeProjectConfig(), + global: globalThis, + }); + + timers.useFakeTimers(); + + expect(mockInstall).toBeCalledWith({ + advanceTimeDelta: undefined, + loopLimit: undefined, + now: Date.now(), + shouldAdvanceTime: false, + shouldClearNativeTimers: true, + toFake: [ + 'Date', + 'clearImmediate', + 'clearInterval', + 'clearTimeout', + 'hrtime', + 'nextTick', + 'performance', + 'queueMicrotask', + 'setImmediate', + 'setInterval', + 'setTimeout', + ], + }); + }); + + test('passes `projectConfig.fakeTimers` to `install()` method', () => { + const timers = new FakeTimers({ + config: makeProjectConfig({ + fakeTimers: { + advanceTimers: true, + doNotFake: ['nextTick', 'performance'], + now: 0, + timerLimit: 100, + }, + }), + global: globalThis, + }); + + timers.useFakeTimers(); + + expect(mockInstall).toBeCalledWith({ + advanceTimeDelta: undefined, + loopLimit: 100, + now: 0, + shouldAdvanceTime: true, + shouldClearNativeTimers: true, + toFake: [ + 'Date', + 'clearImmediate', + 'clearInterval', + 'clearTimeout', + 'hrtime', + 'queueMicrotask', + 'setImmediate', + 'setInterval', + 'setTimeout', + ], + }); + }); + + test('passes `fakeTimersConfig` to `install()` method', () => { + const timers = new FakeTimers({ + config: makeProjectConfig(), + global: globalThis, + }); + + timers.useFakeTimers({ + advanceTimers: 40, + doNotFake: ['Date', 'queueMicrotask'], + now: new Date('1995-12-17'), + timerLimit: 2000, + }); + + expect(mockInstall).toBeCalledWith({ + advanceTimeDelta: 40, + loopLimit: 2000, + now: new Date('1995-12-17'), + shouldAdvanceTime: true, + shouldClearNativeTimers: true, + toFake: [ + 'clearImmediate', + 'clearInterval', + 'clearTimeout', + 'hrtime', + 'nextTick', + 'performance', + 'setImmediate', + 'setInterval', + 'setTimeout', + ], + }); + }); + + test('overrides `projectConfig.fakeTimers` if `fakeTimersConfig` is passed', () => { + const timers = new FakeTimers({ + config: makeProjectConfig({ + fakeTimers: { + advanceTimers: 20, + doNotFake: ['Date', 'nextTick', 'performance'], + now: 0, + timerLimit: 1000, + }, + }), + global: globalThis, + }); + + const now = Date.now(); + + timers.useFakeTimers({ + advanceTimers: false, + doNotFake: ['hrtime'], + now, + timerLimit: 5000, + }); + + expect(mockInstall).toBeCalledWith({ + advanceTimeDelta: undefined, + loopLimit: 5000, + now, + shouldAdvanceTime: false, + shouldClearNativeTimers: true, + toFake: [ + 'Date', + 'clearImmediate', + 'clearInterval', + 'clearTimeout', + 'nextTick', + 'performance', + 'queueMicrotask', + 'setImmediate', + 'setInterval', + 'setTimeout', + ], + }); + }); +}); diff --git a/packages/jest-fake-timers/src/modernFakeTimers.ts b/packages/jest-fake-timers/src/modernFakeTimers.ts index e7eb76b8494b..6a46cb57b138 100644 --- a/packages/jest-fake-timers/src/modernFakeTimers.ts +++ b/packages/jest-fake-timers/src/modernFakeTimers.ts @@ -122,7 +122,7 @@ export default class FakeTimers { return { advanceTimeDelta, loopLimit: fakeTimersConfig.timerLimit, - now: fakeTimersConfig.now || Date.now(), + now: fakeTimersConfig.now ?? Date.now(), shouldAdvanceTime: !!fakeTimersConfig.advanceTimers, shouldClearNativeTimers: true, toFake: Array.from(toFake), From 2b8ed49461127dbb81b64f8eff1eb988adc42c74 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Thu, 17 Mar 2022 09:32:58 +0200 Subject: [PATCH 32/69] changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f13f52c65058..ca421bb5a856 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ - `[jest-environment-node]` [**BREAKING**] Second argument `context` to constructor is mandatory ([#12469](https://github.com/facebook/jest/pull/12469)) - `[@jest/expect]` New module which extends `expect` with `jest-snapshot` matchers ([#12404](https://github.com/facebook/jest/pull/12404), [#12410](https://github.com/facebook/jest/pull/12410), [#12418](https://github.com/facebook/jest/pull/12418)) - `[@jest/expect-utils]` New module exporting utils for `expect` ([#12323](https://github.com/facebook/jest/pull/12323)) +- `[@jest/fake-timers]` Allow `jest.useFakeTimers()` and `projectConfig.fakeTimers` to take an options bag ([#12572](https://github.com/facebook/jest/pull/12572)) - `[jest-haste-map]` [**BREAKING**] `HasteMap.create` now returns a promise ([#12008](https://github.com/facebook/jest/pull/12008)) - `[jest-haste-map]` Add support for `dependencyExtractor` written in ESM ([#12008](https://github.com/facebook/jest/pull/12008)) - `[jest-mock]` [**BREAKING**] Rename exported utility types `ClassLike`, `FunctionLike`, `ConstructorLikeKeys`, `MethodLikeKeys`, `PropertyLikeKeys`; remove exports of utility types `ArgumentsOf`, `ArgsType`, `ConstructorArgumentsOf` - TS builtin utility types `ConstructorParameters` and `Parameters` should be used instead ([#12435](https://github.com/facebook/jest/pull/12435), [#12489](https://github.com/facebook/jest/pull/12489)) From 0eabf14c1b7ae60376dfa8bccb4cf435ae784e8f Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Thu, 17 Mar 2022 09:40:24 +0200 Subject: [PATCH 33/69] better changelog entry --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca421bb5a856..e683aa8609c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,7 +23,8 @@ - `[jest-environment-node]` [**BREAKING**] Second argument `context` to constructor is mandatory ([#12469](https://github.com/facebook/jest/pull/12469)) - `[@jest/expect]` New module which extends `expect` with `jest-snapshot` matchers ([#12404](https://github.com/facebook/jest/pull/12404), [#12410](https://github.com/facebook/jest/pull/12410), [#12418](https://github.com/facebook/jest/pull/12418)) - `[@jest/expect-utils]` New module exporting utils for `expect` ([#12323](https://github.com/facebook/jest/pull/12323)) -- `[@jest/fake-timers]` Allow `jest.useFakeTimers()` and `projectConfig.fakeTimers` to take an options bag ([#12572](https://github.com/facebook/jest/pull/12572)) +- `[@jest/fake-timers]` [**BREAKING**] Rename `timers` configuration option to `fakeTimers` ([#12572](https://github.com/facebook/jest/pull/12572)) +- `[@jest/fake-timers]` [**BREAKING**] Allow `jest.useFakeTimers()` and `projectConfig.fakeTimers` to take an options bag ([#12572](https://github.com/facebook/jest/pull/12572)) - `[jest-haste-map]` [**BREAKING**] `HasteMap.create` now returns a promise ([#12008](https://github.com/facebook/jest/pull/12008)) - `[jest-haste-map]` Add support for `dependencyExtractor` written in ESM ([#12008](https://github.com/facebook/jest/pull/12008)) - `[jest-mock]` [**BREAKING**] Rename exported utility types `ClassLike`, `FunctionLike`, `ConstructorLikeKeys`, `MethodLikeKeys`, `PropertyLikeKeys`; remove exports of utility types `ArgumentsOf`, `ArgsType`, `ConstructorArgumentsOf` - TS builtin utility types `ConstructorParameters` and `Parameters` should be used instead ([#12435](https://github.com/facebook/jest/pull/12435), [#12489](https://github.com/facebook/jest/pull/12489)) From ebed0c13e027e67bcfe59969f05e101c5f03b916 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Thu, 17 Mar 2022 09:42:52 +0200 Subject: [PATCH 34/69] remove performance from unit test --- .../src/__tests__/sinon-integration.test.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts b/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts index c26e97445a34..ca3b80d50d79 100644 --- a/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts +++ b/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts @@ -21,7 +21,6 @@ const mockWithGlobal = { clearTimeout, hrtime: process.hrtime, nextTick: process.nextTick, - performance, queueMicrotask, setImmediate, setInterval, @@ -70,7 +69,6 @@ describe('`@sinonjs/fake-timers` integration', () => { 'clearTimeout', 'hrtime', 'nextTick', - 'performance', 'queueMicrotask', 'setImmediate', 'setInterval', @@ -84,7 +82,7 @@ describe('`@sinonjs/fake-timers` integration', () => { config: makeProjectConfig({ fakeTimers: { advanceTimers: true, - doNotFake: ['nextTick', 'performance'], + doNotFake: ['Date', 'nextTick'], now: 0, timerLimit: 100, }, @@ -139,7 +137,6 @@ describe('`@sinonjs/fake-timers` integration', () => { 'clearTimeout', 'hrtime', 'nextTick', - 'performance', 'setImmediate', 'setInterval', 'setTimeout', @@ -152,7 +149,7 @@ describe('`@sinonjs/fake-timers` integration', () => { config: makeProjectConfig({ fakeTimers: { advanceTimers: 20, - doNotFake: ['Date', 'nextTick', 'performance'], + doNotFake: ['Date', 'nextTick'], now: 0, timerLimit: 1000, }, @@ -181,7 +178,6 @@ describe('`@sinonjs/fake-timers` integration', () => { 'clearInterval', 'clearTimeout', 'nextTick', - 'performance', 'queueMicrotask', 'setImmediate', 'setInterval', From 8b5d6b07bec1f067f2470279da1a36a8626ab309 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Thu, 17 Mar 2022 09:48:11 +0200 Subject: [PATCH 35/69] fix unit test --- .../jest-fake-timers/src/__tests__/sinon-integration.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts b/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts index ca3b80d50d79..1c203dd3315e 100644 --- a/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts +++ b/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts @@ -99,7 +99,6 @@ describe('`@sinonjs/fake-timers` integration', () => { shouldAdvanceTime: true, shouldClearNativeTimers: true, toFake: [ - 'Date', 'clearImmediate', 'clearInterval', 'clearTimeout', From ef1434aabac7e5c9413a3cb40d658bc68d78890a Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Thu, 17 Mar 2022 09:54:57 +0200 Subject: [PATCH 36/69] better Date.now() (?) --- .../jest-fake-timers/src/__tests__/sinon-integration.test.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts b/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts index 1c203dd3315e..e478f3215f7e 100644 --- a/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts +++ b/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts @@ -49,6 +49,8 @@ describe('`@sinonjs/fake-timers` integration', () => { }); test('passes default options to `install()` method', () => { + const now = Date.now(); + const timers = new FakeTimers({ config: makeProjectConfig(), global: globalThis, @@ -59,7 +61,7 @@ describe('`@sinonjs/fake-timers` integration', () => { expect(mockInstall).toBeCalledWith({ advanceTimeDelta: undefined, loopLimit: undefined, - now: Date.now(), + now, shouldAdvanceTime: false, shouldClearNativeTimers: true, toFake: [ From 5ad74f43a952736b5933f4e7d01dbee1c70d3d25 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Thu, 17 Mar 2022 10:02:29 +0200 Subject: [PATCH 37/69] expect.any(Number) --- .../jest-fake-timers/src/__tests__/sinon-integration.test.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts b/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts index e478f3215f7e..f33cf75dc341 100644 --- a/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts +++ b/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts @@ -49,8 +49,6 @@ describe('`@sinonjs/fake-timers` integration', () => { }); test('passes default options to `install()` method', () => { - const now = Date.now(); - const timers = new FakeTimers({ config: makeProjectConfig(), global: globalThis, @@ -61,7 +59,7 @@ describe('`@sinonjs/fake-timers` integration', () => { expect(mockInstall).toBeCalledWith({ advanceTimeDelta: undefined, loopLimit: undefined, - now, + now: expect.any(Number), shouldAdvanceTime: false, shouldClearNativeTimers: true, toFake: [ From 4ec6cce25129db870a05cd6e16fa1b392a2857a3 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Thu, 17 Mar 2022 10:06:20 +0200 Subject: [PATCH 38/69] mock Date.now() --- .../src/__tests__/sinon-integration.test.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts b/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts index f33cf75dc341..1d2c5d2a71cf 100644 --- a/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts +++ b/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts @@ -10,6 +10,8 @@ import {withGlobal} from '@sinonjs/fake-timers'; import {makeProjectConfig} from '@jest/test-utils'; import FakeTimers from '../modernFakeTimers'; +jest.spyOn(Date, 'now').mockImplementation(() => 123456); + const mockInstall = jest.fn(); const mockWithGlobal = { @@ -59,7 +61,7 @@ describe('`@sinonjs/fake-timers` integration', () => { expect(mockInstall).toBeCalledWith({ advanceTimeDelta: undefined, loopLimit: undefined, - now: expect.any(Number), + now: 123456, shouldAdvanceTime: false, shouldClearNativeTimers: true, toFake: [ @@ -156,19 +158,17 @@ describe('`@sinonjs/fake-timers` integration', () => { global: globalThis, }); - const now = Date.now(); - timers.useFakeTimers({ advanceTimers: false, doNotFake: ['hrtime'], - now, + now: 123456, timerLimit: 5000, }); expect(mockInstall).toBeCalledWith({ advanceTimeDelta: undefined, loopLimit: 5000, - now, + now: 123456, shouldAdvanceTime: false, shouldClearNativeTimers: true, toFake: [ From 7fb3de3f2d73fbecfd1facccc700efde6dd4dece Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Sat, 19 Mar 2022 08:44:43 +0200 Subject: [PATCH 39/69] clean up --- docs/TimerMocks.md | 4 ++-- ...{fakeTimersPromise.test.ts => fakePromises.test.ts} | 6 +++--- e2e/__tests__/fakeTimers.test.ts | 6 ++---- e2e/__tests__/fakeTimersLegacy.test.ts | 8 +++----- .../asap/__tests__/generator.test.js | 0 .../asap/fake-promises.js | 0 .../asap/package.json | 3 +-- .../immediate/__tests__/generator.test.js | 0 .../immediate/fake-promises.js | 0 .../immediate/package.json | 3 +-- .../__tests__/legacyFakeTimers.test.js | 0 .../package.json | 0 e2e/fake-timers-legacy/use-fake-timers/package.json | 5 ----- .../__tests__/useFakeTimers.test.js | 0 .../use-legacy-fake-timers/package.json | 3 +++ e2e/fake-timers/enable-globally/package.json | 1 + e2e/fake-timers/request-animation-frame/package.json | 1 + e2e/fake-timers/set-immediate/package.json | 1 + e2e/fake-timers/timer-limit/package.json | 1 + e2e/fake-timers/use-fake-timers/package.json | 4 +--- e2e/fake-timers/use-real-timers/package.json | 4 +--- packages/jest-fake-timers/src/modernFakeTimers.ts | 10 +++++----- 22 files changed, 26 insertions(+), 34 deletions(-) rename e2e/__tests__/{fakeTimersPromise.test.ts => fakePromises.test.ts} (76%) rename e2e/{fake-timers-promise => fake-promises}/asap/__tests__/generator.test.js (100%) rename e2e/{fake-timers-promise => fake-promises}/asap/fake-promises.js (100%) rename e2e/{fake-timers-promise => fake-promises}/asap/package.json (75%) rename e2e/{fake-timers-promise => fake-promises}/immediate/__tests__/generator.test.js (100%) rename e2e/{fake-timers-promise => fake-promises}/immediate/fake-promises.js (100%) rename e2e/{fake-timers-promise => fake-promises}/immediate/package.json (75%) rename e2e/fake-timers-legacy/{without-enable-globally => enable-legacy-fake-timers}/__tests__/legacyFakeTimers.test.js (100%) rename e2e/fake-timers-legacy/{without-enable-globally => enable-legacy-fake-timers}/package.json (100%) delete mode 100644 e2e/fake-timers-legacy/use-fake-timers/package.json rename e2e/fake-timers-legacy/{use-fake-timers => use-legacy-fake-timers}/__tests__/useFakeTimers.test.js (100%) create mode 100644 e2e/fake-timers-legacy/use-legacy-fake-timers/package.json diff --git a/docs/TimerMocks.md b/docs/TimerMocks.md index c8e466945cc6..42693dd7be37 100644 --- a/docs/TimerMocks.md +++ b/docs/TimerMocks.md @@ -13,7 +13,7 @@ Also see [Fake Timers](JestObjectAPI.md#fake-timers) API documentation. ## Enable Fake Timers -In the following example we enable fake timers by calling `jest.useFakeTimers()`. This replace the original implementation of `setTimeout()` and other timer functions. Timers can be restored to their normal behavior with `jest.useRealTimers()`. +In the following example we enable fake timers by calling `jest.useFakeTimers()`. This is replacing the original implementation of `setTimeout()` and other timer functions. Timers can be restored to their normal behavior with `jest.useRealTimers()`. ```javascript title="timerGame.js" function timerGame(callback) { @@ -29,7 +29,7 @@ module.exports = timerGame; ```javascript title="__tests__/timerGame-test.js" jest.useFakeTimers(); -jest.spyOn(globalThis, 'setTimeout'); +jest.spyOn(global, 'setTimeout'); test('waits 1 second before ending the game', () => { const timerGame = require('../timerGame'); diff --git a/e2e/__tests__/fakeTimersPromise.test.ts b/e2e/__tests__/fakePromises.test.ts similarity index 76% rename from e2e/__tests__/fakeTimersPromise.test.ts rename to e2e/__tests__/fakePromises.test.ts index 5f9af584c841..61cb548eecb6 100644 --- a/e2e/__tests__/fakeTimersPromise.test.ts +++ b/e2e/__tests__/fakePromises.test.ts @@ -7,14 +7,14 @@ import runJest from '../runJest'; -describe('fake promises', () => { +describe('Fake promises', () => { it('should be possible to resolve with fake timers using immediates', () => { - const result = runJest('fake-timers-promise/immediate'); + const result = runJest('fake-promises/immediate'); expect(result.exitCode).toBe(0); }); it('should be possible to resolve with fake timers using asap', () => { - const result = runJest('fake-timers-promise/asap'); + const result = runJest('fake-promises/asap'); expect(result.exitCode).toBe(0); }); }); diff --git a/e2e/__tests__/fakeTimers.test.ts b/e2e/__tests__/fakeTimers.test.ts index a9b4b850d86a..b7fc0d38c982 100644 --- a/e2e/__tests__/fakeTimers.test.ts +++ b/e2e/__tests__/fakeTimers.test.ts @@ -51,7 +51,7 @@ describe('useRealTimers', () => { describe('setImmediate', () => { test('fakes setImmediate', () => { - const result = runJest('fake-timers/set-immediate', ['--verbose']); + const result = runJest('fake-timers/set-immediate'); expect(result.stderr).toMatch('setImmediate test'); expect(result.exitCode).toBe(0); @@ -60,9 +60,7 @@ describe('setImmediate', () => { describe('requestAnimationFrame', () => { test('fakes requestAnimationFrame', () => { - const result = runJest('fake-timers/request-animation-frame', [ - '--verbose', - ]); + const result = runJest('fake-timers/request-animation-frame'); expect(result.stderr).toMatch('requestAnimationFrame test'); expect(result.exitCode).toBe(0); diff --git a/e2e/__tests__/fakeTimersLegacy.test.ts b/e2e/__tests__/fakeTimersLegacy.test.ts index 8ea0e996f93d..3cda0d64166a 100644 --- a/e2e/__tests__/fakeTimersLegacy.test.ts +++ b/e2e/__tests__/fakeTimersLegacy.test.ts @@ -16,23 +16,21 @@ describe('enableGlobally', () => { describe('legacyFakeTimers', () => { test('toggles legacy fake timers from Jest config', () => { - const result = runJest('fake-timers-legacy/without-enable-globally'); + const result = runJest('fake-timers-legacy/enable-legacy-fake-timers'); expect(result.exitCode).toBe(0); }); }); describe('useFakeTimers', () => { test('enables legacy fake timers from Jest Object', () => { - const result = runJest('fake-timers-legacy/use-fake-timers'); + const result = runJest('fake-timers-legacy/use-legacy-fake-timers'); expect(result.exitCode).toBe(0); }); }); describe('requestAnimationFrame', () => { test('fakes requestAnimationFrame', () => { - const result = runJest('fake-timers-legacy/request-animation-frame', [ - '--verbose', - ]); + const result = runJest('fake-timers-legacy/request-animation-frame'); expect(result.stderr).toMatch('requestAnimationFrame test'); expect(result.exitCode).toBe(0); diff --git a/e2e/fake-timers-promise/asap/__tests__/generator.test.js b/e2e/fake-promises/asap/__tests__/generator.test.js similarity index 100% rename from e2e/fake-timers-promise/asap/__tests__/generator.test.js rename to e2e/fake-promises/asap/__tests__/generator.test.js diff --git a/e2e/fake-timers-promise/asap/fake-promises.js b/e2e/fake-promises/asap/fake-promises.js similarity index 100% rename from e2e/fake-timers-promise/asap/fake-promises.js rename to e2e/fake-promises/asap/fake-promises.js diff --git a/e2e/fake-timers-promise/asap/package.json b/e2e/fake-promises/asap/package.json similarity index 75% rename from e2e/fake-timers-promise/asap/package.json rename to e2e/fake-promises/asap/package.json index 59cdffb9baaa..d918d72c0c49 100644 --- a/e2e/fake-timers-promise/asap/package.json +++ b/e2e/fake-promises/asap/package.json @@ -3,7 +3,6 @@ "fakeTimers": {"enableGlobally": true}, "setupFiles": [ "/fake-promises" - ], - "testEnvironment": "node" + ] } } diff --git a/e2e/fake-timers-promise/immediate/__tests__/generator.test.js b/e2e/fake-promises/immediate/__tests__/generator.test.js similarity index 100% rename from e2e/fake-timers-promise/immediate/__tests__/generator.test.js rename to e2e/fake-promises/immediate/__tests__/generator.test.js diff --git a/e2e/fake-timers-promise/immediate/fake-promises.js b/e2e/fake-promises/immediate/fake-promises.js similarity index 100% rename from e2e/fake-timers-promise/immediate/fake-promises.js rename to e2e/fake-promises/immediate/fake-promises.js diff --git a/e2e/fake-timers-promise/immediate/package.json b/e2e/fake-promises/immediate/package.json similarity index 75% rename from e2e/fake-timers-promise/immediate/package.json rename to e2e/fake-promises/immediate/package.json index 59cdffb9baaa..d918d72c0c49 100644 --- a/e2e/fake-timers-promise/immediate/package.json +++ b/e2e/fake-promises/immediate/package.json @@ -3,7 +3,6 @@ "fakeTimers": {"enableGlobally": true}, "setupFiles": [ "/fake-promises" - ], - "testEnvironment": "node" + ] } } diff --git a/e2e/fake-timers-legacy/without-enable-globally/__tests__/legacyFakeTimers.test.js b/e2e/fake-timers-legacy/enable-legacy-fake-timers/__tests__/legacyFakeTimers.test.js similarity index 100% rename from e2e/fake-timers-legacy/without-enable-globally/__tests__/legacyFakeTimers.test.js rename to e2e/fake-timers-legacy/enable-legacy-fake-timers/__tests__/legacyFakeTimers.test.js diff --git a/e2e/fake-timers-legacy/without-enable-globally/package.json b/e2e/fake-timers-legacy/enable-legacy-fake-timers/package.json similarity index 100% rename from e2e/fake-timers-legacy/without-enable-globally/package.json rename to e2e/fake-timers-legacy/enable-legacy-fake-timers/package.json diff --git a/e2e/fake-timers-legacy/use-fake-timers/package.json b/e2e/fake-timers-legacy/use-fake-timers/package.json deleted file mode 100644 index 148788b25446..000000000000 --- a/e2e/fake-timers-legacy/use-fake-timers/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "jest": { - "testEnvironment": "node" - } -} diff --git a/e2e/fake-timers-legacy/use-fake-timers/__tests__/useFakeTimers.test.js b/e2e/fake-timers-legacy/use-legacy-fake-timers/__tests__/useFakeTimers.test.js similarity index 100% rename from e2e/fake-timers-legacy/use-fake-timers/__tests__/useFakeTimers.test.js rename to e2e/fake-timers-legacy/use-legacy-fake-timers/__tests__/useFakeTimers.test.js diff --git a/e2e/fake-timers-legacy/use-legacy-fake-timers/package.json b/e2e/fake-timers-legacy/use-legacy-fake-timers/package.json new file mode 100644 index 000000000000..2223ef489425 --- /dev/null +++ b/e2e/fake-timers-legacy/use-legacy-fake-timers/package.json @@ -0,0 +1,3 @@ +{ + "name": "use-legacy-fake-timers" +} diff --git a/e2e/fake-timers/enable-globally/package.json b/e2e/fake-timers/enable-globally/package.json index 2883cedbce8f..008ec476acf0 100644 --- a/e2e/fake-timers/enable-globally/package.json +++ b/e2e/fake-timers/enable-globally/package.json @@ -1,4 +1,5 @@ { + "name": "enable-globally", "jest": { "fakeTimers": {"enableGlobally": true} } diff --git a/e2e/fake-timers/request-animation-frame/package.json b/e2e/fake-timers/request-animation-frame/package.json index 0ded940b7cb7..cedbfc290fee 100644 --- a/e2e/fake-timers/request-animation-frame/package.json +++ b/e2e/fake-timers/request-animation-frame/package.json @@ -1,4 +1,5 @@ { + "name": "request-animation-frame", "jest": { "testEnvironment": "jsdom" } diff --git a/e2e/fake-timers/set-immediate/package.json b/e2e/fake-timers/set-immediate/package.json index 2883cedbce8f..906451862750 100644 --- a/e2e/fake-timers/set-immediate/package.json +++ b/e2e/fake-timers/set-immediate/package.json @@ -1,4 +1,5 @@ { + "name": "set-immediate", "jest": { "fakeTimers": {"enableGlobally": true} } diff --git a/e2e/fake-timers/timer-limit/package.json b/e2e/fake-timers/timer-limit/package.json index 1a2303eb7a80..47f6803134b8 100644 --- a/e2e/fake-timers/timer-limit/package.json +++ b/e2e/fake-timers/timer-limit/package.json @@ -1,4 +1,5 @@ { + "name": "timer-limit", "jest": { "fakeTimers": {"enableGlobally": true, "timerLimit": 10} } diff --git a/e2e/fake-timers/use-fake-timers/package.json b/e2e/fake-timers/use-fake-timers/package.json index 148788b25446..3767aec8e1b8 100644 --- a/e2e/fake-timers/use-fake-timers/package.json +++ b/e2e/fake-timers/use-fake-timers/package.json @@ -1,5 +1,3 @@ { - "jest": { - "testEnvironment": "node" - } + "name": "use-fake-timers" } diff --git a/e2e/fake-timers/use-real-timers/package.json b/e2e/fake-timers/use-real-timers/package.json index 2883cedbce8f..b68ecca97952 100644 --- a/e2e/fake-timers/use-real-timers/package.json +++ b/e2e/fake-timers/use-real-timers/package.json @@ -1,5 +1,3 @@ { - "jest": { - "fakeTimers": {"enableGlobally": true} - } + "name": "use-real-timers" } diff --git a/packages/jest-fake-timers/src/modernFakeTimers.ts b/packages/jest-fake-timers/src/modernFakeTimers.ts index 6a46cb57b138..d68a047b1b63 100644 --- a/packages/jest-fake-timers/src/modernFakeTimers.ts +++ b/packages/jest-fake-timers/src/modernFakeTimers.ts @@ -17,7 +17,7 @@ import {formatStackTrace} from 'jest-message-util'; export default class FakeTimers { private _clock!: InstalledClock; - private _projectConfig: Config.ProjectConfig; + private _config: Config.ProjectConfig; private _fakingTime: boolean; private _global: typeof globalThis; private _fakeTimers: FakeTimerWithContext; @@ -30,7 +30,7 @@ export default class FakeTimers { config: Config.ProjectConfig; }) { this._global = global; - this._projectConfig = config; + this._config = config; this._fakingTime = false; this._fakeTimers = withGlobal(global); @@ -101,7 +101,7 @@ export default class FakeTimers { fakeTimersConfig?: Config.FakeTimersConfig, ): SinonFakeTimersConfig => { fakeTimersConfig = { - ...this._projectConfig.fakeTimers, + ...this._config.fakeTimers, ...fakeTimersConfig, } as Config.ModernFakeTimersConfig; @@ -123,7 +123,7 @@ export default class FakeTimers { advanceTimeDelta, loopLimit: fakeTimersConfig.timerLimit, now: fakeTimersConfig.now ?? Date.now(), - shouldAdvanceTime: !!fakeTimersConfig.advanceTimers, + shouldAdvanceTime: Boolean(fakeTimersConfig.advanceTimers), shouldClearNativeTimers: true, toFake: Array.from(toFake), }; @@ -170,7 +170,7 @@ export default class FakeTimers { "fake timers for all tests by setting 'fakeTimers': {'enableGlobally': true} " + `in Jest configuration file.\nStack Trace:\n${formatStackTrace( new Error().stack!, - this._projectConfig, + this._config, {noStackTrace: false}, )}`, ); From 947ad200e0f4fbefb7815d9fcb204e6f04cd4b49 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Sat, 19 Mar 2022 10:02:47 +0200 Subject: [PATCH 40/69] fix config examples --- docs/Configuration.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/Configuration.md b/docs/Configuration.md index a66817a194b8..5eacd0485bd4 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -405,7 +405,9 @@ Here is how you can enable fake timers globally for all tests: ```json { - "enableGlobally": true + "fakeTimers": { + "enableGlobally": true + } } ``` @@ -453,8 +455,10 @@ For some reason you might have to use legacy implementation of fake timers. Here ```json { - "enableGlobally": true, - "legacyFakeTimers": true + "fakeTimers": { + "enableGlobally": true, + "legacyFakeTimers": true + } } ``` From 268febdeba44b0cd7be0eaa1f5f8c7fd7af995aa Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Sat, 19 Mar 2022 10:02:54 +0200 Subject: [PATCH 41/69] clean up --- docs/CLI.md | 2 +- docs/Configuration.md | 4 ++-- docs/JestObjectAPI.md | 4 ++-- docs/TimerMocks.md | 4 ++-- e2e/fake-timers/do-not-fake/__tests__/doNotFake.test.js | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/CLI.md b/docs/CLI.md index 0272d895f386..edc88b3290de 100644 --- a/docs/CLI.md +++ b/docs/CLI.md @@ -204,7 +204,7 @@ Alias: `-e`. Use this flag to show full diffs and errors instead of a patch. ### `--fakeTimers=` -A JSON string with configuration options for fake timers. For details see [Fake Timers](JestObjectAPI.md#fake-timers) documentation. +A JSON string with configuration options for fake timers. For details see [Fake Timers API](JestObjectAPI.md#fake-timers) documentation. ### `--filter=` diff --git a/docs/Configuration.md b/docs/Configuration.md index 5eacd0485bd4..05ed389583d1 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -399,7 +399,7 @@ Jest's ESM support is still experimental, see [its docs for more details](ECMASc Default: `{}` -This option allows configuration of the implementation of fake timers. The fake timers may be useful when a piece of code sets a long timeout that we don't want to wait for in a test. For more details see [Fake Timers](JestObjectAPI.md#fake-timers) documentation. +This option allows configuration of the implementation of fake timers. The fake timers may be useful when a piece of code sets a long timeout that we don't want to wait for in a test. For more details see [Fake Timers API](JestObjectAPI.md#fake-timers) documentation. Here is how you can enable fake timers globally for all tests: @@ -440,7 +440,7 @@ type ModernFakeTimersConfig = { advanceTimers?: boolean | number; /** List of names of APIs that should not be faked. The default is `[]`. */ doNotFake?: Array; - /** Whether fake timers should be enabled for all tests. The default is `false`. */ + /** Whether fake timers should be enabled for all test files. The default is `false`. */ enableGlobally?: boolean; /** Sets current system time to be used by fake timers. The default is `Date.now()`. */ now?: number | Date; diff --git a/docs/JestObjectAPI.md b/docs/JestObjectAPI.md index f5c76911e4b9..9403f663e1c3 100644 --- a/docs/JestObjectAPI.md +++ b/docs/JestObjectAPI.md @@ -632,7 +632,7 @@ test('direct', () => { ### `jest.useFakeTimers(fakeTimersConfig?)` -Instructs Jest to use fake versions of the global date, performance, time and timers APIs. Fake timers implementation is backed by [@sinonjs/fake-timers](https://github.com/sinonjs/fake-timers). +Instructs Jest to use fake versions of the global date, performance, time and timer APIs. Fake timers implementation is backed by [@sinonjs/fake-timers](https://github.com/sinonjs/fake-timers). Fake timers will swap out `Date`, `performance.now()`, `queueMicrotask()`, `setImmediate()`, `clearImmediate()`, `setInterval()`, `clearInterval()`, `setTimeout()`, `clearTimeout()` with an implementation that gets its time from the fake clock. @@ -716,7 +716,7 @@ Returns the `jest` object for chaining. ### `jest.useRealTimers()` -Instructs Jest to restore the original implementations of the global date, performance, time and timers APIs. For example, you may call `jest.useRealTimers()` inside `afterEach` hook to restore timers after each test: +Instructs Jest to restore the original implementations of the global date, performance, time and timer APIs. For example, you may call `jest.useRealTimers()` inside `afterEach` hook to restore timers after each test: ```js afterEach(() => { diff --git a/docs/TimerMocks.md b/docs/TimerMocks.md index 42693dd7be37..1e0260c7def6 100644 --- a/docs/TimerMocks.md +++ b/docs/TimerMocks.md @@ -7,7 +7,7 @@ The native timer functions (i.e., `setTimeout()`, `setInterval()`, `clearTimeout :::info -Also see [Fake Timers](JestObjectAPI.md#fake-timers) API documentation. +Also see [Fake Timers API](JestObjectAPI.md#fake-timers) documentation. ::: @@ -169,7 +169,7 @@ Lastly, it may occasionally be useful in some tests to be able to clear all of t ## Selective Faking -By default, calling `jest.useFakeTimers()` will fake all timers API. Sometimes your code may require to avoid overwriting the original implementations. If that is the case, you can use `doNotFake` option. For example, here is how you could provide a custom mock function for `performance.mark()` in jsdom environment: +Sometimes your code may require to avoid overwriting the original implementation of one or another API. If that is the case, you can use `doNotFake` option. For example, here is how you could provide a custom mock function for `performance.mark()` in jsdom environment: ```js /** diff --git a/e2e/fake-timers/do-not-fake/__tests__/doNotFake.test.js b/e2e/fake-timers/do-not-fake/__tests__/doNotFake.test.js index d3382fccfc7a..8d4f5f149a78 100644 --- a/e2e/fake-timers/do-not-fake/__tests__/doNotFake.test.js +++ b/e2e/fake-timers/do-not-fake/__tests__/doNotFake.test.js @@ -12,7 +12,7 @@ const mockPerformanceMark = jest.fn(); window.performance.mark = mockPerformanceMark; -test('fakes all timers APIs', () => { +test('fakes all APIs', () => { jest.useFakeTimers(); expect(window.performance.mark).toBeUndefined(); From 5ba69dde42c7f978c5e80043b60c1db4d1669f60 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Mon, 21 Mar 2022 14:39:44 +0200 Subject: [PATCH 42/69] Update docs/JestObjectAPI.md Co-authored-by: Simen Bekkhus --- docs/JestObjectAPI.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/JestObjectAPI.md b/docs/JestObjectAPI.md index 9403f663e1c3..8ca90a248976 100644 --- a/docs/JestObjectAPI.md +++ b/docs/JestObjectAPI.md @@ -632,7 +632,7 @@ test('direct', () => { ### `jest.useFakeTimers(fakeTimersConfig?)` -Instructs Jest to use fake versions of the global date, performance, time and timer APIs. Fake timers implementation is backed by [@sinonjs/fake-timers](https://github.com/sinonjs/fake-timers). +Instructs Jest to use fake versions of the global date, performance, time and timer APIs. Fake timers implementation is backed by [`@sinonjs/fake-timers`](https://github.com/sinonjs/fake-timers). Fake timers will swap out `Date`, `performance.now()`, `queueMicrotask()`, `setImmediate()`, `clearImmediate()`, `setInterval()`, `clearInterval()`, `setTimeout()`, `clearTimeout()` with an implementation that gets its time from the fake clock. From 2b0a6fe00f47ccf2f5cef94d00ee78a601a13713 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Mon, 21 Mar 2022 17:49:06 +0200 Subject: [PATCH 43/69] one more backticks --- packages/jest-environment/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jest-environment/src/index.ts b/packages/jest-environment/src/index.ts index 69acfa00e094..2269d66b95c6 100644 --- a/packages/jest-environment/src/index.ts +++ b/packages/jest-environment/src/index.ts @@ -304,7 +304,7 @@ export interface Jest { /** * Instructs Jest to use fake versions of the global date, performance, * time and timers APIs. Fake timers implementation is backed by - * [@sinonjs/fake-timers](https://github.com/sinonjs/fake-timers). + * [`@sinonjs/fake-timers`](https://github.com/sinonjs/fake-timers). * * @remarks * Calling `jest.useFakeTimers()` once again in the same test file would reinstall From 6c7e24cbf5bb7f19ef14298734df916c77cf2c6a Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Tue, 22 Mar 2022 09:03:37 +0200 Subject: [PATCH 44/69] clean up --- packages/jest-types/src/Config.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/jest-types/src/Config.ts b/packages/jest-types/src/Config.ts index 6e56bfe9d581..515df04a1783 100644 --- a/packages/jest-types/src/Config.ts +++ b/packages/jest-types/src/Config.ts @@ -31,7 +31,7 @@ export type FakeableTimersAPI = export type BaseFakeTimersConfig = { /** - * Whether fake timers should be enabled for all tests. + * Whether fake timers should be enabled for all test files. * * @defaultValue * The default is `false`. @@ -67,7 +67,7 @@ export type ModernFakeTimersConfig = { * */ doNotFake?: Array; /** - * Sets the default unix epoch. May be a number (in milliseconds) or a Date object. + * Sets current system time to be used by fake timers. * * @defaultValue * The default is `Date.now()`. From a2dfb22c41815d126a309f2dbb264350074b2f5e Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Wed, 23 Mar 2022 20:32:14 +0200 Subject: [PATCH 45/69] bump @types/sinonjs__fake-timers --- packages/jest-fake-timers/package.json | 2 +- packages/jest-fake-timers/src/modernFakeTimers.ts | 1 - yarn.lock | 10 +++++----- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/jest-fake-timers/package.json b/packages/jest-fake-timers/package.json index 2628c49d119f..b029cb30b8ab 100644 --- a/packages/jest-fake-timers/package.json +++ b/packages/jest-fake-timers/package.json @@ -26,7 +26,7 @@ }, "devDependencies": { "@jest/test-utils": "^28.0.0-alpha.7", - "@types/sinonjs__fake-timers": "^8.1.1" + "@types/sinonjs__fake-timers": "^8.1.2" }, "engines": { "node": "^12.13.0 || ^14.15.0 || ^16.13.0 || >=17.0.0" diff --git a/packages/jest-fake-timers/src/modernFakeTimers.ts b/packages/jest-fake-timers/src/modernFakeTimers.ts index d68a047b1b63..90aa8f90832a 100644 --- a/packages/jest-fake-timers/src/modernFakeTimers.ts +++ b/packages/jest-fake-timers/src/modernFakeTimers.ts @@ -115,7 +115,6 @@ export default class FakeTimers { ); fakeTimersConfig?.doNotFake?.forEach(nameOfFakeableAPI => { - // @ts-expect-error: TODO remove after merging https://github.com/DefinitelyTyped/DefinitelyTyped/pull/59269 toFake.delete(nameOfFakeableAPI); }); diff --git a/yarn.lock b/yarn.lock index 0d36e628e6e1..445011d3bc46 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2654,7 +2654,7 @@ __metadata: "@jest/types": ^28.0.0-alpha.7 "@sinonjs/fake-timers": ^9.1.1 "@types/node": "*" - "@types/sinonjs__fake-timers": ^8.1.1 + "@types/sinonjs__fake-timers": ^8.1.2 jest-message-util: ^28.0.0-alpha.7 jest-mock: ^28.0.0-alpha.7 jest-util: ^28.0.0-alpha.7 @@ -5425,10 +5425,10 @@ __metadata: languageName: node linkType: hard -"@types/sinonjs__fake-timers@npm:^8.1.1": - version: 8.1.1 - resolution: "@types/sinonjs__fake-timers@npm:8.1.1" - checksum: ca09d54d47091d87020824a73f026300fa06b17cd9f2f9b9387f28b549364b141ef194ee28db762f6588de71d8febcd17f753163cb7ea116b8387c18e80ebd5c +"@types/sinonjs__fake-timers@npm:^8.1.2": + version: 8.1.2 + resolution: "@types/sinonjs__fake-timers@npm:8.1.2" + checksum: bbc73a5ab6c0ec974929392f3d6e1e8db4ebad97ec506d785301e1c3d8a4f98a35b1aa95b97035daef02886fd8efd7788a2fa3ced2ec7105988bfd8dce61eedd languageName: node linkType: hard From 01fabf4c1bed63712c8f1193a5e8c6780dcd24a1 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Thu, 24 Mar 2022 08:21:17 +0200 Subject: [PATCH 46/69] docs --- packages/jest-environment/src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/jest-environment/src/index.ts b/packages/jest-environment/src/index.ts index 2269d66b95c6..36a1ee4ea171 100644 --- a/packages/jest-environment/src/index.ts +++ b/packages/jest-environment/src/index.ts @@ -303,7 +303,7 @@ export interface Jest { unmock(moduleName: string): Jest; /** * Instructs Jest to use fake versions of the global date, performance, - * time and timers APIs. Fake timers implementation is backed by + * time and timer APIs. Fake timers implementation is backed by * [`@sinonjs/fake-timers`](https://github.com/sinonjs/fake-timers). * * @remarks @@ -317,7 +317,7 @@ export interface Jest { ): Jest; /** * Instructs Jest to restore the original implementations of the global date, - * performance, time and timers APIs. + * performance, time and timer APIs. */ useRealTimers(): Jest; } From 9e3d7bf92b93d7ab726b0f4426270a866b2acd78 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Thu, 24 Mar 2022 08:40:37 +0200 Subject: [PATCH 47/69] tweak types --- packages/jest-environment/src/index.ts | 4 +--- .../jest-fake-timers/src/modernFakeTimers.ts | 6 +++--- .../jest-types/__typetests__/jest.test.ts | 4 +--- packages/jest-types/src/Config.ts | 20 +++++++++---------- 4 files changed, 15 insertions(+), 19 deletions(-) diff --git a/packages/jest-environment/src/index.ts b/packages/jest-environment/src/index.ts index 36a1ee4ea171..456993bfd33a 100644 --- a/packages/jest-environment/src/index.ts +++ b/packages/jest-environment/src/index.ts @@ -311,9 +311,7 @@ export interface Jest { * fake timers using the provided options. */ useFakeTimers( - fakeTimersConfig?: - | Config.LegacyFakeTimersConfig - | Config.ModernFakeTimersConfig, + fakeTimersConfig?: Config.FakeTimersConfig | Config.LegacyFakeTimersConfig, ): Jest; /** * Instructs Jest to restore the original implementations of the global date, diff --git a/packages/jest-fake-timers/src/modernFakeTimers.ts b/packages/jest-fake-timers/src/modernFakeTimers.ts index 90aa8f90832a..475324ae302e 100644 --- a/packages/jest-fake-timers/src/modernFakeTimers.ts +++ b/packages/jest-fake-timers/src/modernFakeTimers.ts @@ -92,18 +92,18 @@ export default class FakeTimers { } } - useFakeTimers(fakeTimersConfig?: Config.FakeTimersConfig): void { + useFakeTimers(fakeTimersConfig?: Config.FakeTimers): void { if (this._fakingTime) { this._clock.uninstall(); } const toSinonFakeTimersConfig = ( - fakeTimersConfig?: Config.FakeTimersConfig, + fakeTimersConfig?: Config.FakeTimers, ): SinonFakeTimersConfig => { fakeTimersConfig = { ...this._config.fakeTimers, ...fakeTimersConfig, - } as Config.ModernFakeTimersConfig; + } as Config.FakeTimersConfig; const advanceTimeDelta = typeof fakeTimersConfig.advanceTimers === 'number' diff --git a/packages/jest-types/__typetests__/jest.test.ts b/packages/jest-types/__typetests__/jest.test.ts index 8539c8f7f499..301068029cfd 100644 --- a/packages/jest-types/__typetests__/jest.test.ts +++ b/packages/jest-types/__typetests__/jest.test.ts @@ -277,9 +277,7 @@ expectType(jest.useFakeTimers({now: Date.now()})); expectType(jest.useFakeTimers({now: new Date(1995, 11, 17)})); expectType(jest.useFakeTimers({timerLimit: 1000})); expectError(jest.useFakeTimers({enableGlobally: true})); -expectError( - jest.useFakeTimers({enableGlobally: true, legacyFakeTimers: false}), -); +expectError(jest.useFakeTimers({enableGlobally: true, legacyFakeTimers: true})); expectError(jest.useFakeTimers({legacyFakeTimers: true, toFake: ['Date']})); expectError(jest.useFakeTimers('modern')); diff --git a/packages/jest-types/src/Config.ts b/packages/jest-types/src/Config.ts index 515df04a1783..1df15f7f33e8 100644 --- a/packages/jest-types/src/Config.ts +++ b/packages/jest-types/src/Config.ts @@ -12,7 +12,7 @@ import type {SnapshotFormat} from '@jest/schemas'; type CoverageProvider = 'babel' | 'v8'; -export type FakeableTimersAPI = +export type FakeableAPI = | 'Date' | 'hrtime' | 'nextTick' @@ -29,9 +29,9 @@ export type FakeableTimersAPI = | 'setTimeout' | 'clearTimeout'; -export type BaseFakeTimersConfig = { +export type GlobalFakeTimersConfig = { /** - * Whether fake timers should be enabled for all test files. + * Whether fake timers should be enabled globally for all test files. * * @defaultValue * The default is `false`. @@ -49,7 +49,7 @@ export type LegacyFakeTimersConfig = { legacyFakeTimers?: true; }; -export type ModernFakeTimersConfig = { +export type FakeTimersConfig = { /** * If set to `true` all timers will be advanced automatically by 20 milliseconds * every 20 milliseconds. A custom time delta may be provided by passing a number. @@ -65,7 +65,7 @@ export type ModernFakeTimersConfig = { * @defaultValue * The default is `[]`. * */ - doNotFake?: Array; + doNotFake?: Array; /** * Sets current system time to be used by fake timers. * @@ -89,8 +89,8 @@ export type ModernFakeTimersConfig = { legacyFakeTimers?: false; }; -export type FakeTimersConfig = BaseFakeTimersConfig & - (LegacyFakeTimersConfig | ModernFakeTimersConfig); +export type FakeTimers = GlobalFakeTimersConfig & + (FakeTimersConfig | LegacyFakeTimersConfig); export type HasteConfig = { /** Whether to hash files using SHA-1. */ @@ -154,7 +154,7 @@ export type DefaultOptions = { errorOnDeprecated: boolean; expand: boolean; extensionsToTreatAsEsm: Array; - fakeTimers: FakeTimersConfig; + fakeTimers: FakeTimers; forceCoverageMatch: Array; globals: ConfigGlobals; haste: HasteConfig; @@ -236,7 +236,7 @@ export type InitialOptions = Partial<{ displayName: string | DisplayName; expand: boolean; extensionsToTreatAsEsm: Array; - fakeTimers: FakeTimersConfig; + fakeTimers: FakeTimers; filter: string; findRelatedTests: boolean; forceCoverageMatch: Array; @@ -441,7 +441,7 @@ export type ProjectConfig = { displayName?: DisplayName; errorOnDeprecated: boolean; extensionsToTreatAsEsm: Array; - fakeTimers: FakeTimersConfig; + fakeTimers: FakeTimers; filter?: string; forceCoverageMatch: Array; globalSetup?: string; From 73e092bde458ea3df50bdec96e39a4d7159039a6 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Thu, 24 Mar 2022 19:42:56 +0200 Subject: [PATCH 48/69] prettier --- e2e/fake-promises/asap/package.json | 4 +++- e2e/fake-promises/immediate/package.json | 4 +++- e2e/fake-timers-legacy/enable-globally/package.json | 5 ++++- .../enable-legacy-fake-timers/package.json | 4 +++- e2e/fake-timers-legacy/reset-all-mocks/package.json | 4 +++- e2e/fake-timers-legacy/reset-mocks/package.json | 4 +++- e2e/fake-timers-legacy/set-immediate/package.json | 5 ++++- e2e/fake-timers-legacy/use-real-timers/package.json | 5 ++++- e2e/fake-timers/enable-globally/package.json | 4 +++- e2e/fake-timers/set-immediate/package.json | 4 +++- e2e/fake-timers/timer-limit/package.json | 5 ++++- e2e/fake-timers/use-real-timers/package.json | 4 +++- 12 files changed, 40 insertions(+), 12 deletions(-) diff --git a/e2e/fake-promises/asap/package.json b/e2e/fake-promises/asap/package.json index d918d72c0c49..b873db8ccbb8 100644 --- a/e2e/fake-promises/asap/package.json +++ b/e2e/fake-promises/asap/package.json @@ -1,6 +1,8 @@ { "jest": { - "fakeTimers": {"enableGlobally": true}, + "fakeTimers": { + "enableGlobally": true + }, "setupFiles": [ "/fake-promises" ] diff --git a/e2e/fake-promises/immediate/package.json b/e2e/fake-promises/immediate/package.json index d918d72c0c49..b873db8ccbb8 100644 --- a/e2e/fake-promises/immediate/package.json +++ b/e2e/fake-promises/immediate/package.json @@ -1,6 +1,8 @@ { "jest": { - "fakeTimers": {"enableGlobally": true}, + "fakeTimers": { + "enableGlobally": true + }, "setupFiles": [ "/fake-promises" ] diff --git a/e2e/fake-timers-legacy/enable-globally/package.json b/e2e/fake-timers-legacy/enable-globally/package.json index cc9bf9d40c63..3cd8baba5623 100644 --- a/e2e/fake-timers-legacy/enable-globally/package.json +++ b/e2e/fake-timers-legacy/enable-globally/package.json @@ -1,6 +1,9 @@ { "name": "enable-globally-legacy", "jest": { - "fakeTimers": {"enableGlobally": true, "legacyFakeTimers": true} + "fakeTimers": { + "enableGlobally": true, + "legacyFakeTimers": true + } } } diff --git a/e2e/fake-timers-legacy/enable-legacy-fake-timers/package.json b/e2e/fake-timers-legacy/enable-legacy-fake-timers/package.json index f94dbf9cd7d4..9935c2240d23 100644 --- a/e2e/fake-timers-legacy/enable-legacy-fake-timers/package.json +++ b/e2e/fake-timers-legacy/enable-legacy-fake-timers/package.json @@ -1,6 +1,8 @@ { "name": "enable-legacy-fake-timers", "jest": { - "fakeTimers": {"legacyFakeTimers": true} + "fakeTimers": { + "legacyFakeTimers": true + } } } diff --git a/e2e/fake-timers-legacy/reset-all-mocks/package.json b/e2e/fake-timers-legacy/reset-all-mocks/package.json index 13f8c29a77f4..9859a3b1aacb 100644 --- a/e2e/fake-timers-legacy/reset-all-mocks/package.json +++ b/e2e/fake-timers-legacy/reset-all-mocks/package.json @@ -1,7 +1,9 @@ { "name": "reset-all-mocks", "jest": { - "fakeTimers": {"legacyFakeTimers": true}, + "fakeTimers": { + "legacyFakeTimers": true + }, "resetMocks": false } } diff --git a/e2e/fake-timers-legacy/reset-mocks/package.json b/e2e/fake-timers-legacy/reset-mocks/package.json index 8a8ff133e0c2..f4c9b465c55c 100644 --- a/e2e/fake-timers-legacy/reset-mocks/package.json +++ b/e2e/fake-timers-legacy/reset-mocks/package.json @@ -1,7 +1,9 @@ { "name": "reset-mocks", "jest": { - "fakeTimers": {"legacyFakeTimers": true}, + "fakeTimers": { + "legacyFakeTimers": true + }, "resetMocks": true } } diff --git a/e2e/fake-timers-legacy/set-immediate/package.json b/e2e/fake-timers-legacy/set-immediate/package.json index dc1b21b0d329..d9c70d1fd4e5 100644 --- a/e2e/fake-timers-legacy/set-immediate/package.json +++ b/e2e/fake-timers-legacy/set-immediate/package.json @@ -1,6 +1,9 @@ { "name": "set-immediate-legacy", "jest": { - "fakeTimers": {"enableGlobally": true, "legacyFakeTimers": true} + "fakeTimers": { + "enableGlobally": true, + "legacyFakeTimers": true + } } } diff --git a/e2e/fake-timers-legacy/use-real-timers/package.json b/e2e/fake-timers-legacy/use-real-timers/package.json index 6a11b5cf1259..9f83a4f4086f 100644 --- a/e2e/fake-timers-legacy/use-real-timers/package.json +++ b/e2e/fake-timers-legacy/use-real-timers/package.json @@ -1,6 +1,9 @@ { "name": "use-real-timers-legacy", "jest": { - "fakeTimers": {"enableGlobally": true, "legacyFakeTimers": true} + "fakeTimers": { + "enableGlobally": true, + "legacyFakeTimers": true + } } } diff --git a/e2e/fake-timers/enable-globally/package.json b/e2e/fake-timers/enable-globally/package.json index 008ec476acf0..8d75224d03c3 100644 --- a/e2e/fake-timers/enable-globally/package.json +++ b/e2e/fake-timers/enable-globally/package.json @@ -1,6 +1,8 @@ { "name": "enable-globally", "jest": { - "fakeTimers": {"enableGlobally": true} + "fakeTimers": { + "enableGlobally": true + } } } diff --git a/e2e/fake-timers/set-immediate/package.json b/e2e/fake-timers/set-immediate/package.json index 906451862750..2826715e9705 100644 --- a/e2e/fake-timers/set-immediate/package.json +++ b/e2e/fake-timers/set-immediate/package.json @@ -1,6 +1,8 @@ { "name": "set-immediate", "jest": { - "fakeTimers": {"enableGlobally": true} + "fakeTimers": { + "enableGlobally": true + } } } diff --git a/e2e/fake-timers/timer-limit/package.json b/e2e/fake-timers/timer-limit/package.json index 47f6803134b8..81b4c8e4fb99 100644 --- a/e2e/fake-timers/timer-limit/package.json +++ b/e2e/fake-timers/timer-limit/package.json @@ -1,6 +1,9 @@ { "name": "timer-limit", "jest": { - "fakeTimers": {"enableGlobally": true, "timerLimit": 10} + "fakeTimers": { + "enableGlobally": true, + "timerLimit": 10 + } } } diff --git a/e2e/fake-timers/use-real-timers/package.json b/e2e/fake-timers/use-real-timers/package.json index ce6e42900ae3..9e31cf9ea744 100644 --- a/e2e/fake-timers/use-real-timers/package.json +++ b/e2e/fake-timers/use-real-timers/package.json @@ -1,6 +1,8 @@ { "name": "use-real-timers", "jest": { - "fakeTimers": {"enableGlobally": true} + "fakeTimers": { + "enableGlobally": true + } } } From 23196ddbb693b703bd77a69eb439f8646cc39fcb Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Thu, 24 Mar 2022 20:17:35 +0200 Subject: [PATCH 49/69] fix docs --- docs/Configuration.md | 4 ++-- docs/JestObjectAPI.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/Configuration.md b/docs/Configuration.md index 05ed389583d1..3903a0e62186 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -438,12 +438,12 @@ type ModernFakeTimersConfig = { * The default is `false`. */ advanceTimers?: boolean | number; - /** List of names of APIs that should not be faked. The default is `[]`. */ + /** List of names of APIs that should not be faked. The default is `[]`, meaning all APIs are faked. */ doNotFake?: Array; /** Whether fake timers should be enabled for all test files. The default is `false`. */ enableGlobally?: boolean; /** Sets current system time to be used by fake timers. The default is `Date.now()`. */ - now?: number | Date; + now?: number; /** Maximum number of timers that will be run. The default is `100_000` timers. */ timerLimit?: number; }; diff --git a/docs/JestObjectAPI.md b/docs/JestObjectAPI.md index 8ca90a248976..8507433e52d2 100644 --- a/docs/JestObjectAPI.md +++ b/docs/JestObjectAPI.md @@ -636,7 +636,7 @@ Instructs Jest to use fake versions of the global date, performance, time and ti Fake timers will swap out `Date`, `performance.now()`, `queueMicrotask()`, `setImmediate()`, `clearImmediate()`, `setInterval()`, `clearInterval()`, `setTimeout()`, `clearTimeout()` with an implementation that gets its time from the fake clock. -In node environment `process.hrtime`, `process.nextTick()` and in jsdom environment `requestAnimationFrame()`, `cancelAnimationFrame()`, `requestIdleCallback()`, `cancelIdleCallback()` will be replaced as well. +In Node environment `process.hrtime`, `process.nextTick()` and in JSDOM environment `requestAnimationFrame()`, `cancelAnimationFrame()`, `requestIdleCallback()`, `cancelIdleCallback()` will be replaced as well. Configuration options: @@ -708,7 +708,7 @@ jest.useFakeTimers({ }); ``` -Legacy fake timers will swap out `setImmediate()`, `clearImmediate()`, `setInterval()`, `clearInterval()`, `setTimeout()`, `clearTimeout()` with Jest mock functions. In node environment `process.nextTick()` and in jsdom environment `requestAnimationFrame()`, `cancelAnimationFrame()` will be also replaced. +Legacy fake timers will swap out `setImmediate()`, `clearImmediate()`, `setInterval()`, `clearInterval()`, `setTimeout()`, `clearTimeout()` with Jest [mock functions](MockFunctionAPI.md). In Node environment `process.nextTick()` and in JSDOM environment `requestAnimationFrame()`, `cancelAnimationFrame()` will be also replaced. ::: From 4354da84ae317b67e27de8806a3fe2984f3374de Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Thu, 24 Mar 2022 20:17:53 +0200 Subject: [PATCH 50/69] now must be a number --- packages/jest-config/src/ValidConfig.ts | 2 +- packages/jest-types/__typetests__/jest.test.ts | 1 - packages/jest-types/src/Config.ts | 4 ++-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/jest-config/src/ValidConfig.ts b/packages/jest-config/src/ValidConfig.ts index 919831f1b786..164befa0a673 100644 --- a/packages/jest-config/src/ValidConfig.ts +++ b/packages/jest-config/src/ValidConfig.ts @@ -70,7 +70,7 @@ const initialOptions: Config.InitialOptions = { ], enableGlobally: true, legacyFakeTimers: false, - now: multipleValidOptions(0, new Date()), + now: 1483228800000, timerLimit: 1000, }, filter: '/filter.js', diff --git a/packages/jest-types/__typetests__/jest.test.ts b/packages/jest-types/__typetests__/jest.test.ts index 301068029cfd..00e12f6adf5d 100644 --- a/packages/jest-types/__typetests__/jest.test.ts +++ b/packages/jest-types/__typetests__/jest.test.ts @@ -274,7 +274,6 @@ expectType( expectType(jest.useFakeTimers({legacyFakeTimers: true})); expectType(jest.useFakeTimers({now: 1483228800000})); expectType(jest.useFakeTimers({now: Date.now()})); -expectType(jest.useFakeTimers({now: new Date(1995, 11, 17)})); expectType(jest.useFakeTimers({timerLimit: 1000})); expectError(jest.useFakeTimers({enableGlobally: true})); expectError(jest.useFakeTimers({enableGlobally: true, legacyFakeTimers: true})); diff --git a/packages/jest-types/src/Config.ts b/packages/jest-types/src/Config.ts index 1df15f7f33e8..b3f154cc5cc8 100644 --- a/packages/jest-types/src/Config.ts +++ b/packages/jest-types/src/Config.ts @@ -63,7 +63,7 @@ export type FakeTimersConfig = { * `nextTick`, `performance`) that should not be faked. * * @defaultValue - * The default is `[]`. + * The default is `[]`, meaning all APIs are faked. * */ doNotFake?: Array; /** @@ -72,7 +72,7 @@ export type FakeTimersConfig = { * @defaultValue * The default is `Date.now()`. */ - now?: number | Date; + now?: number; /** * The maximum number of timers that will be run when calling `jest.runAllTimers()`. * From 8cc5b8c94985b005da288318f7b04a4b30f657d0 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Thu, 24 Mar 2022 20:23:50 +0200 Subject: [PATCH 51/69] true conditions first --- .../src/legacy-code-todo-rewrite/jestAdapter.ts | 6 +++--- packages/jest-jasmine2/src/index.ts | 6 +++--- packages/jest-runtime/src/index.ts | 12 ++++++------ 3 files changed, 12 insertions(+), 12 deletions(-) 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 f311e354dca0..a02de22133cd 100644 --- a/packages/jest-circus/src/legacy-code-todo-rewrite/jestAdapter.ts +++ b/packages/jest-circus/src/legacy-code-todo-rewrite/jestAdapter.ts @@ -39,11 +39,11 @@ const jestAdapter = async ( }); if (config.fakeTimers.enableGlobally) { - if (!config.fakeTimers.legacyFakeTimers) { + if (config.fakeTimers.legacyFakeTimers) { // during setup, this cannot be null (and it's fine to explode if it is) - environment.fakeTimersModern!.useFakeTimers(); - } else { environment.fakeTimers!.useFakeTimers(); + } else { + environment.fakeTimersModern!.useFakeTimers(); } } diff --git a/packages/jest-jasmine2/src/index.ts b/packages/jest-jasmine2/src/index.ts index e57fa6e036a7..9d63625522b3 100644 --- a/packages/jest-jasmine2/src/index.ts +++ b/packages/jest-jasmine2/src/index.ts @@ -89,10 +89,10 @@ export default async function jasmine2( environment.global.describe.only = environment.global.fdescribe; if (config.fakeTimers.enableGlobally) { - if (!config.fakeTimers.legacyFakeTimers) { - environment.fakeTimersModern!.useFakeTimers(); - } else { + if (config.fakeTimers.legacyFakeTimers) { environment.fakeTimers!.useFakeTimers(); + } else { + environment.fakeTimersModern!.useFakeTimers(); } } diff --git a/packages/jest-runtime/src/index.ts b/packages/jest-runtime/src/index.ts index 02f8168d988a..3929b1b3fac0 100644 --- a/packages/jest-runtime/src/index.ts +++ b/packages/jest-runtime/src/index.ts @@ -279,9 +279,9 @@ export default class Runtime { this._shouldUnmockTransitiveDependenciesCache = new Map(); this._transitiveShouldMock = new Map(); - this._fakeTimersImplementation = !config.fakeTimers.legacyFakeTimers - ? this._environment.fakeTimersModern - : this._environment.fakeTimers; + this._fakeTimersImplementation = config.fakeTimers.legacyFakeTimers + ? this._environment.fakeTimers + : this._environment.fakeTimersModern; this._unmockList = unmockRegExpCache.get(config); if (!this._unmockList && config.unmockedModulePathPatterns) { @@ -2069,10 +2069,10 @@ export default class Runtime { ...this._config.fakeTimers, ...fakeTimersConfig, }; - if (!fakeTimersConfig?.legacyFakeTimers) { - this._fakeTimersImplementation = this._environment.fakeTimersModern; - } else { + if (fakeTimersConfig?.legacyFakeTimers) { this._fakeTimersImplementation = this._environment.fakeTimers; + } else { + this._fakeTimersImplementation = this._environment.fakeTimersModern; } this._fakeTimersImplementation!.useFakeTimers(fakeTimersConfig); return jestObject; From c78df2e22bd6def39badb44c91594fc9ae2ae942 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Thu, 24 Mar 2022 20:34:32 +0200 Subject: [PATCH 52/69] more type tests --- packages/jest-types/__typetests__/jest.test.ts | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/packages/jest-types/__typetests__/jest.test.ts b/packages/jest-types/__typetests__/jest.test.ts index 00e12f6adf5d..f13f52f05d82 100644 --- a/packages/jest-types/__typetests__/jest.test.ts +++ b/packages/jest-types/__typetests__/jest.test.ts @@ -247,8 +247,11 @@ expectType(jest.setSystemTime(new Date(1995, 11, 17))); expectError(jest.setSystemTime('1995-12-17T03:24:00')); expectType(jest.useFakeTimers()); + expectType(jest.useFakeTimers({advanceTimers: true})); expectType(jest.useFakeTimers({advanceTimers: 10})); +expectError(jest.useFakeTimers({advanceTimers: 'fast'})); + expectType(jest.useFakeTimers({doNotFake: ['Date']})); expectType( jest.useFakeTimers({ @@ -271,13 +274,23 @@ expectType( ], }), ); +expectError(jest.useFakeTimers({doNotFake: ['globalThis']})); + expectType(jest.useFakeTimers({legacyFakeTimers: true})); +expectError(jest.useFakeTimers({legacyFakeTimers: 1000})); +expectError(jest.useFakeTimers({doNotFake: ['Date'], legacyFakeTimers: true})); +expectError(jest.useFakeTimers({enableGlobally: true, legacyFakeTimers: true})); +expectError(jest.useFakeTimers({now: 1483228800000, legacyFakeTimers: true})); +expectError(jest.useFakeTimers({timerLimit: 1000, legacyFakeTimers: true})); + expectType(jest.useFakeTimers({now: 1483228800000})); expectType(jest.useFakeTimers({now: Date.now()})); +expectError(jest.useFakeTimers({now: new Date()})); + expectType(jest.useFakeTimers({timerLimit: 1000})); +expectError(jest.useFakeTimers({timerLimit: true})); + expectError(jest.useFakeTimers({enableGlobally: true})); -expectError(jest.useFakeTimers({enableGlobally: true, legacyFakeTimers: true})); -expectError(jest.useFakeTimers({legacyFakeTimers: true, toFake: ['Date']})); expectError(jest.useFakeTimers('modern')); expectType(jest.useRealTimers()); From 2168c495c89edaedcf5145fc7a8e15ea93cd7080 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Fri, 25 Mar 2022 07:11:07 +0200 Subject: [PATCH 53/69] more docs --- docs/Configuration.md | 5 +++++ docs/JestObjectAPI.md | 9 +++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/Configuration.md b/docs/Configuration.md index 3903a0e62186..8b61063e5d6b 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -442,6 +442,11 @@ type ModernFakeTimersConfig = { doNotFake?: Array; /** Whether fake timers should be enabled for all test files. The default is `false`. */ enableGlobally?: boolean; + /** + * Use the old fake timers implementation instead of one backed by `@sinonjs/fake-timers`. + * The default is `false`. + */ + legacyFakeTimers?: boolean; /** Sets current system time to be used by fake timers. The default is `Date.now()`. */ now?: number; /** Maximum number of timers that will be run. The default is `100_000` timers. */ diff --git a/docs/JestObjectAPI.md b/docs/JestObjectAPI.md index 8507433e52d2..85b5ea24f077 100644 --- a/docs/JestObjectAPI.md +++ b/docs/JestObjectAPI.md @@ -665,8 +665,13 @@ type FakeTimersConfig = { * The default is `false`. */ advanceTimers?: boolean | number; - /** List of names of APIs that should not be faked. The default is `[]`. */ + /** List of names of APIs that should not be faked. The default is `[]`, meaning all APIs are faked. */ doNotFake?: Array; + /** + * Use the old fake timers implementation instead of one backed by `@sinonjs/fake-timers`. + * The default is `false`. + */ + legacyFakeTimers?: boolean; /** Sets current system time to be used by fake timers. The default is `Date.now()`. */ now?: number | Date; /** @@ -677,7 +682,7 @@ type FakeTimersConfig = { }; ``` -Calling `jest.useRealTimers()` will use fake timers for all tests within the file, until original timers are restored with `jest.useRealTimers()`. +Calling `jest.useFakeTimers()` will use fake timers for all tests within the file, until original timers are restored with `jest.useRealTimers()`. You can call `jest.useFakeTimers()` or `jest.useRealTimers()` from anywhere: top level, inside an `test` block, etc. Keep in mind that this is a **global operation** and will affect other tests within the same file. Calling `jest.useFakeTimers()` once again in the same test file would reset the internal state (e.g. timer count) and reinstall fake timers using the provided options: From d183309ff3adec7a267df21ef55c70dd6c4a838c Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Sat, 26 Mar 2022 16:09:40 +0200 Subject: [PATCH 54/69] refactor toSinonFakeTimersConfig --- .../jest-fake-timers/src/modernFakeTimers.ts | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/packages/jest-fake-timers/src/modernFakeTimers.ts b/packages/jest-fake-timers/src/modernFakeTimers.ts index 475324ae302e..b0733044b2fb 100644 --- a/packages/jest-fake-timers/src/modernFakeTimers.ts +++ b/packages/jest-fake-timers/src/modernFakeTimers.ts @@ -97,39 +97,8 @@ export default class FakeTimers { this._clock.uninstall(); } - const toSinonFakeTimersConfig = ( - fakeTimersConfig?: Config.FakeTimers, - ): SinonFakeTimersConfig => { - fakeTimersConfig = { - ...this._config.fakeTimers, - ...fakeTimersConfig, - } as Config.FakeTimersConfig; - - const advanceTimeDelta = - typeof fakeTimersConfig.advanceTimers === 'number' - ? fakeTimersConfig.advanceTimers - : undefined; - - const toFake = new Set( - Object.keys(this._fakeTimers.timers) as Array, - ); - - fakeTimersConfig?.doNotFake?.forEach(nameOfFakeableAPI => { - toFake.delete(nameOfFakeableAPI); - }); - - return { - advanceTimeDelta, - loopLimit: fakeTimersConfig.timerLimit, - now: fakeTimersConfig.now ?? Date.now(), - shouldAdvanceTime: Boolean(fakeTimersConfig.advanceTimers), - shouldClearNativeTimers: true, - toFake: Array.from(toFake), - }; - }; - this._clock = this._fakeTimers.install( - toSinonFakeTimersConfig(fakeTimersConfig), + this._toSinonFakeTimersConfig(fakeTimersConfig), ); this._fakingTime = true; @@ -177,4 +146,35 @@ export default class FakeTimers { return this._fakingTime; } + + private _toSinonFakeTimersConfig( + fakeTimersConfig: Config.FakeTimers = {}, + ): SinonFakeTimersConfig { + fakeTimersConfig = { + ...this._config.fakeTimers, + ...fakeTimersConfig, + } as Config.FakeTimersConfig; + + const advanceTimeDelta = + typeof fakeTimersConfig.advanceTimers === 'number' + ? fakeTimersConfig.advanceTimers + : undefined; + + const toFake = new Set( + Object.keys(this._fakeTimers.timers) as Array, + ); + + fakeTimersConfig.doNotFake?.forEach(nameOfFakeableAPI => { + toFake.delete(nameOfFakeableAPI); + }); + + return { + advanceTimeDelta, + loopLimit: fakeTimersConfig.timerLimit, + now: fakeTimersConfig.now ?? Date.now(), + shouldAdvanceTime: Boolean(fakeTimersConfig.advanceTimers), + shouldClearNativeTimers: true, + toFake: Array.from(toFake), + }; + } } From ca52b59b54e0675670c65eb02d6b46649ba48fd4 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Sat, 26 Mar 2022 16:09:54 +0200 Subject: [PATCH 55/69] fix lint errors --- packages/jest-types/__typetests__/jest.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/jest-types/__typetests__/jest.test.ts b/packages/jest-types/__typetests__/jest.test.ts index f13f52f05d82..0982c00d1950 100644 --- a/packages/jest-types/__typetests__/jest.test.ts +++ b/packages/jest-types/__typetests__/jest.test.ts @@ -280,8 +280,8 @@ expectType(jest.useFakeTimers({legacyFakeTimers: true})); expectError(jest.useFakeTimers({legacyFakeTimers: 1000})); expectError(jest.useFakeTimers({doNotFake: ['Date'], legacyFakeTimers: true})); expectError(jest.useFakeTimers({enableGlobally: true, legacyFakeTimers: true})); -expectError(jest.useFakeTimers({now: 1483228800000, legacyFakeTimers: true})); -expectError(jest.useFakeTimers({timerLimit: 1000, legacyFakeTimers: true})); +expectError(jest.useFakeTimers({legacyFakeTimers: true, now: 1483228800000})); +expectError(jest.useFakeTimers({legacyFakeTimers: true, timerLimit: 1000})); expectType(jest.useFakeTimers({now: 1483228800000})); expectType(jest.useFakeTimers({now: Date.now()})); From fb61d57948500384e51de995c89c9df0d9b6a71b Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Sun, 27 Mar 2022 09:44:48 +0300 Subject: [PATCH 56/69] tweak types --- .../jest-fake-timers/src/modernFakeTimers.ts | 4 +- packages/jest-runtime/src/index.ts | 2 +- .../jest-types/__typetests__/config.test.ts | 80 ++++++++++++++++++- .../jest-types/__typetests__/jest.test.ts | 4 +- packages/jest-types/src/Config.ts | 35 ++++---- 5 files changed, 106 insertions(+), 19 deletions(-) diff --git a/packages/jest-fake-timers/src/modernFakeTimers.ts b/packages/jest-fake-timers/src/modernFakeTimers.ts index b0733044b2fb..977bc56a8df7 100644 --- a/packages/jest-fake-timers/src/modernFakeTimers.ts +++ b/packages/jest-fake-timers/src/modernFakeTimers.ts @@ -92,7 +92,7 @@ export default class FakeTimers { } } - useFakeTimers(fakeTimersConfig?: Config.FakeTimers): void { + useFakeTimers(fakeTimersConfig?: Config.FakeTimersConfig): void { if (this._fakingTime) { this._clock.uninstall(); } @@ -148,7 +148,7 @@ export default class FakeTimers { } private _toSinonFakeTimersConfig( - fakeTimersConfig: Config.FakeTimers = {}, + fakeTimersConfig: Config.FakeTimersConfig = {}, ): SinonFakeTimersConfig { fakeTimersConfig = { ...this._config.fakeTimers, diff --git a/packages/jest-runtime/src/index.ts b/packages/jest-runtime/src/index.ts index 3929b1b3fac0..abc76358872b 100644 --- a/packages/jest-runtime/src/index.ts +++ b/packages/jest-runtime/src/index.ts @@ -2068,7 +2068,7 @@ export default class Runtime { fakeTimersConfig = { ...this._config.fakeTimers, ...fakeTimersConfig, - }; + } as Config.FakeTimersConfig; if (fakeTimersConfig?.legacyFakeTimers) { this._fakeTimersImplementation = this._environment.fakeTimers; } else { diff --git a/packages/jest-types/__typetests__/config.test.ts b/packages/jest-types/__typetests__/config.test.ts index dd69249ea7b6..04027cae0dcb 100644 --- a/packages/jest-types/__typetests__/config.test.ts +++ b/packages/jest-types/__typetests__/config.test.ts @@ -5,9 +5,11 @@ * LICENSE file in the root directory of this source tree. */ -import {expectAssignable} from 'tsd-lite'; +import {expectAssignable, expectError, expectNotAssignable} from 'tsd-lite'; import type {Config} from '@jest/types'; +expectAssignable({}); + expectAssignable({ coverageThreshold: { './src/api/very-important-module.js': { @@ -39,3 +41,79 @@ expectAssignable({ }, ], }); + +const doNotFake: Array = [ + 'Date', + 'hrtime', + 'nextTick', + 'performance', + 'queueMicrotask', + 'requestAnimationFrame', + 'cancelAnimationFrame', + 'requestIdleCallback', + 'cancelIdleCallback', + 'setImmediate', + 'clearImmediate', + 'setInterval', + 'clearInterval', + 'setTimeout', + 'clearTimeout', +]; + +expectAssignable({ + fakeTimers: { + advanceTimers: true, + doNotFake, + enableGlobally: true, + now: 1483228800000, + timerLimit: 1000, + }, +}); + +expectAssignable({ + fakeTimers: { + advanceTimers: 40, + now: Date.now(), + }, +}); + +expectError({ + fakeTimers: { + now: new Date(), + }, +}); + +expectAssignable({ + fakeTimers: { + enableGlobally: true, + legacyFakeTimers: true, + }, +}); + +expectError({ + fakeTimers: { + advanceTimers: true, + legacyFakeTimers: true, + }, +}); + +expectError({ + fakeTimers: { + doNotFake, + legacyFakeTimers: true, + }, +}); + +expectError({ + fakeTimers: { + legacyFakeTimers: true, + now: 1483228800000, + }, +}); + +expectError({ + fakeTimers: { + legacyFakeTimers: true, + timerLimit: 1000, + }, +}); diff --git a/packages/jest-types/__typetests__/jest.test.ts b/packages/jest-types/__typetests__/jest.test.ts index 0982c00d1950..ae46c5e4e372 100644 --- a/packages/jest-types/__typetests__/jest.test.ts +++ b/packages/jest-types/__typetests__/jest.test.ts @@ -285,12 +285,14 @@ expectError(jest.useFakeTimers({legacyFakeTimers: true, timerLimit: 1000})); expectType(jest.useFakeTimers({now: 1483228800000})); expectType(jest.useFakeTimers({now: Date.now()})); -expectError(jest.useFakeTimers({now: new Date()})); +expectType(jest.useFakeTimers({now: new Date(1995, 11, 17)})); +expectError(jest.useFakeTimers({now: '1995-12-17T03:24:00'})); expectType(jest.useFakeTimers({timerLimit: 1000})); expectError(jest.useFakeTimers({timerLimit: true})); expectError(jest.useFakeTimers({enableGlobally: true})); +expectError(jest.useFakeTimers('legacy')); expectError(jest.useFakeTimers('modern')); expectType(jest.useRealTimers()); diff --git a/packages/jest-types/src/Config.ts b/packages/jest-types/src/Config.ts index b3f154cc5cc8..726855337d6e 100644 --- a/packages/jest-types/src/Config.ts +++ b/packages/jest-types/src/Config.ts @@ -39,16 +39,6 @@ export type GlobalFakeTimersConfig = { enableGlobally?: boolean; }; -export type LegacyFakeTimersConfig = { - /** - * Use the old fake timers implementation instead of one backed by `@sinonjs/fake-timers`. - * - * @defaultValue - * The default is `false`. - */ - legacyFakeTimers?: true; -}; - export type FakeTimersConfig = { /** * If set to `true` all timers will be advanced automatically by 20 milliseconds @@ -72,7 +62,7 @@ export type FakeTimersConfig = { * @defaultValue * The default is `Date.now()`. */ - now?: number; + now?: number | Date; /** * The maximum number of timers that will be run when calling `jest.runAllTimers()`. * @@ -81,7 +71,8 @@ export type FakeTimersConfig = { */ timerLimit?: number; /** - * Use the old fake timers implementation instead of one backed by `@sinonjs/fake-timers`. + * Use the old fake timers implementation instead of one backed by + * [`@sinonjs/fake-timers`](https://github.com/sinonjs/fake-timers). * * @defaultValue * The default is `false`. @@ -89,8 +80,24 @@ export type FakeTimersConfig = { legacyFakeTimers?: false; }; -export type FakeTimers = GlobalFakeTimersConfig & - (FakeTimersConfig | LegacyFakeTimersConfig); +export type LegacyFakeTimersConfig = { + /** + * Use the old fake timers implementation instead of one backed by + * [`@sinonjs/fake-timers`](https://github.com/sinonjs/fake-timers). + * + * @defaultValue + * The default is `false`. + */ + legacyFakeTimers?: true; +}; + +type FakeTimers = GlobalFakeTimersConfig & + ( + | (FakeTimersConfig & { + now?: Exclude; + }) + | LegacyFakeTimersConfig + ); export type HasteConfig = { /** Whether to hash files using SHA-1. */ From aec505377a3c040547946312da800807bc10deaa Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Mon, 28 Mar 2022 08:38:05 +0300 Subject: [PATCH 57/69] better mock --- .../src/__tests__/sinon-integration.test.ts | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts b/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts index 1d2c5d2a71cf..a64bd81aaf8a 100644 --- a/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts +++ b/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts @@ -17,16 +17,16 @@ const mockInstall = jest.fn(); const mockWithGlobal = { install: mockInstall, timers: { - Date, - clearImmediate, - clearInterval, - clearTimeout, - hrtime: process.hrtime, - nextTick: process.nextTick, - queueMicrotask, - setImmediate, - setInterval, - setTimeout, + Date: jest.fn(), + clearImmediate: jest.fn(), + clearInterval: jest.fn(), + clearTimeout: jest.fn(), + hrtime: jest.fn(), + nextTick: jest.fn(), + queueMicrotask: jest.fn(), + setImmediate: jest.fn(), + setInterval: jest.fn(), + setTimeout: jest.fn(), }, }; From 5c1daec6a7b55f4b7ee5dcf3d8d6feef925000c6 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Mon, 28 Mar 2022 08:59:17 +0300 Subject: [PATCH 58/69] rework test --- .../clear-real-timers/__tests__/clearRealTimers.test.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/e2e/fake-timers/clear-real-timers/__tests__/clearRealTimers.test.js b/e2e/fake-timers/clear-real-timers/__tests__/clearRealTimers.test.js index f65d1452bd69..0e5ebdc640a0 100644 --- a/e2e/fake-timers/clear-real-timers/__tests__/clearRealTimers.test.js +++ b/e2e/fake-timers/clear-real-timers/__tests__/clearRealTimers.test.js @@ -8,7 +8,9 @@ 'use strict'; test('allows clearing not faked timers', () => { - const timer = setTimeout(() => console.log('should not be called'), 1000); + const timer = setTimeout(() => { + throw new Error('Should not throw'); + }, 1000); jest.useFakeTimers(); From 4fb53fded0ee71fe6c47e305e4527a5c95b7159f Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Sat, 2 Apr 2022 15:07:53 +0300 Subject: [PATCH 59/69] fix bug --- .../src/__tests__/sinon-integration.test.ts | 28 ++++++++----------- .../jest-fake-timers/src/modernFakeTimers.ts | 2 +- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts b/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts index a64bd81aaf8a..528e2d15937c 100644 --- a/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts +++ b/packages/jest-fake-timers/src/__tests__/sinon-integration.test.ts @@ -6,7 +6,6 @@ * */ -import {withGlobal} from '@sinonjs/fake-timers'; import {makeProjectConfig} from '@jest/test-utils'; import FakeTimers from '../modernFakeTimers'; @@ -23,6 +22,7 @@ const mockWithGlobal = { clearTimeout: jest.fn(), hrtime: jest.fn(), nextTick: jest.fn(), + performance: jest.fn(), queueMicrotask: jest.fn(), setImmediate: jest.fn(), setInterval: jest.fn(), @@ -41,16 +41,7 @@ afterEach(() => { }); describe('`@sinonjs/fake-timers` integration', () => { - test('passes `globalThis` to `withGlobal()` method', () => { - const timers = new FakeTimers({ - config: makeProjectConfig(), - global: globalThis, - }); - - expect(withGlobal).toBeCalledWith(globalThis); - }); - - test('passes default options to `install()` method', () => { + test('uses default global config, when `useFakeTimers()` is called without options', () => { const timers = new FakeTimers({ config: makeProjectConfig(), global: globalThis, @@ -60,7 +51,7 @@ describe('`@sinonjs/fake-timers` integration', () => { expect(mockInstall).toBeCalledWith({ advanceTimeDelta: undefined, - loopLimit: undefined, + loopLimit: 100_000, now: 123456, shouldAdvanceTime: false, shouldClearNativeTimers: true, @@ -71,6 +62,7 @@ describe('`@sinonjs/fake-timers` integration', () => { 'clearTimeout', 'hrtime', 'nextTick', + 'performance', 'queueMicrotask', 'setImmediate', 'setInterval', @@ -79,7 +71,7 @@ describe('`@sinonjs/fake-timers` integration', () => { }); }); - test('passes `projectConfig.fakeTimers` to `install()` method', () => { + test('uses custom global config, when `useFakeTimers()` is called without options', () => { const timers = new FakeTimers({ config: makeProjectConfig({ fakeTimers: { @@ -105,6 +97,7 @@ describe('`@sinonjs/fake-timers` integration', () => { 'clearInterval', 'clearTimeout', 'hrtime', + 'performance', 'queueMicrotask', 'setImmediate', 'setInterval', @@ -113,7 +106,7 @@ describe('`@sinonjs/fake-timers` integration', () => { }); }); - test('passes `fakeTimersConfig` to `install()` method', () => { + test('overrides default global config, when `useFakeTimers()` is called with options,', () => { const timers = new FakeTimers({ config: makeProjectConfig(), global: globalThis, @@ -138,6 +131,7 @@ describe('`@sinonjs/fake-timers` integration', () => { 'clearTimeout', 'hrtime', 'nextTick', + 'performance', 'setImmediate', 'setInterval', 'setTimeout', @@ -145,7 +139,7 @@ describe('`@sinonjs/fake-timers` integration', () => { }); }); - test('overrides `projectConfig.fakeTimers` if `fakeTimersConfig` is passed', () => { + test('overrides custom global config, when `useFakeTimers()` is called with options,', () => { const timers = new FakeTimers({ config: makeProjectConfig({ fakeTimers: { @@ -162,12 +156,11 @@ describe('`@sinonjs/fake-timers` integration', () => { advanceTimers: false, doNotFake: ['hrtime'], now: 123456, - timerLimit: 5000, }); expect(mockInstall).toBeCalledWith({ advanceTimeDelta: undefined, - loopLimit: 5000, + loopLimit: 1000, now: 123456, shouldAdvanceTime: false, shouldClearNativeTimers: true, @@ -177,6 +170,7 @@ describe('`@sinonjs/fake-timers` integration', () => { 'clearInterval', 'clearTimeout', 'nextTick', + 'performance', 'queueMicrotask', 'setImmediate', 'setInterval', diff --git a/packages/jest-fake-timers/src/modernFakeTimers.ts b/packages/jest-fake-timers/src/modernFakeTimers.ts index 977bc56a8df7..f8363388c9ce 100644 --- a/packages/jest-fake-timers/src/modernFakeTimers.ts +++ b/packages/jest-fake-timers/src/modernFakeTimers.ts @@ -170,7 +170,7 @@ export default class FakeTimers { return { advanceTimeDelta, - loopLimit: fakeTimersConfig.timerLimit, + loopLimit: fakeTimersConfig.timerLimit || 100_000, now: fakeTimersConfig.now ?? Date.now(), shouldAdvanceTime: Boolean(fakeTimersConfig.advanceTimers), shouldClearNativeTimers: true, From 459b551f9d0f1b35acdca51024ba064255b813dc Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Sat, 2 Apr 2022 15:08:36 +0300 Subject: [PATCH 60/69] tweak docs --- docs/Configuration.md | 36 +++++++++++++++++++++++++++---- docs/JestObjectAPI.md | 7 ++++-- packages/jest-types/src/Config.ts | 12 ++++++----- 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/docs/Configuration.md b/docs/Configuration.md index 8b61063e5d6b..ce38eff70f0c 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -399,9 +399,32 @@ Jest's ESM support is still experimental, see [its docs for more details](ECMASc Default: `{}` -This option allows configuration of the implementation of fake timers. The fake timers may be useful when a piece of code sets a long timeout that we don't want to wait for in a test. For more details see [Fake Timers API](JestObjectAPI.md#fake-timers) documentation. +The fake timers may be useful when a piece of code sets a long timeout that we don't want to wait for in a test. For additional details see [Fake Timers guide](TimerMocks.md) and [API documentation](JestObjectAPI.md#fake-timers). -Here is how you can enable fake timers globally for all tests: +This option allows global configuration of fake timers for all tests. Calling `jest.useFakeTimers()` in a test file will use these options or will override them if a configuration object is passed. For example, you can tell Jest to keep the original implementation of `process.nextTick()` and adjust the limit of recursive timers that will be run: + +```json +{ + "fakeTimers": { + "doNotFake": ["nextTick"], + "timerLimit": 1000 + } +} +``` + +```js title="fakeTime.test.js" +// install fake timers for this file using the options from Jest configuration +jest.useFakeTimers(); + +test('increase the limit of recursive timers for this and following tests', () => { + jest.useFakeTimers({timerLimit: 5000}); + // ... +}); +``` + +:::tip + +Instead of including `jest.useFakeTimers()` to each test file, you can enable fake timers globally for all tests: ```json { @@ -411,6 +434,8 @@ Here is how you can enable fake timers globally for all tests: } ``` +::: + Configuration options: ```ts @@ -438,7 +463,10 @@ type ModernFakeTimersConfig = { * The default is `false`. */ advanceTimers?: boolean | number; - /** List of names of APIs that should not be faked. The default is `[]`, meaning all APIs are faked. */ + /** + * List of names of APIs that should not be faked. The default is `[]`, meaning + * all APIs are faked. + */ doNotFake?: Array; /** Whether fake timers should be enabled for all test files. The default is `false`. */ enableGlobally?: boolean; @@ -449,7 +477,7 @@ type ModernFakeTimersConfig = { legacyFakeTimers?: boolean; /** Sets current system time to be used by fake timers. The default is `Date.now()`. */ now?: number; - /** Maximum number of timers that will be run. The default is `100_000` timers. */ + /** Maximum number of recursive timers that will be run. The default is `100_000` timers. */ timerLimit?: number; }; ``` diff --git a/docs/JestObjectAPI.md b/docs/JestObjectAPI.md index 85b5ea24f077..14ef9cfc9cae 100644 --- a/docs/JestObjectAPI.md +++ b/docs/JestObjectAPI.md @@ -665,7 +665,10 @@ type FakeTimersConfig = { * The default is `false`. */ advanceTimers?: boolean | number; - /** List of names of APIs that should not be faked. The default is `[]`, meaning all APIs are faked. */ + /** + * List of names of APIs that should not be faked. The default is `[]`, meaning + * all APIs are faked. + */ doNotFake?: Array; /** * Use the old fake timers implementation instead of one backed by `@sinonjs/fake-timers`. @@ -675,7 +678,7 @@ type FakeTimersConfig = { /** Sets current system time to be used by fake timers. The default is `Date.now()`. */ now?: number | Date; /** - * The maximum number of timers that will be run when calling `jest.runAllTimers()`. + * The maximum number of recursive timers that will be run when calling `jest.runAllTimers()`. * The default is `100_000` timers. */ timerLimit?: number; diff --git a/packages/jest-types/src/Config.ts b/packages/jest-types/src/Config.ts index 726855337d6e..0d33e863a6ac 100644 --- a/packages/jest-types/src/Config.ts +++ b/packages/jest-types/src/Config.ts @@ -41,16 +41,17 @@ export type GlobalFakeTimersConfig = { export type FakeTimersConfig = { /** - * If set to `true` all timers will be advanced automatically by 20 milliseconds - * every 20 milliseconds. A custom time delta may be provided by passing a number. + * If set to `true` all timers will be advanced automatically + * by 20 milliseconds every 20 milliseconds. A custom time delta + * may be provided by passing a number. * * @defaultValue * The default is `false`. */ advanceTimers?: boolean | number; /** - * List of names of APIs (e.g. `setTimeout()`, `setImmediate()`, `Date`, - * `nextTick`, `performance`) that should not be faked. + * List of names of APIs (e.g. `Date`, `nextTick()`, `setImmediate()`, + * `setTimeout()`) that should not be faked. * * @defaultValue * The default is `[]`, meaning all APIs are faked. @@ -64,7 +65,8 @@ export type FakeTimersConfig = { */ now?: number | Date; /** - * The maximum number of timers that will be run when calling `jest.runAllTimers()`. + * The maximum number of recursive timers that will be run when calling + * `jest.runAllTimers()`. * * @defaultValue * The default is `100_000` timers. From 1009ff14d081d03ea39d62c5d537f353fbdda934 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Sun, 3 Apr 2022 22:01:19 +0300 Subject: [PATCH 61/69] remove CLI option --- CHANGELOG.md | 1 + docs/CLI.md | 4 ---- packages/jest-cli/src/cli/args.ts | 4 ---- packages/jest-types/src/Config.ts | 1 - 4 files changed, 1 insertion(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 73da8d29beb7..9dc70f0fe246 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - `[jest-circus, jest-jasmine2]` Allowed classes and functions as `describe` and `it`/`test` names ([#12484](https://github.com/facebook/jest/pull/12484)) - `[jest-cli, jest-config]` [**BREAKING**] Remove `testURL` config, use `testEnvironmentOptions.url` instead ([#10797](https://github.com/facebook/jest/pull/10797)) - `[jest-cli, jest-core]` Add `--shard` parameter for distributed parallel test execution ([#12546](https://github.com/facebook/jest/pull/12546)) +- `[jest-cli]` [**BREAKING**] Remove undocumented `--timers` option ([#12572](https://github.com/facebook/jest/pull/12572)) - `[jest-config]` [**BREAKING**] Stop shipping `jest-environment-jsdom` by default ([#12354](https://github.com/facebook/jest/pull/12354)) - `[jest-config]` [**BREAKING**] Stop shipping `jest-jasmine2` by default ([#12355](https://github.com/facebook/jest/pull/12355)) - `[jest-config, @jest/types]` Add `ci` to `GlobalConfig` ([#12378](https://github.com/facebook/jest/pull/12378)) diff --git a/docs/CLI.md b/docs/CLI.md index da187790e8cb..7263a4676883 100644 --- a/docs/CLI.md +++ b/docs/CLI.md @@ -202,10 +202,6 @@ Make calling deprecated APIs throw helpful error messages. Useful for easing the Alias: `-e`. Use this flag to show full diffs and errors instead of a patch. -### `--fakeTimers=` - -A JSON string with configuration options for fake timers. For details see [Fake Timers API](JestObjectAPI.md#fake-timers) documentation. - ### `--filter=` Path to a module exporting a filtering function. This method receives a list of tests which can be manipulated to exclude tests from running. Especially useful when used in conjunction with a testing infrastructure to filter known broken. diff --git a/packages/jest-cli/src/cli/args.ts b/packages/jest-cli/src/cli/args.ts index a8b9b4b0114b..d7a0596fed9f 100644 --- a/packages/jest-cli/src/cli/args.ts +++ b/packages/jest-cli/src/cli/args.ts @@ -260,10 +260,6 @@ export const options = { description: 'Use this flag to show full diffs instead of a patch.', type: 'boolean', }, - fakeTimers: { - description: 'A JSON string with configuration options for fake timers.', - type: 'string', - }, filter: { description: 'Path to a module exporting a filtering function. This method receives ' + diff --git a/packages/jest-types/src/Config.ts b/packages/jest-types/src/Config.ts index 0d33e863a6ac..542fb3f3c38b 100644 --- a/packages/jest-types/src/Config.ts +++ b/packages/jest-types/src/Config.ts @@ -521,7 +521,6 @@ export type Argv = Arguments< debug: boolean; env: string; expand: boolean; - fakeTimers: string; findRelatedTests: boolean; forceExit: boolean; globals: string; From 72a65654d8884725e1d6db6f041a0a07da806ba6 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Sun, 3 Apr 2022 22:01:34 +0300 Subject: [PATCH 62/69] improve description --- packages/jest-config/src/Descriptions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jest-config/src/Descriptions.ts b/packages/jest-config/src/Descriptions.ts index fd27acc91ef4..fab2e8f3094e 100644 --- a/packages/jest-config/src/Descriptions.ts +++ b/packages/jest-config/src/Descriptions.ts @@ -31,7 +31,7 @@ const descriptions: {[key in keyof Config.InitialOptions]: string} = { dependencyExtractor: 'A path to a custom dependency extractor', errorOnDeprecated: 'Make calling deprecated APIs throw helpful error messages', - fakeTimers: 'The configuration for fake timers.', + fakeTimers: 'The global configuration for fake timers', forceCoverageMatch: 'Force coverage collection from ignored files using an array of glob patterns', globalSetup: From 8ff79fa2cf2bc3fb0566e2972a0ddf02a9f8b4bb Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Sun, 3 Apr 2022 22:20:36 +0300 Subject: [PATCH 63/69] snap --- .../jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap b/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap index c06a68d33585..c07d762c14dc 100644 --- a/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap +++ b/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap @@ -168,7 +168,7 @@ module.exports = { // Make calling deprecated APIs throw helpful error messages // errorOnDeprecated: false, - // The configuration for fake timers. + // The global configuration for fake timers // fakeTimers: { // "enableGlobally": false // }, From 6d1c0d12ca9d935f710daa3eb8403a960bb1a3c5 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Mon, 4 Apr 2022 07:46:39 +0300 Subject: [PATCH 64/69] default configuration --- docs/Configuration.md | 4 ++-- .../src/init/__tests__/__snapshots__/init.test.js.snap | 2 +- packages/jest-config/src/Descriptions.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/Configuration.md b/docs/Configuration.md index ce38eff70f0c..17f9865c02f8 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -401,7 +401,7 @@ Default: `{}` The fake timers may be useful when a piece of code sets a long timeout that we don't want to wait for in a test. For additional details see [Fake Timers guide](TimerMocks.md) and [API documentation](JestObjectAPI.md#fake-timers). -This option allows global configuration of fake timers for all tests. Calling `jest.useFakeTimers()` in a test file will use these options or will override them if a configuration object is passed. For example, you can tell Jest to keep the original implementation of `process.nextTick()` and adjust the limit of recursive timers that will be run: +This option provides the default configuration of fake timers for all tests. Calling `jest.useFakeTimers()` in a test file will use these options or will override them if a configuration object is passed. For example, you can tell Jest to keep the original implementation of `process.nextTick()` and adjust the limit of recursive timers that will be run: ```json { @@ -424,7 +424,7 @@ test('increase the limit of recursive timers for this and following tests', () = :::tip -Instead of including `jest.useFakeTimers()` to each test file, you can enable fake timers globally for all tests: +Instead of including `jest.useFakeTimers()` in each test file, you can enable fake timers globally for all tests: ```json { diff --git a/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap b/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap index c07d762c14dc..b39b2d7d285f 100644 --- a/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap +++ b/packages/jest-cli/src/init/__tests__/__snapshots__/init.test.js.snap @@ -168,7 +168,7 @@ module.exports = { // Make calling deprecated APIs throw helpful error messages // errorOnDeprecated: false, - // The global configuration for fake timers + // The default configuration for fake timers // fakeTimers: { // "enableGlobally": false // }, diff --git a/packages/jest-config/src/Descriptions.ts b/packages/jest-config/src/Descriptions.ts index fab2e8f3094e..9ffd12c4fb8e 100644 --- a/packages/jest-config/src/Descriptions.ts +++ b/packages/jest-config/src/Descriptions.ts @@ -31,7 +31,7 @@ const descriptions: {[key in keyof Config.InitialOptions]: string} = { dependencyExtractor: 'A path to a custom dependency extractor', errorOnDeprecated: 'Make calling deprecated APIs throw helpful error messages', - fakeTimers: 'The global configuration for fake timers', + fakeTimers: 'The default configuration for fake timers', forceCoverageMatch: 'Force coverage collection from ignored files using an array of glob patterns', globalSetup: From cb6bede47ec6e20d433461bed0ea62ed7d00fc04 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Mon, 4 Apr 2022 16:49:24 +0300 Subject: [PATCH 65/69] fix resetMocks test --- .../reset-mocks/__tests__/resetMocks.test.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/e2e/fake-timers-legacy/reset-mocks/__tests__/resetMocks.test.js b/e2e/fake-timers-legacy/reset-mocks/__tests__/resetMocks.test.js index 2710469e093e..3f1f00cb6212 100644 --- a/e2e/fake-timers-legacy/reset-mocks/__tests__/resetMocks.test.js +++ b/e2e/fake-timers-legacy/reset-mocks/__tests__/resetMocks.test.js @@ -7,8 +7,9 @@ 'use strict'; +jest.useFakeTimers(); + test('works when resetMocks is set in Jest config', () => { - jest.useFakeTimers(); const f = jest.fn(); setTimeout(f, 0); jest.runAllTimers(); From 1b29f9ee4ab97bea5f07934a13fe95366f09ae49 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Mon, 4 Apr 2022 17:09:29 +0300 Subject: [PATCH 66/69] fix resetMocks test again --- e2e/fake-timers-legacy/reset-mocks/__tests__/resetMocks.test.js | 2 -- e2e/fake-timers-legacy/reset-mocks/package.json | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/e2e/fake-timers-legacy/reset-mocks/__tests__/resetMocks.test.js b/e2e/fake-timers-legacy/reset-mocks/__tests__/resetMocks.test.js index 3f1f00cb6212..05d594015029 100644 --- a/e2e/fake-timers-legacy/reset-mocks/__tests__/resetMocks.test.js +++ b/e2e/fake-timers-legacy/reset-mocks/__tests__/resetMocks.test.js @@ -7,8 +7,6 @@ 'use strict'; -jest.useFakeTimers(); - test('works when resetMocks is set in Jest config', () => { const f = jest.fn(); setTimeout(f, 0); diff --git a/e2e/fake-timers-legacy/reset-mocks/package.json b/e2e/fake-timers-legacy/reset-mocks/package.json index f4c9b465c55c..d999103bf1d1 100644 --- a/e2e/fake-timers-legacy/reset-mocks/package.json +++ b/e2e/fake-timers-legacy/reset-mocks/package.json @@ -2,6 +2,7 @@ "name": "reset-mocks", "jest": { "fakeTimers": { + "enableGlobally": true, "legacyFakeTimers": true }, "resetMocks": true From 20f1d345898d36d9f374b3e78664f757bd5d32a8 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Mon, 4 Apr 2022 17:11:18 +0300 Subject: [PATCH 67/69] fix logic as suggested --- .../jest-circus/src/legacy-code-todo-rewrite/jestAdapter.ts | 5 ++++- packages/jest-jasmine2/src/index.ts | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) 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 a02de22133cd..9df215a6d5b3 100644 --- a/packages/jest-circus/src/legacy-code-todo-rewrite/jestAdapter.ts +++ b/packages/jest-circus/src/legacy-code-todo-rewrite/jestAdapter.ts @@ -59,7 +59,10 @@ const jestAdapter = async ( if (config.resetMocks) { runtime.resetAllMocks(); - if (config.fakeTimers.legacyFakeTimers) { + if ( + config.fakeTimers.enableGlobally && + config.fakeTimers.legacyFakeTimers + ) { // during setup, this cannot be null (and it's fine to explode if it is) environment.fakeTimers!.useFakeTimers(); } diff --git a/packages/jest-jasmine2/src/index.ts b/packages/jest-jasmine2/src/index.ts index 9d63625522b3..cf7c8bf5b4b1 100644 --- a/packages/jest-jasmine2/src/index.ts +++ b/packages/jest-jasmine2/src/index.ts @@ -108,7 +108,10 @@ export default async function jasmine2( if (config.resetMocks) { runtime.resetAllMocks(); - if (config.fakeTimers.legacyFakeTimers) { + if ( + config.fakeTimers.enableGlobally && + config.fakeTimers.legacyFakeTimers + ) { environment.fakeTimers!.useFakeTimers(); } } From 0c8402ce70b8ca82ea7f2a12a2037e9a0c333d18 Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Tue, 5 Apr 2022 17:06:04 +0300 Subject: [PATCH 68/69] add migration guide --- docs/MigrationGuide.md | 86 ++++++++++++++++++- packages/jest-config/src/Deprecated.ts | 4 +- .../__snapshots__/normalize.test.ts.snap | 2 +- 3 files changed, 88 insertions(+), 4 deletions(-) diff --git a/docs/MigrationGuide.md b/docs/MigrationGuide.md index 13d0bed5674d..dc5b8b80a35a 100644 --- a/docs/MigrationGuide.md +++ b/docs/MigrationGuide.md @@ -1,15 +1,97 @@ --- id: migration-guide -title: Migrating to Jest +title: Migration to Jest 28 --- +Upgrading Jest to the new version? This guide aims to make your migration smoother. + +## Fake Timers + +Fake timers were refactored to allow passing options to the underlying [`@sinonjs/fake-timers`](https://github.com/sinonjs/fake-timers). + +### `fakeTimers` + +The `timers` configuration option was renamed to [`fakeTimers`](Configuration.md#faketimers-object) and now takes an object with options: + +```diff title="jest.config.js (default)" +- timers: 'real' ++ fakeTimers: { ++ enableGlobally: false ++ } +``` + +```diff title="jest.config.js" +- timers: 'fake' ++ fakeTimers: { ++ enableGlobally: true ++ } +``` + +```diff title="jest.config.js" +- timers: 'modern' ++ fakeTimers: { ++ enableGlobally: true ++ } +``` + +```diff title="jest.config.js" +- timers: 'legacy' ++ fakeTimers: { ++ enableGlobally: true, ++ legacyFakeTimers: true ++ } +``` + +### `jest.useFakeTimers()` + +An object with options now should be passed to [`jest.useFakeTimers()`](JestObjectAPI.md#jestusefaketimersfaketimersconfig) as well: + +```diff title="fakeTimers.test.js (default)" +- jest.useFakeTimers('modern') ++ jest.useFakeTimers() +``` + +Or if legacy fake timers are enabled in Jest config file, but you would like to use the default fake timers backed by `@sinonjs/fake-timers`: + +```diff title="fakeTimers.test.js" +- jest.useFakeTimers('modern') ++ jest.useFakeTimers({ ++ legacyFakeTimers: false ++ }) +``` + +```diff title="fakeTimers.test.js" +- jest.useFakeTimers('legacy') ++ jest.useFakeTimers({ ++ legacyFakeTimers: true ++ }) +``` + +## Test Environment + +If you are using JSDOM [test environment](Configuration.md#testenvironment-string), `jest-environment-jsdom` package now must be installed additionally: + +```bash npm2yarn +npm install --save-dev jest-environment-jsdom +``` + +## Test Runner + +If you are using Jasmine [test runner](Configuration.md#testrunner-string), `jest-jasmine2` package now must be installed additionally: + +```bash npm2yarn +npm install --save-dev jest-jasmine2 +``` + +## Migration from Other Testing Frameworks + If you'd like to try out Jest with an existing codebase, there are a number of ways to convert to Jest: - If you are using Jasmine, or a Jasmine like API (for example [Mocha](https://mochajs.org)), Jest should be mostly compatible, which makes it less complicated to migrate to. - If you are using AVA, Expect.js (by Automattic), Jasmine, Mocha, proxyquire, Should.js or Tape you can automatically migrate with Jest Codemods (see below). - If you like [chai](http://chaijs.com/), you can upgrade to Jest and continue using chai. However, we recommend trying out Jest's assertions and their failure messages. Jest Codemods can migrate from chai (see below). -## jest-codemods +### `jest-codemods` If you are using [AVA](https://github.com/avajs/ava), [Chai](https://github.com/chaijs/chai), [Expect.js (by Automattic)](https://github.com/Automattic/expect.js), [Jasmine](https://github.com/jasmine/jasmine), [Mocha](https://github.com/mochajs/mocha), [proxyquire](https://github.com/thlorenz/proxyquire), [Should.js](https://github.com/shouldjs/should.js) or [Tape](https://github.com/substack/tape) you can use the third-party [jest-codemods](https://github.com/skovhus/jest-codemods) to do most of the dirty migration work. It runs a code transformation on your codebase using [jscodeshift](https://github.com/facebook/jscodeshift). diff --git a/packages/jest-config/src/Deprecated.ts b/packages/jest-config/src/Deprecated.ts index 905d3ebdde5b..851f1281fe7d 100644 --- a/packages/jest-config/src/Deprecated.ts +++ b/packages/jest-config/src/Deprecated.ts @@ -97,7 +97,9 @@ const deprecatedOptions: DeprecatedOptions = { timers: (_options: {timers?: string}) => ` Option ${chalk.bold( '"timers"', - )} was replaced by ${chalk.bold('"fakeTimers"')}. + )} was replaced by ${chalk.bold( + '"fakeTimers"', + )}. See migration guide: https://jestjs.io/docs/next/migration-guide#faketimers. Please update your configuration.`, }; diff --git a/packages/jest-config/src/__tests__/__snapshots__/normalize.test.ts.snap b/packages/jest-config/src/__tests__/__snapshots__/normalize.test.ts.snap index a3d700f5b943..d4cac537aa29 100644 --- a/packages/jest-config/src/__tests__/__snapshots__/normalize.test.ts.snap +++ b/packages/jest-config/src/__tests__/__snapshots__/normalize.test.ts.snap @@ -307,7 +307,7 @@ exports[`timers logs a deprecation warning when \`timers\` is used 1`] = ` Array [ " Deprecation Warning: - Option "timers" was replaced by "fakeTimers". + Option "timers" was replaced by "fakeTimers". See migration guide: https://jestjs.io/docs/next/migration-guide#faketimers. Please update your configuration. From 07ef70ce0d2b5c7458abbdfa2632b865a04140c2 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Tue, 5 Apr 2022 16:38:29 +0200 Subject: [PATCH 69/69] Revert "add migration guide" This reverts commit 0c8402ce70b8ca82ea7f2a12a2037e9a0c333d18. --- docs/MigrationGuide.md | 86 +------------------ packages/jest-config/src/Deprecated.ts | 4 +- .../__snapshots__/normalize.test.ts.snap | 2 +- 3 files changed, 4 insertions(+), 88 deletions(-) diff --git a/docs/MigrationGuide.md b/docs/MigrationGuide.md index dc5b8b80a35a..13d0bed5674d 100644 --- a/docs/MigrationGuide.md +++ b/docs/MigrationGuide.md @@ -1,97 +1,15 @@ --- id: migration-guide -title: Migration to Jest 28 +title: Migrating to Jest --- -Upgrading Jest to the new version? This guide aims to make your migration smoother. - -## Fake Timers - -Fake timers were refactored to allow passing options to the underlying [`@sinonjs/fake-timers`](https://github.com/sinonjs/fake-timers). - -### `fakeTimers` - -The `timers` configuration option was renamed to [`fakeTimers`](Configuration.md#faketimers-object) and now takes an object with options: - -```diff title="jest.config.js (default)" -- timers: 'real' -+ fakeTimers: { -+ enableGlobally: false -+ } -``` - -```diff title="jest.config.js" -- timers: 'fake' -+ fakeTimers: { -+ enableGlobally: true -+ } -``` - -```diff title="jest.config.js" -- timers: 'modern' -+ fakeTimers: { -+ enableGlobally: true -+ } -``` - -```diff title="jest.config.js" -- timers: 'legacy' -+ fakeTimers: { -+ enableGlobally: true, -+ legacyFakeTimers: true -+ } -``` - -### `jest.useFakeTimers()` - -An object with options now should be passed to [`jest.useFakeTimers()`](JestObjectAPI.md#jestusefaketimersfaketimersconfig) as well: - -```diff title="fakeTimers.test.js (default)" -- jest.useFakeTimers('modern') -+ jest.useFakeTimers() -``` - -Or if legacy fake timers are enabled in Jest config file, but you would like to use the default fake timers backed by `@sinonjs/fake-timers`: - -```diff title="fakeTimers.test.js" -- jest.useFakeTimers('modern') -+ jest.useFakeTimers({ -+ legacyFakeTimers: false -+ }) -``` - -```diff title="fakeTimers.test.js" -- jest.useFakeTimers('legacy') -+ jest.useFakeTimers({ -+ legacyFakeTimers: true -+ }) -``` - -## Test Environment - -If you are using JSDOM [test environment](Configuration.md#testenvironment-string), `jest-environment-jsdom` package now must be installed additionally: - -```bash npm2yarn -npm install --save-dev jest-environment-jsdom -``` - -## Test Runner - -If you are using Jasmine [test runner](Configuration.md#testrunner-string), `jest-jasmine2` package now must be installed additionally: - -```bash npm2yarn -npm install --save-dev jest-jasmine2 -``` - -## Migration from Other Testing Frameworks - If you'd like to try out Jest with an existing codebase, there are a number of ways to convert to Jest: - If you are using Jasmine, or a Jasmine like API (for example [Mocha](https://mochajs.org)), Jest should be mostly compatible, which makes it less complicated to migrate to. - If you are using AVA, Expect.js (by Automattic), Jasmine, Mocha, proxyquire, Should.js or Tape you can automatically migrate with Jest Codemods (see below). - If you like [chai](http://chaijs.com/), you can upgrade to Jest and continue using chai. However, we recommend trying out Jest's assertions and their failure messages. Jest Codemods can migrate from chai (see below). -### `jest-codemods` +## jest-codemods If you are using [AVA](https://github.com/avajs/ava), [Chai](https://github.com/chaijs/chai), [Expect.js (by Automattic)](https://github.com/Automattic/expect.js), [Jasmine](https://github.com/jasmine/jasmine), [Mocha](https://github.com/mochajs/mocha), [proxyquire](https://github.com/thlorenz/proxyquire), [Should.js](https://github.com/shouldjs/should.js) or [Tape](https://github.com/substack/tape) you can use the third-party [jest-codemods](https://github.com/skovhus/jest-codemods) to do most of the dirty migration work. It runs a code transformation on your codebase using [jscodeshift](https://github.com/facebook/jscodeshift). diff --git a/packages/jest-config/src/Deprecated.ts b/packages/jest-config/src/Deprecated.ts index 851f1281fe7d..905d3ebdde5b 100644 --- a/packages/jest-config/src/Deprecated.ts +++ b/packages/jest-config/src/Deprecated.ts @@ -97,9 +97,7 @@ const deprecatedOptions: DeprecatedOptions = { timers: (_options: {timers?: string}) => ` Option ${chalk.bold( '"timers"', - )} was replaced by ${chalk.bold( - '"fakeTimers"', - )}. See migration guide: https://jestjs.io/docs/next/migration-guide#faketimers. + )} was replaced by ${chalk.bold('"fakeTimers"')}. Please update your configuration.`, }; diff --git a/packages/jest-config/src/__tests__/__snapshots__/normalize.test.ts.snap b/packages/jest-config/src/__tests__/__snapshots__/normalize.test.ts.snap index d4cac537aa29..a3d700f5b943 100644 --- a/packages/jest-config/src/__tests__/__snapshots__/normalize.test.ts.snap +++ b/packages/jest-config/src/__tests__/__snapshots__/normalize.test.ts.snap @@ -307,7 +307,7 @@ exports[`timers logs a deprecation warning when \`timers\` is used 1`] = ` Array [ " Deprecation Warning: - Option "timers" was replaced by "fakeTimers". See migration guide: https://jestjs.io/docs/next/migration-guide#faketimers. + Option "timers" was replaced by "fakeTimers". Please update your configuration.