Preserve complete input in multi-part offer draft generation

This commit is contained in:
2026-09-06 10:39:42 +03:00
parent 4c0289cfba
commit 1c0b48655e
4 changed files with 92 additions and 7 deletions
+32
View File
@@ -23,3 +23,35 @@ test('malformed or repeated sections cannot silently overwrite user-visible cont
for(const bolumler of [[],[null],[{baslik:'Kapak',icerik:{text:'invalid'}}],[{baslik:'Kapak',icerik:'a'},{baslik:'Kapak',icerik:'b'}]])
assert.throws(()=>qualifyOfferDraft({bolumler},requested));
});
const {draftOfferInParts}=await import('../server/offer-draft-parts.mjs');
test('long draft input processes every character and retains late section text in deterministic order',async()=>{
const source='Kalem ve firma şartları. '.repeat(2100)+'SON KALEM 101: cihaz kurulum yükümlülüğü';
const seen=[];
const out=await draftOfferInParts(source,requested,async(part)=>{
seen.push(part);
return {bolumler:requested.map(baslik=>({baslik,icerik:part.text}))};
});
assert.equal(seen.sort((a,b)=>a.index-b.index).map(p=>p.text).join(''),source);
assert.ok(seen.every(p=>p.text.length<=16000));
assert.match(out.bolumler[1].icerik,/SON KALEM 101/);
assert.equal(out.draftReview.status,'partial');
assert.equal(out.draftReview.parts.at(-1).end,source.length);
});
test('failed draft parts remain explicit, not silently omitted or marked complete',async()=>{
const out=await draftOfferInParts('X'.repeat(40000),requested,async part=>{
if(part.index===1)throw new Error('provider unavailable');
return {bolumler:requested.map(baslik=>({baslik,icerik:'Useful draft'}))};
});
assert.deepEqual(out.draftReview.failedParts,[2]);
assert.equal(out.draftReview.parts[1].status,'failed');
assert.match(out.bolumler[0].icerik,/üretilemedi/);
assert.equal(out.draftReview.status,'partial');
});
test('draft cancellation stops subsequent batches',async()=>{
const controller=new AbortController();let calls=0;
await assert.rejects(draftOfferInParts('X'.repeat(80000),requested,async()=>{
calls++;controller.abort();return {bolumler:[{baslik:'Kapak',icerik:'draft'}]};
},{signal:controller.signal}),{name:'AbortError'});
assert.ok(calls<=2);
});