import { afterEach, describe, expect, it, vi } from "vitest"; import { fetchLatestAgentCanvasVersion } from "./agent-canvas-updates"; function stubFetchResponse(response: Partial) { const fetchMock = vi.fn().mockResolvedValue(response as Response); vi.stubGlobal("fetch", fetchMock); return fetchMock; } afterEach(() => { vi.unstubAllGlobals(); }); describe("fetchLatestAgentCanvasVersion", () => { it("fetches the npm registry latest dist-tag and returns the trimmed version", async () => { const fetchMock = stubFetchResponse({ ok: true, json: async () => ({ version: " 1.6.0 " }), }); await expect(fetchLatestAgentCanvasVersion()).resolves.toBe("1.6.0"); expect(fetchMock).toHaveBeenCalledWith( "https://registry.npmjs.org/@openhands/agent-canvas/latest", expect.objectContaining({ headers: { Accept: "application/json" } }), ); }); it("rejects when the registry responds with an error status", async () => { stubFetchResponse({ ok: false, status: 503 }); await expect(fetchLatestAgentCanvasVersion()).rejects.toThrow("503"); }); it("rejects when the response has no usable version field", async () => { stubFetchResponse({ ok: true, json: async () => ({ version: 42 }) }); await expect(fetchLatestAgentCanvasVersion()).rejects.toThrow( "missing version", ); }); });