fix(housekeeping): address people moderation review
This commit is contained in:
1 parent
29fe22297b
commit
3fa1119f5a
20 files changed
+2000
-777
No files matched your search
@@ -0,0 +1,100 @@
|
||||
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||
import { PERMS } from "@/lib/permission-slugs";
|
||||
import type { HousekeepingCapabilityContext } from "../../foundation/contracts";
|
||||
|
||||
const mocks = vi.hoisted(() => ({
|
||||
execute: vi.fn(),
|
||||
fetchTicketQueueOpenCounts: vi.fn(),
|
||||
}));
|
||||
|
||||
vi.mock("@/lib/admin/ticket-queue-counts", () => ({
|
||||
fetchTicketQueueOpenCounts: mocks.fetchTicketQueueOpenCounts,
|
||||
}));
|
||||
vi.mock("@/lib/db", () => {
|
||||
return { db: { execute: mocks.execute } };
|
||||
});
|
||||
|
||||
import { PEOPLE_WIDGETS } from "./widgets";
|
||||
|
||||
function context(granted: readonly string[]): HousekeepingCapabilityContext {
|
||||
const permissions = new Set(granted);
|
||||
return {
|
||||
actor: { id: 42, username: "operator", rank: 4 },
|
||||
isSuperAdmin: false,
|
||||
has: (slug) => permissions.has(slug),
|
||||
hasAny: (...slugs) => slugs.some((slug) => permissions.has(slug)),
|
||||
hasAll: (...slugs) => slugs.every((slug) => permissions.has(slug)),
|
||||
};
|
||||
}
|
||||
|
||||
async function load(granted: readonly string[]) {
|
||||
return PEOPLE_WIDGETS[0].load(
|
||||
context(granted),
|
||||
new AbortController().signal,
|
||||
);
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks();
|
||||
mocks.fetchTicketQueueOpenCounts.mockResolvedValue({
|
||||
cmsOpen: 1,
|
||||
helpOpen: 2,
|
||||
});
|
||||
});
|
||||
|
||||
describe("People production queue widget", () => {
|
||||
it("wires ticket-only, CFH-only, ban-only, mixed, and denied contexts without unauthorized reads", async () => {
|
||||
await expect(load([PERMS.MOD_TICKETS_VIEW])).resolves.toMatchObject({
|
||||
ok: true,
|
||||
data: { tickets: 1, helpTickets: 2, cfh: 0, activeBans: 0 },
|
||||
});
|
||||
expect(mocks.fetchTicketQueueOpenCounts).toHaveBeenCalledTimes(1);
|
||||
expect(mocks.execute).not.toHaveBeenCalled();
|
||||
|
||||
vi.clearAllMocks();
|
||||
mocks.execute.mockResolvedValueOnce([[{ total: 3 }], []]);
|
||||
await expect(load([PERMS.MOD_CFH_VIEW])).resolves.toMatchObject({
|
||||
ok: true,
|
||||
data: { tickets: 0, helpTickets: 0, cfh: 3, activeBans: 0 },
|
||||
});
|
||||
expect(mocks.fetchTicketQueueOpenCounts).not.toHaveBeenCalled();
|
||||
expect(mocks.execute).toHaveBeenCalledTimes(1);
|
||||
|
||||
vi.clearAllMocks();
|
||||
mocks.execute.mockResolvedValueOnce([[{ total: 4 }], []]);
|
||||
await expect(load([PERMS.MOD_BANS_VIEW])).resolves.toMatchObject({
|
||||
ok: true,
|
||||
data: { tickets: 0, helpTickets: 0, cfh: 0, activeBans: 4 },
|
||||
});
|
||||
expect(mocks.fetchTicketQueueOpenCounts).not.toHaveBeenCalled();
|
||||
expect(mocks.execute).toHaveBeenCalledTimes(1);
|
||||
|
||||
vi.clearAllMocks();
|
||||
mocks.fetchTicketQueueOpenCounts.mockResolvedValue({
|
||||
cmsOpen: 1,
|
||||
helpOpen: 2,
|
||||
});
|
||||
mocks.execute
|
||||
.mockResolvedValueOnce([[{ total: 3 }], []])
|
||||
.mockResolvedValueOnce([[{ total: 4 }], []]);
|
||||
const mixed = await load([
|
||||
PERMS.MOD_TICKETS_VIEW,
|
||||
PERMS.MOD_CFH_VIEW,
|
||||
PERMS.MOD_BANS_VIEW,
|
||||
]);
|
||||
expect(mocks.fetchTicketQueueOpenCounts).toHaveBeenCalledTimes(1);
|
||||
expect(mocks.execute).toHaveBeenCalledTimes(2);
|
||||
expect(mixed).toMatchObject({
|
||||
ok: true,
|
||||
data: { tickets: 1, helpTickets: 2, cfh: 3, activeBans: 4 },
|
||||
});
|
||||
|
||||
vi.clearAllMocks();
|
||||
await expect(load([])).resolves.toMatchObject({
|
||||
ok: false,
|
||||
error: { code: "FORBIDDEN" },
|
||||
});
|
||||
expect(mocks.fetchTicketQueueOpenCounts).not.toHaveBeenCalled();
|
||||
expect(mocks.execute).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user