import { describe, expect, it } from 'vitest'; import { parseCsvDocument } from '../../src/importers/csv-importer'; import { recognizeImportDocument } from '../../src/recognition/recognition-engine'; import { sourceMetadata } from '../importers/import-source-fixtures'; describe('source recognition', () => { it('recognizes Purple Knight from independent filename, schema and value signals', () => { const text = [ 'Name;Short Name;SI Version;Severity;Weight;Category;Result', 'Synthetic indicator;SYN-001;1;High;10;Identity;IOEs found' ].join('\n'); const document = parseCsvDocument(sourceMetadata('PurpleKnight-results.csv', text.length), text); const recognition = recognizeImportDocument(document); expect(recognition.source.selected).toMatchObject({ toolId: 'purple-knight', toolName: 'PurpleKnight', confidence: { level: 'high' } }); expect(recognition.source.selected.evidence.length).toBeGreaterThanOrEqual(3); expect(recognition.source.selected.confidence.reasons).toEqual( expect.arrayContaining([expect.stringContaining('Dateiname')]) ); }); it('uses the unknown fallback when no tool signal reaches the minimum confidence', () => { const text = 'Alpha;Beta\none;two'; const document = parseCsvDocument(sourceMetadata('table.csv', text.length), text); const recognition = recognizeImportDocument(document); expect(recognition.source).toMatchObject({ decisionSource: 'fallback', requiresConfirmation: false, selected: { toolId: 'unknown', confidence: { level: 'unknown', score: 0 } } }); expect(recognition.fields.every(field => field.appliedRole === 'additional')).toBe(true); }); });