From 041076e7c89bd2b3ced6e7d9d1bb5458748de864 Mon Sep 17 00:00:00 2001 From: Pedro Henrique Date: Wed, 12 Jun 2024 08:42:41 -0300 Subject: [PATCH] fix: vi.waitFor/vi.waitUntil interval is now cleared after it times out (#5875) --- packages/vitest/src/integrations/wait.ts | 4 +++ test/core/test/wait.test.ts | 44 ++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/packages/vitest/src/integrations/wait.ts b/packages/vitest/src/integrations/wait.ts index 85a5b8cea147..b0927a00cf1e 100644 --- a/packages/vitest/src/integrations/wait.ts +++ b/packages/vitest/src/integrations/wait.ts @@ -45,6 +45,8 @@ export function waitFor(callback: WaitForCallback, options: number | WaitF } const handleTimeout = () => { + if (intervalId) + clearInterval(intervalId) let error = lastError if (!error) error = copyStackTrace(new Error('Timed out in waitFor!'), STACK_TRACE_ERROR) @@ -113,6 +115,8 @@ export function waitUntil(callback: WaitUntilCallback, options: number | W let intervalId: ReturnType const onReject = (error?: Error) => { + if (intervalId) + clearInterval(intervalId) if (!error) error = copyStackTrace(new Error('Timed out in waitUntil!'), STACK_TRACE_ERROR) reject(error) diff --git a/test/core/test/wait.test.ts b/test/core/test/wait.test.ts index b38273e0863a..cb296bc04a64 100644 --- a/test/core/test/wait.test.ts +++ b/test/core/test/wait.test.ts @@ -99,6 +99,28 @@ describe('waitFor', () => { vi.useRealTimers() }) + + test('callback stops running after timeout', async () => { + vi.useFakeTimers() + let timedOut = false + let callbackRanAfterTimeout = false + try { + await vi.waitFor(() => { + callbackRanAfterTimeout = timedOut + throw new Error('waitFor error') + }, { + interval: 100, + timeout: 200, + }) + } + catch (error) { + timedOut = true + } + await vi.advanceTimersByTimeAsync(100) + expect(timedOut).toBe(true) + expect(callbackRanAfterTimeout).toBe(false) + vi.useRealTimers() + }) }) describe('waitUntil', () => { @@ -180,4 +202,26 @@ describe('waitUntil', () => { vi.useRealTimers() }) + + test('callback stops running after timeout', async () => { + vi.useFakeTimers() + let timedOut = false + let callbackRanAfterTimeout = false + try { + await vi.waitUntil(() => { + callbackRanAfterTimeout = timedOut + return false + }, { + interval: 100, + timeout: 200, + }) + } + catch (error) { + timedOut = true + } + await vi.advanceTimersByTimeAsync(100) + expect(timedOut).toBe(true) + expect(callbackRanAfterTimeout).toBe(false) + vi.useRealTimers() + }) })