/** @jest-environment node */ import { loadDepartmentGroupPacks } from '@/lib/permission-groups' import { prisma } from '@/lib/prisma' jest.mock('@/lib/prisma', () => ({ prisma: { materialPermissionPackDepartment: { findMany: jest.fn() } } })) const item = { materialType: '任务-详情', canView: true, canDownload: true, canShare: true, canDownloadSource: true, canEditAssets: true, canAccessPrivate: true } describe('权限组鉴权使用绑定部门的当前身份', () => { beforeEach(() => jest.clearAllMocks()) test('绑定快照未改名也能命中当前路径,包括编辑与私密权限', async () => { ;(prisma.materialPermissionPackDepartment.findMany as jest.Mock).mockResolvedValue([{ departmentPath: '公司/旧部门', organizationUnit: { path: '公司/新中心/新部门', isActive: true }, pack: { items: [item] }, }]) const packs = await loadDepartmentGroupPacks(['公司/新中心/新部门/小组']) expect(packs.get('公司/新中心/新部门/小组')?.['任务-详情']).toEqual(itemWithoutType()) expect(prisma.materialPermissionPackDepartment.findMany).toHaveBeenCalledWith(expect.objectContaining({ where: { organizationUnit: { isActive: true, path: { in: ['公司', '公司/新中心', '公司/新中心/新部门', '公司/新中心/新部门/小组'] } } }, })) }) test('部门移动后旧树上的人不能继续借用旧路径获得权限', async () => { ;(prisma.materialPermissionPackDepartment.findMany as jest.Mock).mockResolvedValue([{ departmentPath: '公司/旧部门', organizationUnit: { path: '公司/新部门', isActive: true }, pack: { items: [item] }, }]) expect((await loadDepartmentGroupPacks(['公司/旧部门'])).size).toBe(0) }) test.each([null, { path: '公司/旧部门', isActive: false }])('失效身份即使路径同名也不授予权限', async (unit) => { ;(prisma.materialPermissionPackDepartment.findMany as jest.Mock).mockResolvedValue([{ departmentPath: '公司/旧部门', organizationUnit: unit, pack: { items: [item] }, }]) expect((await loadDepartmentGroupPacks(['公司/旧部门'])).size).toBe(0) }) }) function itemWithoutType() { const { materialType: _, ...flags } = item; return flags }