// @vitest-environment node import { beforeEach, describe, expect, it, vi } from "vitest"; vi.mock("~/utils/db/users.db.server", () => ({ updateUserProfile: vi.fn(), })); const { normalizeLightOrDarkMode, nextLightOrDarkMode, persistUserLightOrDarkMode } = await import("./userThemePreference.server"); const { updateUserProfile } = await import("~/utils/db/users.db.server"); describe("user theme preference helpers", () => { beforeEach(() => { vi.mocked(updateUserProfile).mockReset(); }); it("accepts only light and dark values", () => { expect(normalizeLightOrDarkMode("light")).toBe("light"); expect(normalizeLightOrDarkMode("dark")).toBe("dark"); }); it("normalizes missing and unknown values to light", () => { expect(normalizeLightOrDarkMode(undefined)).toBe("light"); expect(normalizeLightOrDarkMode(null)).toBe("light"); expect(normalizeLightOrDarkMode("")).toBe("light"); expect(normalizeLightOrDarkMode("system")).toBe("light"); }); it("toggles from normalized current values", () => { expect(nextLightOrDarkMode("light")).toBe("dark"); expect(nextLightOrDarkMode("dark")).toBe("light"); expect(nextLightOrDarkMode("unknown")).toBe("dark"); }); it("does not write for anonymous users", async () => { await expect(persistUserLightOrDarkMode(undefined, "dark")).resolves.toBeNull(); await expect(persistUserLightOrDarkMode("", "dark")).resolves.toBeNull(); expect(updateUserProfile).not.toHaveBeenCalled(); }); it("persists a normalized value for authenticated users", async () => { const user = { id: "user-1" } as Awaited>; vi.mocked(updateUserProfile).mockResolvedValueOnce(user); await expect(persistUserLightOrDarkMode("user-1", "dark")).resolves.toEqual(user); expect(updateUserProfile).toHaveBeenCalledTimes(1); expect(updateUserProfile).toHaveBeenCalledWith({ lightOrDarkMode: "dark" }, "user-1"); }); it("normalizes unknown values before persisting", async () => { vi.mocked(updateUserProfile).mockResolvedValueOnce({ id: "user-1" } as Awaited>); await persistUserLightOrDarkMode("user-1", "system"); expect(updateUserProfile).toHaveBeenCalledWith({ lightOrDarkMode: "light" }, "user-1"); }); });