gongxiangp2/lib/__tests__/department-permission-source.test.ts

105 lines
3.3 KiB
TypeScript

/** @jest-environment node */
import { canUserDownloadSource } from '@/lib/department-permission'
import { prisma } from '@/lib/prisma'
jest.mock('@/lib/prisma', () => ({
prisma: {
user: {
findUnique: jest.fn(),
},
userEmployeeBinding: {
findFirst: jest.fn(),
},
department: {
findMany: jest.fn(),
},
departmentMaterialPermission: {
findMany: jest.fn(),
findUnique: jest.fn(),
},
userPermissionInherit: {
findMany: jest.fn(),
},
materialPermissionPackDepartment: {
findMany: jest.fn(),
},
},
}))
const departments = [
{ id: 'visual-center', name: '视觉中心', parentId: null },
{ id: 'visual-third', name: '视觉三部', parentId: 'visual-center' },
]
function mockPermissionLookup(records: Record<string, { canDownloadSource: boolean }>) {
;(prisma.departmentMaterialPermission.findMany as jest.Mock).mockResolvedValue(
Object.entries(records).map(([key, record]) => {
const [department, materialType] = key.split(':')
return {
department,
materialType,
canView: true,
canDownload: true,
canShare: true,
canDownloadSource: record.canDownloadSource,
}
}),
)
}
describe('canUserDownloadSource', () => {
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.department.findMany as jest.Mock).mockResolvedValue(departments)
})
test('子部门没有独立配置时继承父部门源文件下载权限', async () => {
mockPermissionLookup({
'视觉中心:详情模板': { canDownloadSource: true },
})
await expect(
canUserDownloadSource('视觉三部', 'USER', null, '详情模板', 'user-1'),
).resolves.toBe(true)
})
test('子部门独立配置优先于父部门源文件下载权限', async () => {
;(prisma.userEmployeeBinding.findFirst as jest.Mock).mockResolvedValue({
employeeProfile: {
departmentPath: '江苏简尚品牌管理有限公司/品牌中心/空间视觉部/视觉三部',
},
})
mockPermissionLookup({
'视觉中心:详情模板': { canDownloadSource: true },
'江苏简尚品牌管理有限公司/品牌中心/空间视觉部/视觉三部:详情模板': { canDownloadSource: false },
})
await expect(
canUserDownloadSource('视觉三部', 'USER', null, '详情模板', 'user-1'),
).resolves.toBe(false)
})
test('任务详情和任务原图分别读取本组对应素材类型的源文件开关', async () => {
mockPermissionLookup({
'视觉中心:任务-详情': { canDownloadSource: true },
'视觉中心:任务-3D原图': { canDownloadSource: false },
})
await expect(
canUserDownloadSource('视觉三部', 'USER', null, '任务-详情', 'user-1'),
).resolves.toBe(true)
await expect(
canUserDownloadSource('视觉三部', 'USER', null, '任务-3D原图', 'user-1'),
).resolves.toBe(false)
})
})