Preserve full draft sections and disclose missing requested content
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
import {test} from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import {qualifyOfferDraft} from '../server/offer-draft.mjs';
|
||||
const requested=['Kapak','Teknik','Ekler'];
|
||||
test('missing sections are explicit editable placeholders, not a complete dossier',()=>{
|
||||
const out=qualifyOfferDraft({bolumler:[{baslik:'Kapak',icerik:'Kapak metni'}]},requested);
|
||||
assert.equal(out.draftReview.status,'partial');
|
||||
assert.deepEqual(out.draftReview.missingSections,['Teknik','Ekler']);
|
||||
assert.match(out.bolumler[1].icerik,/DOLDURUN/);assert.equal(out.bolumler[0].icerik,'Kapak metni');
|
||||
});
|
||||
test('long sections retain their last conditions and requested section order',()=>{
|
||||
const text='Teknik şart '.repeat(1500)+'SON KOŞUL: Numune zorunludur.';
|
||||
const out=qualifyOfferDraft({bolumler:[{baslik:'Ekler',icerik:'Ekler metni'},{baslik:'Teknik',icerik:text},{baslik:'Kapak',icerik:'Kapak'}]},requested);
|
||||
assert.deepEqual(out.bolumler.map(row=>row.baslik),requested);
|
||||
assert.equal(out.bolumler[1].icerik,text);assert.equal(out.draftReview.status,'draft');
|
||||
});
|
||||
test('unexpected content is preserved but never substitutes for a requested section',()=>{
|
||||
const out=qualifyOfferDraft({bolumler:[{baslik:'Başka bölüm',icerik:'Ek içerik'}]},requested);
|
||||
assert.equal(out.draftReview.status,'partial');assert.equal(out.draftReview.missingSections.length,3);
|
||||
assert.equal(out.bolumler.at(-1).icerik,'Ek içerik');
|
||||
});
|
||||
test('malformed or repeated sections cannot silently overwrite user-visible content',()=>{
|
||||
for(const bolumler of [[],[null],[{baslik:'Kapak',icerik:{text:'invalid'}}],[{baslik:'Kapak',icerik:'a'},{baslik:'Kapak',icerik:'b'}]])
|
||||
assert.throws(()=>qualifyOfferDraft({bolumler},requested));
|
||||
});
|
||||
Reference in New Issue
Block a user