import { beforeEach, describe, expect, it, vi } from "vitest"; const { selectFrom } = vi.hoisted(() => ({ selectFrom: vi.fn() })); vi.mock("@/lib/db", () => ({ db: { select: () => ({ from: () => Promise.resolve(selectFrom()), }), insert: () => ({ values: () => ({ onDuplicateKeyUpdate: () => Promise.resolve(), }), }), }, WebsiteSetting: { key: "WebsiteSetting.key", value: "WebsiteSetting.value" }, })); import { siteSettings } from "./site-settings"; beforeEach(async () => { selectFrom.mockReset(); await siteSettings.reload(); }); describe("siteSettings", () => { it("returns a value by key", async () => { selectFrom.mockResolvedValue([{ key: "hotel_name", value: "AtomHotel" }]); expect(await siteSettings.get("hotel_name")).toBe("AtomHotel"); }); it("returns the fallback when key is missing", async () => { selectFrom.mockResolvedValue([]); expect(await siteSettings.get("missing", "fallback")).toBe("fallback"); expect(await siteSettings.get("missing")).toBeNull(); }); it("coerces '1'/'0' string booleans", async () => { selectFrom.mockResolvedValue([ { key: "maintenance_enabled", value: "1" }, { key: "radio_enabled", value: "0" }, ]); expect(await siteSettings.getBool("maintenance_enabled")).toBe(true); expect(await siteSettings.getBool("radio_enabled")).toBe(false); expect(await siteSettings.getBool("missing", true)).toBe(true); }); it("fetches once and caches until reload", async () => { selectFrom.mockResolvedValue([{ key: "hotel_name", value: "AtomHotel" }]); await siteSettings.get("hotel_name"); await siteSettings.getBool("hotel_name"); expect(selectFrom).toHaveBeenCalledTimes(1); await siteSettings.reload(); await siteSettings.get("hotel_name"); expect(selectFrom).toHaveBeenCalledTimes(2); }); });