gongxiangp2/components/upload/file-upload-handlers.test.ts

86 lines
2.7 KiB
TypeScript

import { chunkUpload } from '@/lib/chunk-upload'
import {
buildFormData,
uploadSingleFile,
type CompletedChunkUploadReference,
} from '@/components/upload/file-upload-handlers'
import { CHUNK_THRESHOLD } from '@/components/upload/upload-constants'
jest.mock('@/lib/chunk-upload', () => ({
chunkUpload: jest.fn(),
}))
const buildFormDataDefaults = {
previewImages: [],
displayImage: null,
modelImages: [],
zipFile: null,
productModel: 'GBGJ-DNZ0385',
materialType: '抖音-千川素材',
categoryName: '顾家',
sceneName: '书房',
platformName: '',
productCategoryName: '电脑桌',
renderer: '',
}
describe('file-upload-handlers 分片建档参数', () => {
beforeEach(() => {
jest.clearAllMocks()
})
test('最终建档请求同时携带合并路径、原文件名和 uploadId', () => {
const completedChunkUpload: CompletedChunkUploadReference = {
existingFilePath: 'uploads/temp/upload-video-1/merged-video.mp4',
originalFileName: '荷风-8.4-文案542.mp4',
uploadId: 'upload-video-1',
}
const formData = buildFormData({
...buildFormDataDefaults,
completedChunkUpload,
})
expect(formData.get('existingFilePath')).toBe(completedChunkUpload.existingFilePath)
expect(formData.get('originalFileName')).toBe(completedChunkUpload.originalFileName)
expect(formData.get('uploadId')).toBe(completedChunkUpload.uploadId)
expect(formData.get('zipFile')).toBeNull()
})
test('小文件直传只携带原文件,不伪造分片会话字段', () => {
const file = new File(['video'], 'video.mp4', { type: 'video/mp4' })
const formData = buildFormData({
...buildFormDataDefaults,
zipFile: file,
})
expect(formData.get('zipFile')).toBe(file)
expect(formData.get('existingFilePath')).toBeNull()
expect(formData.get('originalFileName')).toBeNull()
expect(formData.get('uploadId')).toBeNull()
})
test('分片完成结果缺少 uploadId 时在发起建档前阻止上传', async () => {
;(chunkUpload as jest.Mock).mockResolvedValue({
existingFilePath: 'uploads/temp/upload-video-1/merged-video.mp4',
})
const file = new File(['video'], 'video.mp4', { type: 'video/mp4' })
Object.defineProperty(file, 'size', { value: CHUNK_THRESHOLD })
await expect(uploadSingleFile({
zipFile: file,
previewImages: [],
displayImage: null,
modelImages: [],
productModel: 'GBGJ-DNZ0385',
materialType: '抖音-千川素材',
categoryName: '顾家',
sceneName: '书房',
platformName: '',
productCategoryName: '电脑桌',
renderer: '',
onProgress: jest.fn(),
})).rejects.toThrow('分片上传结果不完整,请重新上传')
})
})