import test from 'node:test'; import assert from 'node:assert/strict'; import {qualifyAnalysis} from '../server/analysis-quality.mjs'; test('malformed nested model fields cannot reach preparation screens',()=>{ for(const result of [ {itemsAndSpecs:[null]}, {itemsAndSpecs:[{name:{text:'Kit'}}]}, {itemsAndSpecs:[{name:'Kit',quantity:'2 adet',keySpecs:'steril'}]}, {documentChecklist:[{document:'ÜTS',mandatory:'false'}]}, {criticalRequirements:[{text:'Numune'}]}, {deadlines:'120 gün'}, {roadmap:[{action:'Hazırla',step:'bir'}]}, {bidAnalysis:{recommendedBid:'1000'}}, {bidAnalysis:{winProbability:101}}, {citations:[null]}, {summary:{text:'Analiz'}} ]) assert.throws(()=>qualifyAnalysis(result), /biçim/); }); test('missing item quantity or document obligation keeps analysis partial',()=>{ const out=qualifyAnalysis({itemsAndSpecs:[{name:'Kit'}],documentChecklist:[{document:'ÜTS'}]}); assert.equal(out.sourceReview.status,'partial'); assert.ok(out.sourceReview.issues.some(v=>v.includes('miktar/birim'))); assert.ok(out.sourceReview.issues.some(v=>v.includes('zorunluluk'))); }); test('truncated input and repaired output are partial, never complete analysis',()=>{ const r=qualifyAnalysis({itemsAndSpecs:[{name:'Kit',quantity:'2 adet'}]},{text:'a'.repeat(100),limit:50,expectedItems:100,repaired:true}); assert.equal(r.sourceReview.status,'partial');assert.equal(r.sourceReview.issues.length,3); assert.equal(r.sourceReview.analyzedCharacters,50); assert.equal(r.sourceReview.sections.documentChecklist,'not_extracted'); }); test('source versions change with content and empty sections do not claim absence',()=>{ const a=qualifyAnalysis({documentChecklist:[]},{text:'kaynak A'}); const b=qualifyAnalysis({documentChecklist:[]},{text:'kaynak B'}); assert.notEqual(a.documentVersion,b.documentVersion); assert.equal(a.sourceReview.status,'review_required'); assert.equal(a.sourceReview.sections.documentChecklist,'not_extracted'); assert.throws(()=>qualifyAnalysis({itemsAndSpecs:'kalem yok'})); });