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ü/); });