gongxiangp2/lib/__tests__/material-assets-authorization.test.ts

83 lines
2.6 KiB
TypeScript

/** @jest-environment node */
import { getServerSession } from 'next-auth'
import { prisma } from '@/lib/prisma'
import { addAsset, getAssetsByMaterialId } from '@/lib/product-package'
import {
DELETE,
GET,
POST,
} from '@/app/api/materials/[id]/assets/route'
jest.mock('next-auth', () => ({ getServerSession: jest.fn() }))
jest.mock('@/lib/auth', () => ({ authOptions: {} }))
jest.mock('@/lib/department-permission', () => ({
canUserViewMaterial: jest.fn().mockResolvedValue(false),
isSuperAdmin: jest.fn().mockResolvedValue(false),
isSystemAdmin: jest.fn(() => false),
}))
jest.mock('@/lib/product-package', () => ({
getAssetsByMaterialId: jest.fn(),
addAsset: jest.fn(),
}))
jest.mock('@/lib/file-cleanup', () => ({ deleteFileIfUnreferenced: jest.fn() }))
jest.mock('@/lib/material-log', () => ({ createMaterialLog: jest.fn() }))
jest.mock('@/lib/material-cleanup', () => ({ normalizeDisplayImages: jest.fn(() => []) }))
jest.mock('@/lib/prisma', () => ({
prisma: {
material: {
findUnique: jest.fn(),
update: jest.fn(),
},
materialAsset: {
findUnique: jest.fn(),
findFirst: jest.fn(),
},
$transaction: jest.fn(),
},
}))
describe('material assets route authorization', () => {
beforeEach(() => {
jest.clearAllMocks()
;(getServerSession as jest.Mock).mockResolvedValue({
user: { id: 'user-2', role: 'USER', department: '设计部' },
})
;(prisma.material.findUnique as jest.Mock).mockResolvedValue({
id: 'material-1',
userId: 'user-1',
materialType: '任务-详情',
previewUrl: '',
zipFilePath: '',
zipFileName: '',
zipFileSize: BigInt(0),
displayImages: [],
})
})
test('无查看权限的用户不得读取资产列表', async () => {
const response = await GET({} as any, { params: { id: 'material-1' } })
expect(response.status).toBe(403)
expect(getAssetsByMaterialId).not.toHaveBeenCalled()
})
test('非所有者不得添加资产', async () => {
const response = await POST({
json: jest.fn().mockResolvedValue({ assetType: 'preview', fileUrl: 'uploads/a.webp' }),
} as any, { params: { id: 'material-1' } })
expect(response.status).toBe(403)
expect(addAsset).not.toHaveBeenCalled()
})
test('非所有者不得删除资产', async () => {
const response = await DELETE({
url: 'http://localhost/api/materials/material-1/assets?assetId=asset-1',
} as any, { params: { id: 'material-1' } })
expect(response.status).toBe(403)
expect(prisma.materialAsset.findUnique).not.toHaveBeenCalled()
})
})