Audit all supplied requirements across complete long drafts

This commit is contained in:
2026-09-06 10:20:37 +03:00
parent c3ec8c8ba8
commit 673d6c1bc8
7 changed files with 89 additions and 9 deletions
+22
View File
@@ -0,0 +1,22 @@
import {test} from 'node:test';
import assert from 'node:assert/strict';
import {auditOfferInParts} from '../server/offer-audit-parts.mjs';
test('100 requirements and draft evidence beyond 60000 characters survive bounded audit calls',async()=>{
const requirements=Array.from({length:100},(_,i)=>`${i+1}. gereklilik: `+'laboratuvar şartı '.repeat(8));
const draft='Giriş metni. '.repeat(5500)+'SON KANIT: Numune sağlanacaktır.';
let largest=0,seen=new Set();
const result=await auditOfferInParts(requirements,draft,async(group,part)=>{
largest=Math.max(largest,group.join('\n').length+part.length);group.forEach(g=>seen.add(g));
return {maddeler:group.map(g=>({gereklilik:g,durum:part.includes('SON KANIT')?'karsilaniyor':'eksik',kanit:part.includes('SON KANIT')?'SON KANIT: Numune sağlanacaktır.':null}))};
});
assert.equal(seen.size,100);assert.equal(result.maddeler.length,100);assert.equal(result.uyum_yuzde,100);
assert.ok(largest<20000);assert.ok(result.auditReview.draftParts>6);
});
test('failed draft parts remain unresolved instead of producing a complete audit',async()=>{
const result=await auditOfferInParts(['Numune'], 'x'.repeat(11000),async(group,part)=>{
if(part.length<10000)throw Error('Provider failed');
return {maddeler:[{gereklilik:'Numune',durum:'eksik'}]};
});
assert.equal(result.belirsizSayisi,1);assert.equal(result.auditReview.failedCalls,1);
await assert.rejects(auditOfferInParts(['Numune'],'Taslak',async()=>{throw Error('offline');}),/hiçbir bölümü/);
});
+7
View File
@@ -15,3 +15,10 @@ test('audit and draft generation do not swallow explicit source validation error
await assert.rejects(teklifDenetle({ikn:'2026/123',text:' ',taslak:'Sentetik taslak '.repeat(30)}),/kaynak metni boş veya geçersiz/);
await assert.rejects(teklifTaslak({ikn:'2026/123',text:' '}),/kaynak metni boş veya geçersiz/);
});
test('audit requirement collection retains all supplied tender items and explicit conditions',async()=>{
const {gereklilikMetni}=await import('../server/ai-teklif.mjs');
const items=Array.from({length:100},(_,i)=>({ad:`Kalem ${i+1}`,miktar:i+1,birim:'adet'}));
const conditions=Array.from({length:80},(_,i)=>`Koşul ${i+1}`);
const collected=gereklilikMetni({items},conditions,'',true);
assert.equal(collected.length,180);assert.ok(collected.includes('Kalem: Kalem 100 100 adet'));assert.ok(collected.includes('Koşul 80'));
});