import {describe, expect, it} from 'vitest'; import {parseCsv, parseTextList} from './imports.js'; describe('parseTextList', () => { it('takes one title per line and skips empty lines', () => { expect(parseTextList(' Hades \r\n\nCeleste\n')).toEqual([{title: 'Hades'}, {title: 'Celeste'}]); expect(parseTextList('x'.repeat(150))[0].title).toHaveLength(100); }); }); describe('parseCsv', () => { it('reads the known columns, quotes and hours', () => { const {rows} = parseCsv('Name,Platform,Hours,Status\n' + '"Hades, the game",PS5,"1,5",playing\r\n' + '"The ""Best"" Game",,,\n' + ',PC,3,\n'); expect(rows).toEqual([ {title: 'Hades, the game', platform: 'PS5', playtimeMinutes: 90, status: 'PLAYING'}, {title: 'The "Best" Game', platform: null, playtimeMinutes: null, status: null}, ]); }); it('takes the delimiter the header has most of, and minutes', () => { const {rows} = parseCsv('title;minutes;status\nCeleste;125;unknown\n'); expect(rows).toEqual([{title: 'Celeste', platform: null, playtimeMinutes: 125, status: null}]); }); it('keeps a line break inside quotes', () => { expect(parseCsv('game\n"Two\nLines"\n').rows[0].title).toBe('Two\nLines'); }); it('keeps a quote inside an unquoted field as a character', () => { expect(parseCsv('title,platform\n12" Barbarian,PC\nHades,PS5\n').rows.map((row) => row.title)) .toEqual(['12" Barbarian', 'Hades']); }); it('needs a title column', () => { expect(parseCsv('platform,hours\nPC,1\n')).toEqual({error: 'IMPORT.CSV_NO_TITLE'}); }); });