import {test} from 'node:test'; import assert from 'node:assert/strict'; import {draftReviewLabel,validateOfferResponse} from '../src/services/offerResponse.js'; import {qualifyOfferDraft} from '../server/offer-draft.mjs'; import {qualifyOfferAudit} from '../server/offer-audit.mjs'; import {qualifyQuestionAnswer} from '../server/document-question.mjs'; test('all three server output contracts can be rendered by the client',()=>{ const draft={success:true,...qualifyOfferDraft({bolumler:[{baslik:'Kapak',icerik:'Taslak metni'}]},['Kapak','Ekler'])}; const audit={success:true,...qualifyOfferAudit({maddeler:[{gereklilik:'Numune',durum:'eksik'}]},['Numune'],'Taslak')}; const answer={success:true,...qualifyQuestionAnswer({cevap:'Numune zorunlu [1].'},[{n:1,icerik:'Numune zorunlu.'}])}; for(const [url,data] of [['teklif-taslak',draft],['teklif-denetim',audit],['belge-sor',answer]]) assert.equal(validateOfferResponse('/api/ai/'+url,data),data); }); test('nested fields that would crash the view are rejected at the boundary',()=>{ for(const [url,data] of [ ['belge-sor',{cevap:'Yanıt',kaynaklar:{}}], ['teklif-denetim',{maddeler:[{gereklilik:'Numune',durum:'unexpected'}],eksikler:[],uyum_yuzde:100,belirsizSayisi:0}], ['teklif-taslak',{bolumler:[{baslik:'Kapak',icerik:{text:'invalid'}}]}]]) assert.throws(()=>validateOfferResponse('/api/ai/'+url,{success:true,...data}),/beklenen biçimde/); }); test('partial draft output carries an explicit non-official offer warning',()=>{ assert.equal(draftReviewLabel({status:'partial'}),'EKSİK TASLAK — TEKLİF OLARAK KULLANILAMAZ'); assert.equal(draftReviewLabel({status:'draft'}),'Taslak — kullanıcı kontrolü gerekli'); });