From 4a4731d3dbcf0e86220f1af1f526f32836dfb394 Mon Sep 17 00:00:00 2001 From: Leandro Lourenci Date: Wed, 13 Nov 2019 19:56:25 -0300 Subject: [PATCH 01/12] Fix util.promisify(setTimeout) on jest-fake-timers --- .../src/__tests__/jestFakeTimers.test.ts | 20 +++++++++++++++++++ .../jest-fake-timers/src/jestFakeTimers.ts | 12 ++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/packages/jest-fake-timers/src/__tests__/jestFakeTimers.test.ts b/packages/jest-fake-timers/src/__tests__/jestFakeTimers.test.ts index 434315c93343..a4a3385ab24c 100644 --- a/packages/jest-fake-timers/src/__tests__/jestFakeTimers.test.ts +++ b/packages/jest-fake-timers/src/__tests__/jestFakeTimers.test.ts @@ -8,6 +8,7 @@ import {runInNewContext} from 'vm'; import mock = require('jest-mock'); import FakeTimers from '../jestFakeTimers'; +import util = require('util'); const timerConfig = { idToRef: (id: number) => id, @@ -565,6 +566,25 @@ describe('FakeTimers', () => { timers.runAllTimers(); expect(fn).toHaveBeenCalledTimes(1); }); + + it('runs promisified setTimeout callbacks', async () => { + expect.assertions(1); + const global = ({process} as unknown) as NodeJS.Global; + const timers = new FakeTimers({ + config, + global, + moduleMocker, + timerConfig, + }); + timers.useFakeTimers(); + + const promisifiedTimeout = util.promisify(global.setTimeout)(100000); + + timers.runAllTimers(); + + await promisifiedTimeout; + expect(1).toBe(1); + }); }); describe('advanceTimersByTime', () => { diff --git a/packages/jest-fake-timers/src/jestFakeTimers.ts b/packages/jest-fake-timers/src/jestFakeTimers.ts index 804320848897..5bb79d24dd23 100644 --- a/packages/jest-fake-timers/src/jestFakeTimers.ts +++ b/packages/jest-fake-timers/src/jestFakeTimers.ts @@ -8,6 +8,7 @@ import {ModuleMocker} from 'jest-mock'; import {StackTraceConfig, formatStackTrace} from 'jest-message-util'; import {setGlobal} from 'jest-util'; +import util = require('util'); type Callback = (...args: Array) => void; @@ -368,6 +369,15 @@ export default class FakeTimers { // @ts-ignore TODO: figure out better typings here this._moduleMocker.fn().mockImplementation(impl); + const promisifedFakeTimeout = fn(this._fakeSetTimeout.bind(this)); + promisifedFakeTimeout[util.promisify.custom] = ( + delay?: number, + arg?: any, + ) => + new Promise(resolve => + promisifedFakeTimeout(() => {}, delay, resolve(arg)), + ); + // TODO: add better typings; these are mocks, but typed as regular timers this._fakeTimerAPIs = { clearImmediate: fn(this._fakeClearImmediate.bind(this)), @@ -376,7 +386,7 @@ export default class FakeTimers { nextTick: fn(this._fakeNextTick.bind(this)), setImmediate: fn(this._fakeSetImmediate.bind(this)), setInterval: fn(this._fakeSetInterval.bind(this)), - setTimeout: fn(this._fakeSetTimeout.bind(this)), + setTimeout: promisifedFakeTimeout, }; } From 605c05390c746433fc855764fc34b8be198223ce Mon Sep 17 00:00:00 2001 From: Leandro Lourenci Date: Wed, 13 Nov 2019 20:19:45 -0300 Subject: [PATCH 02/12] Assert for promisify on instalation describe --- .../src/__tests__/jestFakeTimers.test.ts | 33 ++++++++----------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/packages/jest-fake-timers/src/__tests__/jestFakeTimers.test.ts b/packages/jest-fake-timers/src/__tests__/jestFakeTimers.test.ts index a4a3385ab24c..d07273ce3a91 100644 --- a/packages/jest-fake-timers/src/__tests__/jestFakeTimers.test.ts +++ b/packages/jest-fake-timers/src/__tests__/jestFakeTimers.test.ts @@ -41,6 +41,20 @@ describe('FakeTimers', () => { expect(global.setTimeout).not.toBe(undefined); }); + it('accepts to promisify setTimeout mock', () => { + const global = ({process} as unknown) as NodeJS.Global; + const timers = new FakeTimers({ + config, + global, + moduleMocker, + timerConfig, + }); + timers.useFakeTimers(); + const promisifiedTimeout = util.promisify(global.setTimeout)(0); + timers.runAllTimers(); + expect(promisifiedTimeout).not.toBe(undefined); + }); + it('installs clearTimeout mock', () => { const global = ({process} as unknown) as NodeJS.Global; const timers = new FakeTimers({ @@ -566,25 +580,6 @@ describe('FakeTimers', () => { timers.runAllTimers(); expect(fn).toHaveBeenCalledTimes(1); }); - - it('runs promisified setTimeout callbacks', async () => { - expect.assertions(1); - const global = ({process} as unknown) as NodeJS.Global; - const timers = new FakeTimers({ - config, - global, - moduleMocker, - timerConfig, - }); - timers.useFakeTimers(); - - const promisifiedTimeout = util.promisify(global.setTimeout)(100000); - - timers.runAllTimers(); - - await promisifiedTimeout; - expect(1).toBe(1); - }); }); describe('advanceTimersByTime', () => { From 38c0d689af88381ab89d731cbac6561d2f2b216d Mon Sep 17 00:00:00 2001 From: Leandro Lourenci Date: Wed, 13 Nov 2019 20:57:43 -0300 Subject: [PATCH 03/12] Fix typo in var --- packages/jest-fake-timers/src/jestFakeTimers.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/jest-fake-timers/src/jestFakeTimers.ts b/packages/jest-fake-timers/src/jestFakeTimers.ts index 5bb79d24dd23..1ef761d315d8 100644 --- a/packages/jest-fake-timers/src/jestFakeTimers.ts +++ b/packages/jest-fake-timers/src/jestFakeTimers.ts @@ -369,13 +369,13 @@ export default class FakeTimers { // @ts-ignore TODO: figure out better typings here this._moduleMocker.fn().mockImplementation(impl); - const promisifedFakeTimeout = fn(this._fakeSetTimeout.bind(this)); - promisifedFakeTimeout[util.promisify.custom] = ( + const promisifiedFakeSetTimeout = fn(this._fakeSetTimeout.bind(this)); + promisifiedFakeSetTimeout[util.promisify.custom] = ( delay?: number, arg?: any, ) => new Promise(resolve => - promisifedFakeTimeout(() => {}, delay, resolve(arg)), + promisifiedFakeSetTimeout(() => {}, delay, resolve(arg)), ); // TODO: add better typings; these are mocks, but typed as regular timers @@ -386,7 +386,7 @@ export default class FakeTimers { nextTick: fn(this._fakeNextTick.bind(this)), setImmediate: fn(this._fakeSetImmediate.bind(this)), setInterval: fn(this._fakeSetInterval.bind(this)), - setTimeout: promisifedFakeTimeout, + setTimeout: promisifiedFakeSetTimeout, }; } From 6cc919b5d3344241b9f7b7fe6700b7fbe43eabc1 Mon Sep 17 00:00:00 2001 From: Leandro Lourenci Date: Mon, 25 Nov 2019 17:14:37 -0300 Subject: [PATCH 04/12] Change custom timeout to not call the resolve function --- packages/jest-fake-timers/src/jestFakeTimers.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/jest-fake-timers/src/jestFakeTimers.ts b/packages/jest-fake-timers/src/jestFakeTimers.ts index 1ef761d315d8..558a9e18f154 100644 --- a/packages/jest-fake-timers/src/jestFakeTimers.ts +++ b/packages/jest-fake-timers/src/jestFakeTimers.ts @@ -373,10 +373,7 @@ export default class FakeTimers { promisifiedFakeSetTimeout[util.promisify.custom] = ( delay?: number, arg?: any, - ) => - new Promise(resolve => - promisifiedFakeSetTimeout(() => {}, delay, resolve(arg)), - ); + ) => new Promise(resolve => promisifiedFakeSetTimeout(resolve, delay, arg)); // TODO: add better typings; these are mocks, but typed as regular timers this._fakeTimerAPIs = { From 3bd1ba4f49ed3580913e82a8f654fe4a57cb3ada Mon Sep 17 00:00:00 2001 From: Leandro Lourenci Date: Mon, 25 Nov 2019 21:00:42 -0300 Subject: [PATCH 05/12] Expect promise to be resolved --- .../jest-fake-timers/src/__tests__/jestFakeTimers.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/jest-fake-timers/src/__tests__/jestFakeTimers.test.ts b/packages/jest-fake-timers/src/__tests__/jestFakeTimers.test.ts index d07273ce3a91..1d99adff02ed 100644 --- a/packages/jest-fake-timers/src/__tests__/jestFakeTimers.test.ts +++ b/packages/jest-fake-timers/src/__tests__/jestFakeTimers.test.ts @@ -41,7 +41,7 @@ describe('FakeTimers', () => { expect(global.setTimeout).not.toBe(undefined); }); - it('accepts to promisify setTimeout mock', () => { + it('accepts to promisify setTimeout mock', async () => { const global = ({process} as unknown) as NodeJS.Global; const timers = new FakeTimers({ config, @@ -50,9 +50,9 @@ describe('FakeTimers', () => { timerConfig, }); timers.useFakeTimers(); - const promisifiedTimeout = util.promisify(global.setTimeout)(0); + const timeoutPromise = util.promisify(global.setTimeout)(0, 'resolved'); timers.runAllTimers(); - expect(promisifiedTimeout).not.toBe(undefined); + await expect(timeoutPromise).resolves.toBe('resolved'); }); it('installs clearTimeout mock', () => { From 323add5a66401d4cc327ba775489e6b45b21bde1 Mon Sep 17 00:00:00 2001 From: Leandro Lourenci Date: Tue, 26 Nov 2019 12:47:43 -0300 Subject: [PATCH 06/12] Add changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03bb90837c44..6aff4bdf3dc1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,7 @@ - `[jest-transform]` Properly cache transformed files across tests ([#8890](https://github.com/facebook/jest/pull/8890)) - `[jest-utils]` Allow querying process.domain ([#9136](https://github.com/facebook/jest/pull/9136)) - `[jest-transform]` Don't fail the test suite when a generated source map is invalid ([#9058](https://github.com/facebook/jest/pull/9058)) +- `[jest-fake-timers]` Make `setTimeout` available to be promisified ([#9180](https://github.com/facebook/jest/pull/9180)) ### Chore & Maintenance From 9b01cd2ccb690c37865b3e0182da18846d468880 Mon Sep 17 00:00:00 2001 From: Leandro Lourenci Date: Tue, 26 Nov 2019 16:37:56 -0300 Subject: [PATCH 07/12] Apply review changes --- packages/jest-fake-timers/src/jestFakeTimers.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/jest-fake-timers/src/jestFakeTimers.ts b/packages/jest-fake-timers/src/jestFakeTimers.ts index 558a9e18f154..a4d71399ca43 100644 --- a/packages/jest-fake-timers/src/jestFakeTimers.ts +++ b/packages/jest-fake-timers/src/jestFakeTimers.ts @@ -369,11 +369,11 @@ export default class FakeTimers { // @ts-ignore TODO: figure out better typings here this._moduleMocker.fn().mockImplementation(impl); - const promisifiedFakeSetTimeout = fn(this._fakeSetTimeout.bind(this)); - promisifiedFakeSetTimeout[util.promisify.custom] = ( + const promisifiableFakeSetTimeout = fn(this._fakeSetTimeout.bind(this)); + promisifiableFakeSetTimeout[util.promisify.custom] = ( delay?: number, arg?: any, - ) => new Promise(resolve => promisifiedFakeSetTimeout(resolve, delay, arg)); + ) => new Promise(resolve => promisifiableFakeSetTimeout(resolve, delay, arg)); // TODO: add better typings; these are mocks, but typed as regular timers this._fakeTimerAPIs = { @@ -383,7 +383,7 @@ export default class FakeTimers { nextTick: fn(this._fakeNextTick.bind(this)), setImmediate: fn(this._fakeSetImmediate.bind(this)), setInterval: fn(this._fakeSetInterval.bind(this)), - setTimeout: promisifiedFakeSetTimeout, + setTimeout: promisifiableFakeSetTimeout, }; } From 2fca8adeb9e51d5c4c5acf7d61a7e0b8b0a2b4ac Mon Sep 17 00:00:00 2001 From: Leandro Lourenci Date: Tue, 26 Nov 2019 17:33:58 -0300 Subject: [PATCH 08/12] Fix eslint --- packages/jest-fake-timers/src/jestFakeTimers.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/jest-fake-timers/src/jestFakeTimers.ts b/packages/jest-fake-timers/src/jestFakeTimers.ts index a4d71399ca43..7d46df24c42f 100644 --- a/packages/jest-fake-timers/src/jestFakeTimers.ts +++ b/packages/jest-fake-timers/src/jestFakeTimers.ts @@ -373,7 +373,8 @@ export default class FakeTimers { promisifiableFakeSetTimeout[util.promisify.custom] = ( delay?: number, arg?: any, - ) => new Promise(resolve => promisifiableFakeSetTimeout(resolve, delay, arg)); + ) => + new Promise(resolve => promisifiableFakeSetTimeout(resolve, delay, arg)); // TODO: add better typings; these are mocks, but typed as regular timers this._fakeTimerAPIs = { From cf9662ff96429fc6f1376cb46714fd55ee2316cc Mon Sep 17 00:00:00 2001 From: Tim Seckinger Date: Fri, 29 Nov 2019 17:43:22 +0000 Subject: [PATCH 09/12] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6a524456ee5..d8bf74829b8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,7 +62,7 @@ - `[jest-types]` [**BREAKING**] Use less `null | undefined` in config types ([#9200](https://github.com/facebook/jest/pull/9200)) - `[jest-utils]` Allow querying process.domain ([#9136](https://github.com/facebook/jest/pull/9136)) - `[pretty-format]` Correctly detect memoized elements ([#9196](https://github.com/facebook/jest/pull/9196)) -- `[jest-fake-timers]` Make `setTimeout` available to be promisified ([#9180](https://github.com/facebook/jest/pull/9180)) +- `[jest-fake-timers]` Support `util.promisify` on `setTimeout` ([#9180](https://github.com/facebook/jest/pull/9180)) ### Chore & Maintenance From 783e9282c8d9800c564bf3120d5588cc589d3025 Mon Sep 17 00:00:00 2001 From: Leandro Lourenci Date: Fri, 29 Nov 2019 15:04:13 -0300 Subject: [PATCH 10/12] Run CI again From 71d48c9b0bb2993367d71debca1aec7760a593c6 Mon Sep 17 00:00:00 2001 From: Leandro Lourenci Date: Fri, 29 Nov 2019 15:16:25 -0300 Subject: [PATCH 11/12] Run CI again From 982af74c0773fdeb96e8322f98376ce3dc175550 Mon Sep 17 00:00:00 2001 From: Leandro Lourenci Date: Fri, 29 Nov 2019 17:01:37 -0300 Subject: [PATCH 12/12] Run CI again