import { describe, it, expect, vi, afterEach } from "vitest"; import { logoImageUrl, monogram, normalizeDomain, searchLogos } from "../lib/logo"; afterEach(() => { vi.unstubAllGlobals(); delete process.env.LOGO_DEV_SECRET_KEY; delete process.env.LOGO_DEV_PUBLISHABLE_KEY; }); describe("logo", () => { it("normalizeDomain akzeptiert nur gültige Domains", () => { expect(normalizeDomain("Therme-Erding.de")).toBe("therme-erding.de"); expect(normalizeDomain(" keinedomain ")).toBeNull(); expect(normalizeDomain(null)).toBeNull(); }); it("logoImageUrl braucht Domain und öffentlichen Key", async () => { process.env.LOGO_DEV_PUBLISHABLE_KEY = "pk_test"; expect(await logoImageUrl("stripe.com")).toBe("https://img.logo.dev/stripe.com?token=pk_test&size=128&format=png"); expect(await logoImageUrl(null)).toBeNull(); delete process.env.LOGO_DEV_PUBLISHABLE_KEY; expect(await logoImageUrl("stripe.com")).toBeNull(); }); it("monogram bildet Kürzel aus dem Namen", () => { expect(monogram("Therme Erding")).toBe("TE"); expect(monogram("dm")).toBe("DM"); expect(monogram(" ")).toBe("?"); }); it("searchLogos mappt Treffer und begrenzt auf 8", async () => { process.env.LOGO_DEV_SECRET_KEY = "sk_test"; process.env.LOGO_DEV_PUBLISHABLE_KEY = "pk_test"; const items = Array.from({ length: 10 }, (_, i) => ({ name: `Shop ${i}`, domain: `shop${i}.de` })); vi.stubGlobal("fetch", vi.fn().mockResolvedValue({ ok: true, json: async () => items })); const res = await searchLogos("shop"); expect(res).toHaveLength(8); expect(res[0]).toEqual({ name: "Shop 0", domain: "shop0.de", logoUrl: expect.stringContaining("shop0.de") }); }); it("searchLogos wirft ohne Key und bei Fehlerstatus", async () => { await expect(searchLogos("x")).rejects.toThrow("LOGO_DEV_SECRET_KEY fehlt"); process.env.LOGO_DEV_SECRET_KEY = "sk_test"; vi.stubGlobal("fetch", vi.fn().mockResolvedValue({ ok: false, status: 401 })); await expect(searchLogos("x")).rejects.toThrow("Logosuche 401"); }); });