Files
ihaleist/tests/preparation-summary.test.mjs
T
hikmettan 821df474ea
Quality gates / test-build (push) Canceled after 0s
Quality gates / container (push) Canceled after 0s
hazirlik ozetinde belge sorumlularini goster
2026-09-06 21:33:30 +03:00

45 lines
3.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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')));
});