better-chatbot / src /lib /admin /server.test.ts
Bot
Initial commit for HF Spaces
05c5ed5
Raw
History Blame Contribute Delete
7.24 kB
import { describe, it, expect, vi, beforeEach } from "vitest";
import { USER_ROLES } from "app-types/roles";
// Mock server-only module
vi.mock("server-only", () => ({}));
// Mock the auth module
vi.mock("lib/auth/server", () => ({
getSession: vi.fn(),
}));
// Mock the new permission system
vi.mock("lib/auth/permissions", () => ({
requireAdminPermission: vi.fn(),
requireUserListPermission: vi.fn(),
hasAdminPermission: vi.fn(),
canListUsers: vi.fn(),
}));
// Mock the admin repository
vi.mock("lib/db/pg/repositories/admin-respository.pg", () => ({
default: {
getUsers: vi.fn(),
},
}));
// Mock next/headers
vi.mock("next/headers", () => ({
headers: vi.fn().mockResolvedValue(new Headers()),
}));
// Import after mocks
import {
requireAdminSession,
getAdminUsers,
ADMIN_USER_LIST_LIMIT,
DEFAULT_SORT_BY,
DEFAULT_SORT_DIRECTION,
} from "./server";
import { getSession } from "lib/auth/server";
import {
requireAdminPermission,
requireUserListPermission,
hasAdminPermission,
canListUsers,
} from "lib/auth/permissions";
import pgAdminRepository from "lib/db/pg/repositories/admin-respository.pg";
describe("Admin Server - Business Logic", () => {
beforeEach(() => {
vi.clearAllMocks();
});
describe("requireAdminSession - Admin Role Detection", () => {
it("should detect admin role case-insensitively", async () => {
const testCases = [
{ role: "admin", shouldPass: true },
{ role: "ADMIN", shouldPass: true },
{ role: "Admin", shouldPass: true },
{ role: "user,admin", shouldPass: true },
{ role: "ADMIN,editor", shouldPass: true },
{ role: "user", shouldPass: false },
{ role: "editor", shouldPass: false },
{ role: "USER,EDITOR", shouldPass: false },
{ role: "", shouldPass: false },
{ role: null, shouldPass: false },
{ role: undefined, shouldPass: false },
];
for (const testCase of testCases) {
const mockSession = {
user: { id: "test-user", role: testCase.role },
session: { id: "session-1" },
};
vi.mocked(getSession).mockResolvedValue(mockSession as any);
if (testCase.shouldPass) {
vi.mocked(hasAdminPermission).mockResolvedValue(true);
vi.mocked(requireAdminPermission).mockResolvedValue(undefined);
const result = await requireAdminSession();
expect(result).toEqual(mockSession);
} else {
vi.mocked(hasAdminPermission).mockResolvedValue(false);
vi.mocked(requireAdminPermission).mockRejectedValue(
new Error(
"Unauthorized: Admin access required to access admin functions",
),
);
await expect(requireAdminSession()).rejects.toThrow(
"Unauthorized: Admin access required to access admin functions",
);
}
}
});
});
describe("getAdminUsers - Query Parameter Handling", () => {
beforeEach(() => {
// Mock admin session by default
vi.mocked(getSession).mockResolvedValue({
user: { id: "admin-1", role: USER_ROLES.ADMIN },
} as any);
// Mock permissions by default
vi.mocked(canListUsers).mockResolvedValue(true);
vi.mocked(requireUserListPermission).mockResolvedValue(undefined);
});
it("should apply correct defaults when no query provided", async () => {
vi.mocked(pgAdminRepository.getUsers).mockResolvedValue({
users: [],
total: 0,
limit: ADMIN_USER_LIST_LIMIT,
offset: 0,
} as any);
await getAdminUsers();
expect(pgAdminRepository.getUsers).toHaveBeenCalledWith({
searchValue: undefined,
searchField: undefined,
searchOperator: undefined,
limit: ADMIN_USER_LIST_LIMIT, // default
offset: 0, // default
sortBy: DEFAULT_SORT_BY, // default
sortDirection: DEFAULT_SORT_DIRECTION, // default
filterField: undefined,
filterValue: undefined,
filterOperator: undefined,
});
});
it("should override defaults with provided query parameters", async () => {
vi.mocked(pgAdminRepository.getUsers).mockResolvedValue({
users: [],
total: 0,
limit: 25,
offset: 50,
} as any);
const customQuery = {
limit: 25,
offset: 50,
sortBy: "name" as const,
sortDirection: "asc" as const,
searchValue: "john",
searchField: "email" as const,
};
await getAdminUsers(customQuery);
expect(pgAdminRepository.getUsers).toHaveBeenCalledWith(
expect.objectContaining({
limit: 25,
offset: 50,
sortBy: "name",
sortDirection: "asc",
searchValue: "john",
searchField: "email",
}),
);
});
it("should handle response format variations", async () => {
// Test case 1: Response with limit/offset fields
vi.mocked(pgAdminRepository.getUsers).mockResolvedValue({
users: [{ id: "1" }],
total: 1,
limit: 5,
offset: 10,
} as any);
const result1 = await getAdminUsers({ limit: 20, offset: 30 });
expect(result1).toEqual({
users: [{ id: "1" }],
total: 1,
limit: 5, // from response
offset: 10, // from response
});
// Test case 2: Response without limit/offset fields
vi.mocked(pgAdminRepository.getUsers).mockResolvedValue({
users: [{ id: "2" }],
total: 1,
limit: 20,
offset: 30,
} as any);
const result2 = await getAdminUsers({ limit: 20, offset: 30 });
expect(result2).toEqual({
users: [{ id: "2" }],
total: 1,
limit: 20,
offset: 30,
});
});
it("should handle edge case responses", async () => {
// Test malformed/missing response
vi.mocked(pgAdminRepository.getUsers).mockResolvedValue({
users: [],
total: 0,
limit: ADMIN_USER_LIST_LIMIT,
offset: 0,
} as any);
const result = await getAdminUsers();
expect(result).toEqual({
users: [],
total: 0,
limit: ADMIN_USER_LIST_LIMIT,
offset: 0,
});
});
it("should enforce admin access before making API call", async () => {
vi.mocked(getSession).mockResolvedValue({
user: { id: "user-1", role: USER_ROLES.USER },
} as any);
vi.mocked(canListUsers).mockResolvedValue(false);
vi.mocked(requireUserListPermission).mockRejectedValue(
new Error(
"Unauthorized: Permission required to list users in admin panel",
),
);
await expect(getAdminUsers()).rejects.toThrow(
"Unauthorized: Permission required to list users in admin panel",
);
// Should not make the API call if not admin
expect(pgAdminRepository.getUsers).not.toHaveBeenCalled();
});
});
describe("Constants", () => {
it("should have correct default values", () => {
expect(ADMIN_USER_LIST_LIMIT).toBe(10);
expect(DEFAULT_SORT_BY).toBe("createdAt");
expect(DEFAULT_SORT_DIRECTION).toBe("desc");
});
});
});