Files
EpicNext-Cms/src/actions/admin-maintenance.test.ts
T

189 lines
4.1 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from "vitest";
const {
mockValues,
mockOnDuplicateKeyUpdate,
mockRequirePermission,
mockReload,
mockRevalidatePath,
} = vi.hoisted(() => {
const mockOnDuplicateKeyUpdate = vi.fn().mockResolvedValue(undefined);
const mockValues = vi.fn(() => ({
onDuplicateKeyUpdate: mockOnDuplicateKeyUpdate,
}));
return {
mockValues,
mockOnDuplicateKeyUpdate,
mockRequirePermission: vi.fn(),
mockReload: vi.fn(),
mockRevalidatePath: vi.fn(),
};
});
vi.mock("@/lib/permissions", () => ({
PERMS: {
ADMIN_DASHBOARD: "admin.dashboard",
SETTINGS_VIEW: "admin.settings.view",
SETTINGS_EDIT: "admin.settings.edit",
},
}));
vi.mock("@/lib/db", () => ({
db: {
insert: vi.fn(() => ({ values: mockValues })),
},
WebsiteSetting: { key: "key", value: "value" },
}));
vi.mock("@/lib/admin/guard", () => ({
requirePermission: mockRequirePermission,
}));
vi.mock("@/lib/services/site-settings", () => ({
siteSettings: { reload: mockReload },
}));
vi.mock("next/cache", () => ({
revalidatePath: mockRevalidatePath,
}));
import { saveMaintenance } from "./admin-maintenance";
beforeEach(() => {
vi.clearAllMocks();
mockValues.mockReturnValue({
onDuplicateKeyUpdate: mockOnDuplicateKeyUpdate,
});
mockOnDuplicateKeyUpdate.mockResolvedValue(undefined);
});
describe("saveMaintenance", () => {
it("enables maintenance mode with message and min rank", async () => {
mockRequirePermission.mockResolvedValue({
id: 1,
rank: 7,
username: "admin",
});
const fd = new FormData();
fd.set("enabled", "on");
fd.set("message", "We will be back soon!");
fd.set("min_rank", "3");
await saveMaintenance(fd);
expect(mockRequirePermission).toHaveBeenCalled();
expect(mockValues).toHaveBeenCalledTimes(3);
expect(mockValues).toHaveBeenCalledWith(
expect.objectContaining({
key: "maintenance_enabled",
value: "1",
}),
);
expect(mockValues).toHaveBeenCalledWith(
expect.objectContaining({
key: "maintenance_message",
value: "We will be back soon!",
}),
);
expect(mockValues).toHaveBeenCalledWith(
expect.objectContaining({
key: "min_maintenance_login_rank",
value: "3",
}),
);
expect(mockOnDuplicateKeyUpdate).toHaveBeenCalledTimes(3);
expect(mockReload).toHaveBeenCalledOnce();
expect(mockRevalidatePath).toHaveBeenCalledWith("/admin/maintenance");
});
it("disables maintenance mode", async () => {
mockRequirePermission.mockResolvedValue({
id: 1,
rank: 7,
username: "admin",
});
const fd = new FormData();
fd.set("message", "");
fd.set("min_rank", "");
await saveMaintenance(fd);
expect(mockValues).toHaveBeenCalledWith(
expect.objectContaining({
key: "maintenance_enabled",
value: "0",
}),
);
expect(mockValues).toHaveBeenCalledWith(
expect.objectContaining({
key: "min_maintenance_login_rank",
value: "5",
}),
);
});
it("defaults min_rank to 5 when input is empty", async () => {
mockRequirePermission.mockResolvedValue({
id: 1,
rank: 7,
username: "admin",
});
const fd = new FormData();
fd.set("enabled", "on");
fd.set("message", "");
fd.set("min_rank", "");
await saveMaintenance(fd);
expect(mockValues).toHaveBeenCalledWith(
expect.objectContaining({
key: "min_maintenance_login_rank",
value: "5",
}),
);
});
it("defaults min_rank to 5 when input is negative", async () => {
mockRequirePermission.mockResolvedValue({
id: 1,
rank: 7,
username: "admin",
});
const fd = new FormData();
fd.set("enabled", "on");
fd.set("message", "");
fd.set("min_rank", "-1");
await saveMaintenance(fd);
expect(mockValues).toHaveBeenCalledWith(
expect.objectContaining({
key: "min_maintenance_login_rank",
value: "5",
}),
);
});
it("calls requirePermission with SETTINGS_EDIT", async () => {
mockRequirePermission.mockResolvedValue({
id: 1,
rank: 7,
username: "admin",
});
const fd = new FormData();
fd.set("message", "");
fd.set("min_rank", "");
await saveMaintenance(fd);
expect(mockRequirePermission).toHaveBeenCalledWith("admin.settings.edit");
});
});