83 lines
2.6 KiB
TypeScript
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()
|
|
})
|
|
})
|