Files
HiveGrid-Wireframes/hivegrid-cloud/apps/web/app/utils/theme/userThemePreference.server.test.ts
T

59 lines
2.3 KiB
TypeScript

// @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<ReturnType<typeof updateUserProfile>>;
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<ReturnType<typeof updateUserProfile>>);
await persistUserLightOrDarkMode("user-1", "system");
expect(updateUserProfile).toHaveBeenCalledWith({ lightOrDarkMode: "light" }, "user-1");
});
});