From aa1309c84e1ecfd4f0e9eba780774f8d77656b41 Mon Sep 17 00:00:00 2001 From: Renato Alencar Date: Thu, 25 Mar 2021 12:00:13 -0300 Subject: [PATCH 1/4] fix: safe check for setImmediate and clearImmediate Jest is planning to sandbox setImmediate, and this would not work since setImmediate and clearImmediate would be undefined. --- src/helpers.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/helpers.js b/src/helpers.js index 7634bf9d..e3351e6f 100644 --- a/src/helpers.js +++ b/src/helpers.js @@ -16,14 +16,19 @@ function runWithRealTimers(callback) { function runWithJestRealTimers(callback) { const timerAPI = { - clearImmediate, clearInterval, clearTimeout, - setImmediate, setInterval, setTimeout, } + if (typeof setImmediate === 'function') { + timerAPI.setImmediate = setImmediate + } + if (typeof clearImmediate === 'function') { + timerAPI.clearImmediate = clearImmediate + } + jest.useRealTimers() const callbackReturnValue = callback() From 4580d719e16f4f261dd432092f8c06bb3334a649 Mon Sep 17 00:00:00 2001 From: Renato Alencar Date: Thu, 25 Mar 2021 13:21:25 -0300 Subject: [PATCH 2/4] tests: add tests reproducing #914 --- src/__tests__/helpers.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/__tests__/helpers.js b/src/__tests__/helpers.js index 9749a090..acad6540 100644 --- a/src/__tests__/helpers.js +++ b/src/__tests__/helpers.js @@ -97,4 +97,16 @@ describe('run with real timers', () => { }) expect(global.setTimeout).toBe(fakedSetTimeout) }) + + test('safe check for setImmediate and clearImmediate', () => { + const setImeediate = global.setImmediate + const clearImmediate = global.clearImmediate + delete global.setImmediate + delete global.clearImmediate + + expect(() => runWithRealTimers(() => {})).not.toThrow() + + global.setImmediate = setImeediate + global.clearImmediate = clearImmediate + }) }) From 2781ebca9690d31f1a94ee9b97337919bc38f0ec Mon Sep 17 00:00:00 2001 From: Renato Alencar Date: Thu, 25 Mar 2021 13:34:50 -0300 Subject: [PATCH 3/4] tests: properly restoration of global variables Make sure that if the test breaks, it would not break other tests either by properly restoring those global variables in an afterEach call. --- src/__tests__/helpers.js | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/__tests__/helpers.js b/src/__tests__/helpers.js index acad6540..eb86a1d1 100644 --- a/src/__tests__/helpers.js +++ b/src/__tests__/helpers.js @@ -98,15 +98,22 @@ describe('run with real timers', () => { expect(global.setTimeout).toBe(fakedSetTimeout) }) - test('safe check for setImmediate and clearImmediate', () => { - const setImeediate = global.setImmediate + describe('run with setImmediate and clearImmediate deleted', () => { + const setImmediate = global.setImmediate const clearImmediate = global.clearImmediate - delete global.setImmediate - delete global.clearImmediate - expect(() => runWithRealTimers(() => {})).not.toThrow() + beforeEach(() => { + delete global.setImmediate + delete global.clearImmediate + }) + + afterEach(() => { + global.setImmediate = setImmediate + global.clearImmediate = clearImmediate + }) - global.setImmediate = setImeediate - global.clearImmediate = clearImmediate + test('safe check for setImmediate and clearImmediate', () => { + expect(() => runWithRealTimers(() => {})).not.toThrow() + }) }) }) From 014ed78b7b83c77186c47dc358a9d42f0bf89af9 Mon Sep 17 00:00:00 2001 From: "Kent C. Dodds" Date: Thu, 25 Mar 2021 12:13:04 -0600 Subject: [PATCH 4/4] Update src/helpers.js --- src/helpers.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/helpers.js b/src/helpers.js index e3351e6f..559e39d2 100644 --- a/src/helpers.js +++ b/src/helpers.js @@ -22,6 +22,8 @@ function runWithJestRealTimers(callback) { setTimeout, } + // For more on why we have the check here, + // checkout https://github.com/testing-library/dom-testing-library/issues/914 if (typeof setImmediate === 'function') { timerAPI.setImmediate = setImmediate }