feat: Erinnerungs-Checkboxen, Anbieterlogos via Logo.dev, Kontakte in Einstellungen

This commit is contained in:
opencode committed 2026-10-18 12:25:56 +02:00
1 parent 11bef8748f
commit a1195223e0
18 files changed
+381 -50

No files matched your search

+43
View File
@@ -0,0 +1,43 @@
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", () => {
process.env.LOGO_DEV_PUBLISHABLE_KEY = "pk_test";
expect(logoImageUrl("stripe.com")).toBe("https://img.logo.dev/stripe.com?token=pk_test&size=128&format=png");
expect(logoImageUrl(null)).toBeNull();
delete process.env.LOGO_DEV_PUBLISHABLE_KEY;
expect(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");
});
});