gongxiangp2/lib/__tests__/department-permission-batch.test.ts
chenpei 683f86c7af feat: 权限组可挂部门和多人
一组就是一份权限。部门进组当底子,人进组当加餐,能看的取并集。
2026-08-20 12:41:12 +08:00

184 lines
5.2 KiB
TypeScript

/** @jest-environment node */
import {
getDepartmentPermissions,
getUserViewableMaterialTypes,
} from '@/lib/department-permission'
import { prisma } from '@/lib/prisma'
jest.mock('@/lib/prisma', () => ({
prisma: {
user: {
findUnique: jest.fn(),
},
userEmployeeBinding: {
findFirst: jest.fn(),
},
material: {
findMany: jest.fn(),
},
department: {
findMany: jest.fn(),
},
departmentMaterialPermission: {
findMany: jest.fn(),
findUnique: jest.fn(),
},
userPermissionInherit: {
findMany: jest.fn(),
},
materialPermissionPackDepartment: {
findMany: jest.fn(),
},
},
}))
const departments = [
{ id: 'parent', name: '视觉中心', parentId: null },
{ id: 'child', name: '视觉三部', parentId: 'parent' },
{ id: 'linked', name: '共享权限部', parentId: null },
]
function permission(input: Partial<{
department: string
materialType: string
canView: boolean
canDownload: boolean
canShare: boolean
canDownloadSource: boolean
linkedToDepartment: string | null
}>) {
return {
department: '视觉三部',
materialType: '详情模板',
canView: true,
canDownload: false,
canShare: true,
canDownloadSource: false,
linkedToDepartment: null,
...input,
}
}
describe('department permission batch resolver', () => {
beforeEach(() => {
jest.clearAllMocks()
;(prisma.userPermissionInherit.findMany as jest.Mock).mockResolvedValue([])
;(prisma.materialPermissionPackDepartment.findMany as jest.Mock).mockResolvedValue([])
;(prisma.user.findUnique as jest.Mock).mockResolvedValue({ isSuperAdmin: false })
;(prisma.userEmployeeBinding.findFirst as jest.Mock).mockResolvedValue({
employeeProfile: {
departmentPath: '江苏简尚品牌管理有限公司/品牌中心/空间视觉部',
},
})
;(prisma.material.findMany as jest.Mock).mockResolvedValue([
{ materialType: '详情模板' },
])
;(prisma.department.findMany as jest.Mock).mockResolvedValue(departments)
})
test('一次批量查询保持直接权限、关联部门、父部门继承和视频兼容语义', async () => {
;(prisma.departmentMaterialPermission.findMany as jest.Mock).mockResolvedValue([
permission({
department: '视觉三部',
materialType: '标准模型',
canView: false,
canDownload: true,
}),
permission({
department: '视觉三部',
materialType: '详情模板',
canView: false,
linkedToDepartment: '共享权限部',
}),
permission({
department: '共享权限部',
materialType: '详情模板',
canView: true,
canDownload: true,
canDownloadSource: true,
}),
permission({
department: '视觉中心',
materialType: '淘系-逛逛视频',
canView: true,
}),
])
const result = await getDepartmentPermissions(
'视觉三部',
departments,
['标准模型', '详情模板', '种草视频'],
)
expect(result['标准模型']).toMatchObject({
department: '视觉三部',
materialType: '标准模型',
canView: false,
canDownload: true,
})
expect(result['详情模板']).toMatchObject({
department: '视觉三部',
materialType: '详情模板',
canView: true,
canDownload: true,
canDownloadSource: true,
linkedToDepartment: '共享权限部',
})
expect(result['种草视频']).toMatchObject({
department: '视觉三部',
materialType: '种草视频',
canView: true,
linkedToDepartment: '视觉中心',
})
expect(prisma.departmentMaterialPermission.findMany).toHaveBeenCalledTimes(1)
expect(prisma.departmentMaterialPermission.findUnique).not.toHaveBeenCalled()
})
test('关联部门缺少对应配置时保留当前部门自己的权限', async () => {
;(prisma.departmentMaterialPermission.findMany as jest.Mock).mockResolvedValue([
permission({
department: '视觉三部',
materialType: '详情模板',
canView: false,
canDownload: true,
linkedToDepartment: '共享权限部',
}),
])
const result = await getDepartmentPermissions(
'视觉三部',
departments,
['详情模板'],
)
expect(result['详情模板']).toMatchObject({
department: '视觉三部',
canView: false,
canDownload: true,
linkedToDepartment: '共享权限部',
})
})
test('同一用户的并发可见类型查询合并为一轮数据库读取', async () => {
;(prisma.departmentMaterialPermission.findMany as jest.Mock).mockResolvedValue([
permission({
department: '视觉中心',
materialType: '详情模板',
canView: true,
}),
])
const results = await Promise.all(
Array.from({ length: 13 }, () =>
getUserViewableMaterialTypes('视觉三部', 'USER', null, 'user-1'),
),
)
expect(results).toEqual(Array.from({ length: 13 }, () => ['详情模板']))
expect(prisma.user.findUnique).toHaveBeenCalledTimes(1)
expect(prisma.userEmployeeBinding.findFirst).toHaveBeenCalled()
expect(prisma.departmentMaterialPermission.findMany).toHaveBeenCalled()
})
})