From 5759a85691e6a13fa2ebe7da773efebc008c57bf Mon Sep 17 00:00:00 2001 From: Leandro Lourenci Date: Fri, 29 Nov 2019 18:15:20 -0300 Subject: [PATCH] Fix util.promisify(setTimeout) on jest-fake-timers (#9180) * Fix util.promisify(setTimeout) on jest-fake-timers * Assert for promisify on instalation describe * Fix typo in var * Change custom timeout to not call the resolve function * Expect promise to be resolved * Add changelog * Apply review changes * Fix eslint * Update CHANGELOG.md * Run CI again * Run CI again * Run CI again --- CHANGELOG.md | 1 + .../src/__tests__/jestFakeTimers.test.ts | 15 +++++++++++++++ packages/jest-fake-timers/src/jestFakeTimers.ts | 10 +++++++++- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ec72c721e1a..d8bf74829b8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,6 +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]` Support `util.promisify` on `setTimeout` ([#9180](https://github.com/facebook/jest/pull/9180)) ### Chore & Maintenance diff --git a/packages/jest-fake-timers/src/__tests__/jestFakeTimers.test.ts b/packages/jest-fake-timers/src/__tests__/jestFakeTimers.test.ts index 434315c93343..1d99adff02ed 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, @@ -40,6 +41,20 @@ describe('FakeTimers', () => { expect(global.setTimeout).not.toBe(undefined); }); + it('accepts to promisify setTimeout mock', async () => { + const global = ({process} as unknown) as NodeJS.Global; + const timers = new FakeTimers({ + config, + global, + moduleMocker, + timerConfig, + }); + timers.useFakeTimers(); + const timeoutPromise = util.promisify(global.setTimeout)(0, 'resolved'); + timers.runAllTimers(); + await expect(timeoutPromise).resolves.toBe('resolved'); + }); + it('installs clearTimeout mock', () => { const global = ({process} as unknown) as NodeJS.Global; const timers = new FakeTimers({ diff --git a/packages/jest-fake-timers/src/jestFakeTimers.ts b/packages/jest-fake-timers/src/jestFakeTimers.ts index 804320848897..7d46df24c42f 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,13 @@ export default class FakeTimers { // @ts-ignore TODO: figure out better typings here this._moduleMocker.fn().mockImplementation(impl); + const promisifiableFakeSetTimeout = fn(this._fakeSetTimeout.bind(this)); + promisifiableFakeSetTimeout[util.promisify.custom] = ( + delay?: number, + arg?: any, + ) => + new Promise(resolve => promisifiableFakeSetTimeout(resolve, delay, arg)); + // TODO: add better typings; these are mocks, but typed as regular timers this._fakeTimerAPIs = { clearImmediate: fn(this._fakeClearImmediate.bind(this)), @@ -376,7 +384,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: promisifiableFakeSetTimeout, }; }