37 lines
2.2 KiB
TypeScript
37 lines
2.2 KiB
TypeScript
/** @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 }
|