import { describe, it, expect, vi, beforeEach } from "vitest"; // Mocks vi.mock("./auth-instance", () => ({ getSession: vi.fn(), })); vi.mock("lib/user/utils", () => ({ getIsUserAdmin: vi.fn(), })); // server-only is used inside the module; stub it for tests vi.mock("server-only", () => ({})); const { getSession } = await import("./auth-instance"); const { getIsUserAdmin } = await import("lib/user/utils"); describe("auth/permissions", () => { beforeEach(() => { vi.resetAllMocks(); }); it("hasAdminPermission returns true when user is admin", async () => { const permissions = await import("./permissions"); vi.mocked(getSession).mockResolvedValue({ user: { id: "u1", role: "admin" }, } as any); vi.mocked(getIsUserAdmin).mockReturnValue(true); await expect(permissions.hasAdminPermission()).resolves.toBe(true); }); it("hasAdminPermission returns false when no session", async () => { const permissions = await import("./permissions"); vi.mocked(getSession).mockResolvedValue(null as any); await expect(permissions.hasAdminPermission()).resolves.toBe(false); }); it("canManageUsers equals hasAdminPermission", async () => { const permissions = await import("./permissions"); vi.mocked(getSession).mockResolvedValue({ user: { id: "u1", role: "user" }, } as any); vi.mocked(getIsUserAdmin).mockReturnValue(false); await expect(permissions.canManageUsers()).resolves.toBe(false); vi.mocked(getIsUserAdmin).mockReturnValue(true); await expect(permissions.canManageUsers()).resolves.toBe(true); }); it("canManageUser returns true for self regardless of admin", async () => { const permissions = await import("./permissions"); vi.mocked(getSession).mockResolvedValue({ user: { id: "self", role: "user" }, } as any); vi.mocked(getIsUserAdmin).mockReturnValue(false); await expect(permissions.canManageUser("self")).resolves.toBe(true); }); it("canManageUser returns true for others if admin", async () => { const permissions = await import("./permissions"); vi.mocked(getSession).mockResolvedValue({ user: { id: "u1", role: "admin" }, } as any); vi.mocked(getIsUserAdmin).mockReturnValue(true); await expect(permissions.canManageUser("other")).resolves.toBe(true); }); it("requireAdminPermission throws when not admin", async () => { const permissions = await import("./permissions"); vi.mocked(getSession).mockResolvedValue({ user: { id: "u1", role: "user" }, } as any); vi.mocked(getIsUserAdmin).mockReturnValue(false); await expect( permissions.requireAdminPermission("do admin thing"), ).rejects.toThrow(/Admin access required/); }); it("requireUserManagePermissionFor throws when cannot manage target", async () => { const permissions = await import("./permissions"); vi.mocked(getSession).mockResolvedValue({ user: { id: "u1", role: "user" }, } as any); vi.mocked(getIsUserAdmin).mockReturnValue(false); await expect( permissions.requireUserManagePermissionFor("u2", "manage this user"), ).rejects.toThrow(/Permission required/); }); });