82 lines
3.5 KiB
TypeScript
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" } });
|
|
});
|
|
});
|