59 lines
2.3 KiB
TypeScript
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");
|
|
});
|
|
});
|