import { describe, expect, it } from 'vitest' import { detectDelimiter, parseDelimitedText, useFileImport, validateImportFile, } from '../../composables/useFileImport' describe('file import helpers', () => { it('parses quoted CSV fields', () => { const parsed = parseDelimitedText('name,notes\nSample A,"hello, world"\n') expect(parsed.delimiter).toBe(',') expect(parsed.columns).toEqual(['name', 'notes']) expect(parsed.rows).toEqual([{ name: 'Sample A', notes: 'hello, world' }]) }) it('detects TSV data', () => { expect(detectDelimiter('name\tvalue\nA\t1')).toBe('\t') }) it('validates accepted extensions and size', () => { const file = new File(['abc'], 'plate.csv', { type: 'text/csv' }) expect(() => validateImportFile(file, { accept: '.csv', maxSizeBytes: 10 })).not.toThrow() expect(() => validateImportFile(file, { accept: '.xlsx' })).toThrow('Unsupported file type') expect(() => validateImportFile(file, { maxSizeBytes: 1 })).toThrow('File is too large') }) it('reads and parses a file through useFileImport', async () => { const file = new File(['name\nA\n'], 'samples.csv', { type: 'text/csv' }) const importer = useFileImport({ accept: '.csv', parse: text => parseDelimitedText(text), }) const result = await importer.importFile(file) expect(importer.fileName.value).toBe('samples.csv') expect(result.rows).toEqual([{ name: 'A' }]) expect(importer.loading.value).toBe(false) }) })