diff --git a/web/test/media-catalog-page.test.tsx b/web/test/media-catalog-page.test.tsx index ef2581f..0a9f0c3 100644 --- a/web/test/media-catalog-page.test.tsx +++ b/web/test/media-catalog-page.test.tsx @@ -62,7 +62,9 @@ function mount(entry: string) { )); } async function settle(done: () => boolean) { - for (let i = 0; i < 50 && !done(); i++) await act(async () => { await new Promise(resolve => setTimeout(resolve, 10)); }); + // Up to 4s rather than 50 polls: a slow CI runner's first render alone can take over half a second. + const deadline = Date.now() + 4000; + while (!done() && Date.now() < deadline) await act(async () => { await new Promise(resolve => setTimeout(resolve, 10)); }); expect(done()).toBe(true); } const prefer = (patch: Partial) => saveMediaPreferences(scope, { density: 'compact', showContinue: true, showLibraryName: true, ...patch }); diff --git a/web/test/media-list-return.test.tsx b/web/test/media-list-return.test.tsx index 6ad9686..dc6c194 100644 --- a/web/test/media-list-return.test.tsx +++ b/web/test/media-list-return.test.tsx @@ -50,8 +50,10 @@ function mount(initial: string) { return router; } +/** Polls until `done` holds, for up to 4s: a slow CI runner's first render alone can take over half a second. */ async function settle(done: () => boolean) { - for (let i = 0; i < 50 && !done(); i++) await act(async () => { await new Promise(resolve => setTimeout(resolve, 10)); }); + const deadline = Date.now() + 4000; + while (!done() && Date.now() < deadline) await act(async () => { await new Promise(resolve => setTimeout(resolve, 10)); }); expect(done()).toBe(true); } const screen = () => root.querySelector('.media-screen')!;