import test from 'node:test'; import assert from 'node:assert/strict'; import {preparationSummary} from '../src/services/preparationSummary.js'; import {documentKey,documentRevision} from '../src/services/preparationChecks.js'; const now=new Date('2026-09-06T10:00:00Z'); const tender={id:'test',ikn:'2026/1',tarih:'10.09.2026',saat:'10:00',baslik:'Lab',items:[{ad:'Kit',miktar:2,birim:'adet'}]}; const vault={loading:false,error:null,documents:[]}; test('five saved dossiers retain distinct owners, missing documents and actionable targets',()=>{ const rows=Array.from({length:5},(_,i)=>({...tender,id:`t-${i}`,ikn:`2026/${i}`,atananPersonel:`Sorumlu ${i}`,bidDraft:{manualDocuments:[{document:`Belge ${i}`}],teklifTuru:'birim'}})); rows.forEach((row,i)=>{ const result=preparationSummary(row,vault,now); assert.equal(result.owner,`Sorumlu ${i}`); assert.ok(result.documentIssues.some(text=>text.includes(`Belge ${i}`))); assert.equal(result.next.target,'source'); assert.ok(result.issues.some(issue=>issue.target.startsWith('price:'))); assert.ok(result.issues.some(issue=>issue.target==='firm:vergiNo')); }); }); test('document revision and vault failures invalidate a previously verified saved document',()=>{ const doc={document:'Ürün belgesi'}; const file={id:'f',tur:'firma',olusturma:'2026-09-01',boyut:20,son_kullanma:'2026-12-31'}; const draft={manualDocuments:[doc],checks:{documents:{[documentKey(doc)]:{status:'verified',evidence:'Madde 2',documentId:'f',documentRevision:documentRevision(file)}}}}; assert.deepEqual(preparationSummary({...tender,bidDraft:draft},{...vault,documents:[file]},now).documentIssues,[]); assert.ok(preparationSummary({...tender,bidDraft:draft},{...vault,documents:[{...file,boyut:21}]},now).documentIssues.some(text=>text.includes('değişti'))); assert.ok(preparationSummary({...tender,bidDraft:draft},{...vault,error:'offline'},now).documentIssues.some(text=>text.includes('doğrulanamadı'))); }); test('preparation summary exposes document owners without hiding unassigned work',()=>{ const doc={document:'Yetki belgesi'}; const assigned={manualDocuments:[doc],checks:{documents:{[documentKey(doc)]:{owner:' Uyum ekibi '}}}}; const missing={manualDocuments:[doc],checks:{documents:{}}}; assert.deepEqual(preparationSummary({...tender,bidDraft:assigned},vault,now).documentOwners,[{document:'Yetki belgesi',owner:'Uyum ekibi'}]); assert.deepEqual(preparationSummary({...tender,bidDraft:missing},vault,now).documentOwners,[{document:'Yetki belgesi',owner:'Atanmadı'}]); }); test('expired source takes priority over completion or manually moved Kanban status',()=>{ const summary=preparationSummary({...tender,tarih:'01.09.2026',kanbanStatus:'teklif_verildi'},vault,now); assert.match(summary.next.text,/zamanı geçti/); assert.equal(summary.next.target,'source'); assert.equal(summary.owner,'Atanmadı'); }); test('malformed document response is treated as empty instead of crashing the summary',()=>{ assert.doesNotThrow(()=>preparationSummary(tender,{loading:false,error:null,documents:null},now)); const summary=preparationSummary(tender,{loading:false,error:null,documents:null},now); assert.ok(summary.documentIssues.some(text=>text.includes('belge'))); });