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('分片上传结果不完整,请重新上传') }) })