import { describe, it, expect, vi, beforeEach } from "vitest"; import { PATCH } from "../route"; // Mock the localDb functions used in the route vi.mock("../../../../lib/localDb", () => { const original = vi.importActual("../../../../lib/localDb"); return { ...original, getSettings: vi.fn(), updateSettings: vi.fn(), }; }); import { getSettings, updateSettings } from "../../../../lib/localDb"; // Helper to create a Request with JSON body function createPatchRequest(body: unknown) { return new Request("http://localhost/api/settings", { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify(body), }); } describe("PATCH /api/settings", () => { beforeEach(() => { vi.resetAllMocks(); // Default settings before each test (getSettings as any).mockResolvedValue({ debugMode: false, hiddenSidebarItems: [], hiddenSidebarGroupLabels: [], comboConfigMode: "guided", }); // Mock updateSettings to merge updates into the original (updateSettings as any).mockImplementation(async (updates: Record) => { const current = await (getSettings as any)(); return { ...current, ...updates }; }); }); it("toggles debugMode via PATCH", async () => { const req = createPatchRequest({ debugMode: true }); const res = await PATCH(req as any); expect(res.status).toBe(200); const json = await res.json(); expect(json.debugMode).toBe(true); // Ensure password is not leaked expect(json).not.toHaveProperty("password"); // Verify DB update called with correct payload expect(updateSettings).toHaveBeenCalledOnce(); const calledWith = (updateSettings as any).mock.calls[0][0]; expect(calledWith.debugMode).toBe(true); }); it("updates hiddenSidebarItems via PATCH", async () => { const req = createPatchRequest({ hiddenSidebarItems: [] }); const res = await PATCH(req as any); expect(res.status).toBe(200); const json = await res.json(); expect(json.hiddenSidebarItems).toEqual([]); expect(updateSettings).toHaveBeenCalledOnce(); const calledWith = (updateSettings as any).mock.calls[0][0]; expect(calledWith.hiddenSidebarItems).toEqual([]); }); it("updates hiddenSidebarGroupLabels via PATCH", async () => { const req = createPatchRequest({ hiddenSidebarGroupLabels: ["logs", "audit"] }); const res = await PATCH(req as any); expect(res.status).toBe(200); const json = await res.json(); expect(json.hiddenSidebarGroupLabels).toEqual(["logs", "audit"]); expect(updateSettings).toHaveBeenCalledOnce(); const calledWith = (updateSettings as any).mock.calls[0][0]; expect(calledWith.hiddenSidebarGroupLabels).toEqual(["logs", "audit"]); }); it("updates comboConfigMode via PATCH", async () => { const req = createPatchRequest({ comboConfigMode: "expert" }); const res = await PATCH(req as any); expect(res.status).toBe(200); const json = await res.json(); expect(json.comboConfigMode).toBe("expert"); expect(updateSettings).toHaveBeenCalledOnce(); const calledWith = (updateSettings as any).mock.calls[0][0]; expect(calledWith.comboConfigMode).toBe("expert"); }); });