184 lines
5.2 KiB
TypeScript
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()
|
|
})
|
|
})
|