import { matchesMimePattern, truncateFilename, getFileIcon, resolveFileCategories } from './file-utils'; describe('matchesMimePattern', () => { test('matches exact MIME type', () => { expect(matchesMimePattern('text/csv', ['text/csv'])).toBe(true); }); test('matches wildcard pattern', () => { expect(matchesMimePattern('image/png', ['image/*'])).toBe(true); expect(matchesMimePattern('image/jpeg', ['image/*'])).toBe(true); }); test('does not match wrong wildcard pattern', () => { expect(matchesMimePattern('text/csv', ['image/*'])).toBe(false); }); test('matches */* pattern', () => { expect(matchesMimePattern('text/csv', ['*/*'])).toBe(true); expect(matchesMimePattern('application/pdf', ['*/*'])).toBe(true); }); test('rejects non-matching exact types', () => { expect(matchesMimePattern('text/plain', ['text/csv'])).toBe(false); }); test('matches when any pattern matches', () => { expect(matchesMimePattern('text/csv', ['image/*', 'text/csv'])).toBe(true); }); test('returns false for empty patterns array', () => { expect(matchesMimePattern('text/csv', [])).toBe(false); }); test('matches Excel MIME types', () => { expect( matchesMimePattern('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', [ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', ]), ).toBe(true); expect(matchesMimePattern('application/vnd.ms-excel', ['application/vnd.ms-excel'])).toBe(true); }); test('matches PDF MIME type', () => { expect(matchesMimePattern('application/pdf', ['application/pdf'])).toBe(true); }); test('matches Word MIME types', () => { expect(matchesMimePattern('application/msword', ['application/msword'])).toBe(true); expect( matchesMimePattern( 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'], ), ).toBe(true); }); test('matches application/* wildcard for document types', () => { expect(matchesMimePattern('application/pdf', ['application/*'])).toBe(true); expect(matchesMimePattern('application/msword', ['application/*'])).toBe(true); expect( matchesMimePattern('application/vnd.openxmlformats-officedocument.wordprocessingml.document', [ 'application/*', ]), ).toBe(true); }); }); describe('resolveFileCategories', () => { test('resolves image category to image/* pattern', () => { const patterns = resolveFileCategories(['image']); expect(patterns).toContain('image/*'); }); test('resolves text category to document MIME types', () => { const patterns = resolveFileCategories(['text']); expect(patterns).toContain('text/plain'); expect(patterns).toContain('text/csv'); expect(patterns).toContain('application/pdf'); expect(patterns).toContain('application/msword'); expect(patterns).toContain('application/vnd.openxmlformats-officedocument.wordprocessingml.document'); expect(patterns).toContain('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); expect(patterns).toContain('application/json'); }); test('resolves both categories together', () => { const patterns = resolveFileCategories(['image', 'text']); expect(patterns).toContain('image/*'); expect(patterns).toContain('application/pdf'); expect(patterns).toContain('text/plain'); }); test('returns empty array for empty input', () => { expect(resolveFileCategories([])).toEqual([]); }); }); describe('truncateFilename', () => { test('returns short names unchanged', () => { expect(truncateFilename('data.csv')).toBe('data.csv'); }); test('truncates long names preserving extension', () => { const result = truncateFilename('very-long-filename-here.csv', 20); expect(result).toHaveLength(20); expect(result).toMatch(/\.csv$/); expect(result).toContain('...'); }); test('handles names without extension', () => { const result = truncateFilename('averyverylongfilename', 10); expect(result).toHaveLength(10); expect(result).toContain('...'); }); test('handles custom maxLength', () => { expect(truncateFilename('short.txt', 50)).toBe('short.txt'); }); }); describe('getFileIcon', () => { test('returns file icon for csv', () => { expect(getFileIcon('text/csv')).toBe('file'); }); test('returns file icon for xlsx', () => { expect( getFileIcon('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'), ).toBe('file'); }); test('returns file icon for plain text', () => { expect(getFileIcon('text/plain')).toBe('file'); }); test('returns file icon for PDF', () => { expect(getFileIcon('application/pdf')).toBe('file'); }); test('returns file icon for Word doc', () => { expect(getFileIcon('application/msword')).toBe('file'); }); test('returns file icon for Word docx', () => { expect( getFileIcon('application/vnd.openxmlformats-officedocument.wordprocessingml.document'), ).toBe('file'); }); });