import { describe, it, expect } from "vitest"; import { buildManifest, parseOrgIdFromCookie } from "./index"; import worker from "./index"; describe("parseOrgIdFromCookie", () => { it("returns null when no cookie header", () => { expect(parseOrgIdFromCookie(null)).toBeNull(); }); it("returns null when x-org-id cookie is missing", () => { expect(parseOrgIdFromCookie("other=value; foo=bar")).toBeNull(); }); it("parses x-org-id from cookie string", () => { expect(parseOrgIdFromCookie("x-org-id=42; other=value")).toBe(42); }); it("returns null for non-numeric x-org-id", () => { expect(parseOrgIdFromCookie("x-org-id=abc")).toBeNull(); }); }); describe("buildManifest", () => { it("returns default icons when orgId is null", () => { const manifest = buildManifest(null); expect(manifest.name).toBe("XTablo"); expect(manifest.icons[0].src).toBe("/pwa-icons/pwa-192x192.png"); }); it("returns org-specific icon URLs from assets.xtablo.com when orgId is provided", () => { const manifest = buildManifest(42); expect(manifest.name).toBe("XTablo"); expect(manifest.icons[0].src).toBe("https://assets.xtablo.com/org-icons/42/icon-192.png"); expect(manifest.icons[1].src).toBe("https://assets.xtablo.com/org-icons/42/icon-512.png"); expect(manifest.icons[2].src).toBe("https://assets.xtablo.com/org-icons/42/icon-512-maskable.png"); expect(manifest.icons[2].purpose).toBe("maskable"); }); }); describe("worker icon redirects", () => { it("redirects apple-touch-icon to org-specific icon when cookie is set", async () => { const request = new Request("https://app.xtablo.com/pwa-icons/apple-touch-icon-180x180.png", { headers: { cookie: "x-org-id=42" }, }); const response = await worker.fetch(request); expect(response.status).toBe(302); expect(response.headers.get("location")).toBe("https://assets.xtablo.com/org-icons/42/icon-180.png"); }); it("redirects apple-touch-icon to default when no cookie", async () => { const request = new Request("https://app.xtablo.com/pwa-icons/apple-touch-icon-180x180.png"); const response = await worker.fetch(request); expect(response.status).toBe(302); expect(response.headers.get("location")).toBe("https://app.xtablo.com/pwa-icons/default-apple-touch-icon-180x180.png"); }); it("redirects favicon to org-specific icon when cookie is set", async () => { const request = new Request("https://app.xtablo.com/pwa-icons/favicon-32x32.png", { headers: { cookie: "x-org-id=7" }, }); const response = await worker.fetch(request); expect(response.status).toBe(302); expect(response.headers.get("location")).toBe("https://assets.xtablo.com/org-icons/7/icon-32.png"); }); });