import { describe, it, expect } from 'vitest' import { composeTemplate } from '../../../composables/autoGroup/template' import type { ClassSchema, SampleClass } from '../../../types/auto-group' describe('composeTemplate', () => { const samples = ['s_1', 's_2,with_comma', 's_3'] const classes: SampleClass[] = [ { kind: 'biological', subKind: 'Tissues', label: 'Biological / Tissues', members: [0, 1, 2], classTagPositions: [], disposition: 'group', }, ] const schema: ClassSchema = { classKind: 'biological', subKind: 'Tissues', columns: [ { index: 0, name: 'Tissue', sourceIndices: [0], uniqueValues: ['Kidney', 'Liver'], cardinality: 2, role: 'factor' }, ], groupBy: [0], } it('blank mode emits one row per sample with sample_name and header-only suggested columns', () => { const { content } = composeTemplate(samples, null, null, { mode: 'blank', format: 'csv' }) const lines = content.split('\n') expect(lines[0]).toBe('sample_name,group,class,replicate,notes') expect(lines[1].startsWith('s_1,')).toBe(true) expect(lines.length).toBe(samples.length + 1) }) it('quotes values containing commas per RFC 4180', () => { const { content } = composeTemplate(samples, null, null, { mode: 'blank', format: 'csv' }) expect(content).toContain('"s_2,with_comma"') }) it('prefilled mode includes class label and schema columns', () => { const tokenized = [['Kidney'], ['Kidney'], ['Liver']] const { content } = composeTemplate(samples, [schema], classes, { mode: 'prefilled', format: 'csv', tokenizedSamples: tokenized, }) const lines = content.split('\n') expect(lines[0]).toBe('sample_name,class,Tissue,group,notes') expect(lines[1]).toContain('Biological / Tissues') expect(lines[1]).toContain('Kidney') }) it('TSV format uses tab separator and skips quoting commas', () => { const { content } = composeTemplate(samples, null, null, { mode: 'blank', format: 'tsv' }) expect(content.split('\n')[2].split('\t')[0]).toBe('s_2,with_comma') }) it('uses experiment code in filename when provided', () => { const { filename } = composeTemplate(samples, null, null, { mode: 'blank', format: 'csv', experimentCode: 'EXP-042', }) expect(filename).toMatch(/^EXP-042_metadata_\d{4}-\d{2}-\d{2}\.csv$/) }) it('falls back to default filename without experiment code', () => { const { filename } = composeTemplate(samples, null, null, { mode: 'blank', format: 'csv' }) expect(filename).toMatch(/^sample_metadata_\d{4}-\d{2}-\d{2}\.csv$/) }) })