Files
HiveGrid-Wireframes/hivegrid-cloud/apps/web/app/utils/db/permissions/rowPermissions.db.server.test.ts
T

82 lines
3.5 KiB
TypeScript

// @vitest-environment node
import { beforeEach, describe, expect, it, vi } from "vitest";
vi.mock("../../db.server", () => ({
db: {
rowPermission: {
create: vi.fn(),
deleteMany: vi.fn(),
findFirst: vi.fn(),
findMany: vi.fn(),
updateMany: vi.fn(),
},
},
}));
import { db } from "../../db.server";
import {
createRowPermission,
deleteRowPermission,
deleteRowPermissionByIdForRow,
getRowPermissionByGroups,
getRowPermissionByRoles,
getRowPermissionByTenant,
getRowPermissionByUsers,
getRowPermissions,
updateRowPermissionForRow,
} from "./rowPermissions.db.server";
const dbMock = vi.mocked(db);
describe("row permission persistence", () => {
beforeEach(() => {
vi.clearAllMocks();
});
it("lists row permissions with tenant, role, group, and user display details", async () => {
vi.mocked(dbMock.rowPermission.findMany).mockResolvedValueOnce([{ id: "rp_1" }] as never);
await expect(getRowPermissions("row_1")).resolves.toEqual([{ id: "rp_1" }]);
expect(dbMock.rowPermission.findMany).toHaveBeenCalledWith({
where: { rowId: "row_1" },
include: {
tenant: { select: { id: true, name: true } },
role: { select: { id: true, name: true } },
group: { select: { id: true, name: true } },
user: { select: { id: true, email: true } },
},
});
});
it("looks up row permissions by scoped principals", async () => {
vi.mocked(dbMock.rowPermission.findFirst).mockResolvedValue({ id: "rp_1" } as never);
await getRowPermissionByTenant("row_1", "tenant_1");
await getRowPermissionByGroups("row_1", ["group_1", "group_2"]);
await getRowPermissionByRoles("row_1", ["role_1"]);
await getRowPermissionByUsers("row_1", ["user_1"]);
expect(dbMock.rowPermission.findFirst).toHaveBeenNthCalledWith(1, { where: { rowId: "row_1", tenantId: "tenant_1" } });
expect(dbMock.rowPermission.findFirst).toHaveBeenNthCalledWith(2, { where: { rowId: "row_1", groupId: { in: ["group_1", "group_2"] } } });
expect(dbMock.rowPermission.findFirst).toHaveBeenNthCalledWith(3, { where: { rowId: "row_1", roleId: { in: ["role_1"] } } });
expect(dbMock.rowPermission.findFirst).toHaveBeenNthCalledWith(4, { where: { rowId: "row_1", userId: { in: ["user_1"] } } });
});
it("creates, updates, and deletes row permissions through row-scoped predicates", async () => {
vi.mocked(dbMock.rowPermission.create).mockResolvedValueOnce({ id: "rp_1" } as never);
vi.mocked(dbMock.rowPermission.updateMany).mockResolvedValueOnce({ count: 1 } as never);
vi.mocked(dbMock.rowPermission.deleteMany).mockResolvedValue({ count: 1 } as never);
await expect(createRowPermission({ rowId: "row_1", tenantId: "tenant_1", access: "view" })).resolves.toEqual({ id: "rp_1" });
await expect(updateRowPermissionForRow("row_1", "rp_1", { access: "edit" })).resolves.toEqual({ count: 1 });
await expect(deleteRowPermission("row_1")).resolves.toEqual({ count: 1 });
await expect(deleteRowPermissionByIdForRow("row_1", "rp_1")).resolves.toEqual({ count: 1 });
expect(dbMock.rowPermission.create).toHaveBeenCalledWith({ data: { rowId: "row_1", tenantId: "tenant_1", access: "view" } });
expect(dbMock.rowPermission.updateMany).toHaveBeenCalledWith({ where: { id: "rp_1", rowId: "row_1" }, data: { access: "edit" } });
expect(dbMock.rowPermission.deleteMany).toHaveBeenNthCalledWith(1, { where: { rowId: "row_1" } });
expect(dbMock.rowPermission.deleteMany).toHaveBeenNthCalledWith(2, { where: { id: "rp_1", rowId: "row_1" } });
});
});