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