/** @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) { ;(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) }) })