From cd60fa45e03b9141dcc9d5b2ae98f3bcb9e47c72 Mon Sep 17 00:00:00 2001 From: Lei Chen Date: Sun, 20 Jun 2021 22:16:07 -0500 Subject: [PATCH] add tests to prove jest useFakeTimers is supported --- src/dom/__tests__/asyncHook.test.ts | 57 ++++++++++++++++++++++++++ src/native/__tests__/asyncHook.test.ts | 51 +++++++++++++++++++++++ src/server/__tests__/asyncHook.test.ts | 56 +++++++++++++++++++++++++ 3 files changed, 164 insertions(+) diff --git a/src/dom/__tests__/asyncHook.test.ts b/src/dom/__tests__/asyncHook.test.ts index d460d35f..9e55c6b7 100644 --- a/src/dom/__tests__/asyncHook.test.ts +++ b/src/dom/__tests__/asyncHook.test.ts @@ -101,6 +101,63 @@ describe('async hook tests', () => { expect(complete).toBe(true) }) + test('should wait for arbitrary expectation to pass when use jest.usedFakeTimers() and advanceTimersByTime()', async () => { + try { + jest.useFakeTimers() + + const { waitFor } = renderHook(() => null) + + let actual = 0 + const expected = 1 + + setTimeout(() => { + actual = expected + }, 200) + let complete = false + jest.advanceTimersByTime(200) + await waitFor( + () => { + expect(actual).toBe(expected) + complete = true + }, + { timeout: 250, interval: 10 } + ) + + expect(complete).toBe(true) + } catch { + } finally { + jest.useRealTimers() + } + }) + test('should wait for arbitrary expectation to pass when use jest.usedFakeTimers() and runOnlyPendingTimers() ', async () => { + try { + jest.useFakeTimers() + + const { waitFor } = renderHook(() => null) + + let actual = 0 + const expected = 1 + + setTimeout(() => { + actual = expected + }, 200) + let complete = false + jest.runOnlyPendingTimers() + await waitFor( + () => { + expect(actual).toBe(expected) + complete = true + }, + { timeout: 250, interval: 10 } + ) + + expect(complete).toBe(true) + } catch { + } finally { + jest.useRealTimers() + } + }) + test('should not hang if expectation is already passing', async () => { const { result, waitFor } = renderHook(() => useSequence(['first', 'second'])) diff --git a/src/native/__tests__/asyncHook.test.ts b/src/native/__tests__/asyncHook.test.ts index d460d35f..a1e45dea 100644 --- a/src/native/__tests__/asyncHook.test.ts +++ b/src/native/__tests__/asyncHook.test.ts @@ -101,6 +101,57 @@ describe('async hook tests', () => { expect(complete).toBe(true) }) + test('should wait for arbitrary expectation to pass when use jest.usedFakeTimers() and advanceTimersByTime()', async () => { + try { + jest.useFakeTimers() + const { waitFor } = renderHook(() => null) + + let actual = 0 + const expected = 1 + + setTimeout(() => { + actual = expected + }, 200) + + let complete = false + jest.advanceTimersByTime(200) + await waitFor(() => { + expect(actual).toBe(expected) + complete = true + }) + + expect(complete).toBe(true) + } catch { + } finally { + jest.useRealTimers() + } + }) + test('should wait for arbitrary expectation to pass when use jest.usedFakeTimers() and runOnlyPendingTimers()', async () => { + try { + jest.useFakeTimers() + const { waitFor } = renderHook(() => null) + + let actual = 0 + const expected = 1 + + setTimeout(() => { + actual = expected + }, 200) + + let complete = false + jest.runOnlyPendingTimers() + await waitFor(() => { + expect(actual).toBe(expected) + complete = true + }) + + expect(complete).toBe(true) + } catch { + } finally { + jest.useRealTimers() + } + }) + test('should not hang if expectation is already passing', async () => { const { result, waitFor } = renderHook(() => useSequence(['first', 'second'])) diff --git a/src/server/__tests__/asyncHook.test.ts b/src/server/__tests__/asyncHook.test.ts index 7d23a981..a4b158dd 100644 --- a/src/server/__tests__/asyncHook.test.ts +++ b/src/server/__tests__/asyncHook.test.ts @@ -129,6 +129,62 @@ describe('async hook tests', () => { expect(complete).toBe(true) }) + test('should wait for arbitrary expectation to pass when use jest.usedFakeTimers() and advanceTimersByTime()', async () => { + try { + jest.useFakeTimers() + const { waitFor, hydrate } = renderHook(() => null) + + hydrate() + + let actual = 0 + const expected = 1 + + setTimeout(() => { + actual = expected + }, 200) + + let complete = false + jest.advanceTimersByTime(200) + await waitFor(() => { + expect(actual).toBe(expected) + complete = true + }) + + expect(complete).toBe(true) + } catch { + } finally { + jest.useRealTimers() + } + }) + test('should wait for arbitrary expectation to pass when use jest.usedFakeTimers() and runOnlyPendingTimers()', async () => { + try { + jest.useFakeTimers() + + const { waitFor, hydrate } = renderHook(() => null) + + hydrate() + + let actual = 0 + const expected = 1 + + setTimeout(() => { + actual = expected + }, 200) + + let complete = false + jest.runOnlyPendingTimers() + await waitFor(() => { + expect(actual).toBe(expected) + complete = true + }) + + expect(complete).toBe(true) + } catch { + } finally { + jest.useRealTimers() + } + }) + test('should not hang if expectation is already passing', async () => { const { result, hydrate, waitFor } = renderHook(() => useSequence(['first', 'second']))