105 lines
3.3 KiB
TypeScript
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)
|
|
})
|
|
})
|