import { describe, expect, it } from 'vitest' import { ValidationError } from '../errors' import { assertImageFile, assertImageFiles } from './index' const file = (overrides: Partial = {}) => ({ fieldname: 'file', originalname: 'photo.jpg', encoding: '7bit', mimetype: 'image/jpeg', size: 123, buffer: Buffer.from([0xff, 0xd8, 0xff, 0xdb]), stream: undefined as any, destination: '', filename: '', path: '', ...overrides, }) describe('upload assertions', () => { it('accepts a single image file and narrows the route input', () => { expect(() => assertImageFile(file())).not.toThrow() }) it('rejects missing single file uploads with a field-specific error', () => { expect(() => assertImageFile(undefined, 'license image')).toThrow(ValidationError) expect(() => assertImageFile(undefined, 'license image')).toThrow('A license image is required') }) it('rejects non-image single file uploads', () => { expect(() => assertImageFile(file({ mimetype: 'application/pdf', originalname: 'license.pdf' }))).toThrow('MIME type does not match file content') }) it('accepts multiple image files and rejects empty or mixed batches', () => { expect(() => assertImageFiles([file({ originalname: 'front.png', mimetype: 'image/png', buffer: Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]) })])).not.toThrow() expect(() => assertImageFiles([], 'inspection photos')).toThrow('At least one inspection photos file is required') expect(() => assertImageFiles([ file({ originalname: 'front.png', mimetype: 'image/png', buffer: Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]) }), file({ originalname: 'report.pdf', mimetype: 'application/pdf', buffer: Buffer.from('%PDF') }), ])).toThrow('Unsupported or spoofed image file: report.pdf') }) })