import { normalizeMimeType, isInlineSafeMimeType } from './mime'; describe('normalizeMimeType', () => { it.each([ ['report.pdf', 'application/pdf'], ['photo.png', 'image/png'], ['pic.jpeg', 'image/jpeg'], ['pic.jpg', 'image/jpeg'], ['anim.webp', 'image/webp'], ['doc.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'], ['sheet.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'], ['data.csv', 'text/csv'], ['notes.txt', 'text/plain'], ])('maps %s to %s by extension', (filename, expected) => { expect(normalizeMimeType(filename)).toBe(expected); }); it('is case-insensitive for the extension', () => { expect(normalizeMimeType('REPORT.PDF')).toBe('application/pdf'); expect(normalizeMimeType('Photo.JPG')).toBe('image/jpeg'); }); it('ignores a spoofed client mimeType', () => { expect(normalizeMimeType('evil.png', 'text/html')).toBe('image/png'); expect(normalizeMimeType('evil.html', 'image/png')).toBe('application/octet-stream'); }); it('falls back to octet-stream for unknown/unsafe extensions', () => { expect(normalizeMimeType('script.svg')).toBe('application/octet-stream'); expect(normalizeMimeType('payload.html')).toBe('application/octet-stream'); expect(normalizeMimeType('virus.exe')).toBe('application/octet-stream'); expect(normalizeMimeType('noextension')).toBe('application/octet-stream'); expect(normalizeMimeType('')).toBe('application/octet-stream'); }); }); describe('isInlineSafeMimeType', () => { it('allows images and pdf', () => { expect(isInlineSafeMimeType('application/pdf')).toBe(true); expect(isInlineSafeMimeType('image/png')).toBe(true); expect(isInlineSafeMimeType('image/jpeg')).toBe(true); expect(isInlineSafeMimeType('image/webp')).toBe(true); }); it('rejects document, archive and scriptable types', () => { expect(isInlineSafeMimeType('application/octet-stream')).toBe(false); expect(isInlineSafeMimeType('text/html')).toBe(false); expect(isInlineSafeMimeType('image/svg+xml')).toBe(false); expect(isInlineSafeMimeType('text/plain')).toBe(false); expect(isInlineSafeMimeType('')).toBe(false); }); });