import { afterEach, beforeEach, expect, it, vi } from "vitest"; import { setToken } from "../src/api/client"; import { __resetImageCache, fetchObjectUrl } from "../src/lib/authImage"; beforeEach(() => { __resetImageCache(); setToken("T"); (URL as any).createObjectURL = vi.fn(() => "blob:gen"); }); afterEach(() => vi.unstubAllGlobals()); it("blob → objectURL;同 URL 只发一次请求", async () => { const f = vi.fn(async (_url: any, init: any) => { expect(init.headers.Authorization).toBe("Bearer T"); return new Response(new Blob(["img"]), { status: 200 }); }); vi.stubGlobal("fetch", f); expect(await fetchObjectUrl("/api/books/1/cover?v=h")).toBe("blob:gen"); expect(await fetchObjectUrl("/api/books/1/cover?v=h")).toBe("blob:gen"); expect(f).toHaveBeenCalledTimes(1); }); it("失败不入缓存,重试重新请求", async () => { let n = 0; vi.stubGlobal("fetch", async () => { n++; return n === 1 ? new Response("x", { status: 500 }) : new Response(new Blob(["img"]), { status: 200 }); }); await expect(fetchObjectUrl("/api/books/2/pages/0?v=h")).rejects.toThrow(); expect(await fetchObjectUrl("/api/books/2/pages/0?v=h")).toBe("blob:gen"); expect(n).toBe(2); });