diff --git a/tests/unit/ui/use-provider-models-auto-fetch.test.tsx b/tests/unit/ui/use-provider-models-auto-fetch.test.tsx index 08e93f6d03..7b16b04b5c 100644 --- a/tests/unit/ui/use-provider-models-auto-fetch.test.tsx +++ b/tests/unit/ui/use-provider-models-auto-fetch.test.tsx @@ -6,9 +6,8 @@ vi.mock("next-intl", () => ({ useTranslations: () => (key: string) => key, })); -const { useProviderModels } = await import( - "@/app/(dashboard)/dashboard/providers/hooks/useProviderModels" -); +const { useProviderModels } = + await import("@/app/(dashboard)/dashboard/providers/hooks/useProviderModels"); function createResponse(body: unknown, ok = true): Response { return { @@ -67,11 +66,21 @@ describe("useProviderModels upstream auto-fetch", () => { const mounted = await renderProviderModels(); await flushQueuedSync(); + // Desmontar ANTES de asserir. O hook agenda a auto-sync num setTimeout e o + // callback so checa o flag `cancelled` na entrada; enquanto o componente + // estiver montado esse flag e false. Se o timer escapar da janela do teste, + // ele dispara depois do afterEach ja ter feito unstubAllGlobals() e cai no + // fetch REAL com uma URL relativa — `new URL` estoura e derruba o arquivo. + // Isso nao acontece com a maquina ociosa, so sob os 20 workers da suite + // cheia, e foi assim que este teste virou vermelho intermitente no CI. + // Desmontar primeiro faz `cancelled` virar true e o callback sair cedo; as + // chamadas ja registradas no fetchMock continuam disponiveis para o assert. + mounted.unmount(); + expect(fetchMock).not.toHaveBeenCalledWith( "/api/providers/connection-1/sync-models?mode=sync", expect.anything() ); - mounted.unmount(); }); it("synchronizes upstream models only when autoFetchModels is explicitly true", async () => { @@ -101,10 +110,11 @@ describe("useProviderModels upstream auto-fetch", () => { const mounted = await renderProviderModels(); await flushQueuedSync(); - expect(fetchMock).toHaveBeenCalledWith( - "/api/providers/connection-1/sync-models?mode=sync", - { method: "POST" } - ); + // Mesmo motivo do teste acima: desmontar fecha a janela do timer vazado. mounted.unmount(); + + expect(fetchMock).toHaveBeenCalledWith("/api/providers/connection-1/sync-models?mode=sync", { + method: "POST", + }); }); });