Files

44 lines
2.0 KiB
TypeScript

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");
});
});