/** * @license * Copyright 2025 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import { act } from 'react'; import { vi } from 'vitest'; // The waitFor from vitest doesn't properly wrap in act(), so we have to // implement our own like the one in @testing-library/react // or @testing-library/react-native // The version of waitFor from vitest is still fine to use if you aren't waiting // for React state updates. export async function waitFor( assertion: () => void | Promise, { timeout = 2000, interval = 50 } = {}, ): Promise { const startTime = Date.now(); while (true) { try { await assertion(); return; } catch (error) { if (Date.now() - startTime > timeout) { throw error; } await act(async () => { if (vi.isFakeTimers()) { await vi.advanceTimersByTimeAsync(interval); } else { await new Promise((resolve) => setTimeout(resolve, interval)); } }); } } }