import test from 'node:test'; import assert from 'node:assert/strict'; import {executeAnalysisJob} from '../server/analysis-job.mjs'; const input={text:'Kaynak metni '.repeat(10),tender:{ikn:'2026/1'},mode:'derin'}; const output=()=>({result:{summary:'Analiz'},model:{label:'QA',provider:'test'}}); test('general analysis pins source and passes cancellation signal to provider',async()=>{ let pinned,request;const signal=new AbortController().signal; const result=await executeAnalysisJob({id:'a',runId:'r',input},{signal,pin:(id,runId,data)=>{pinned=data;return true;},analyze:async data=>{request=data;return output();}}); assert.equal(pinned.text,input.text);assert.equal(request.signal,signal);assert.equal(request.mode,'derin');assert.equal(result.success,true); assert.ok(Number.isFinite(Date.parse(result.analyzedAt))); await assert.rejects(executeAnalysisJob({input:{text:'short'}},{pin:()=>assert.fail(),analyze:()=>assert.fail()}),/en az 40/); }); test('reviewed analysis uses owner source and refuses changed review before or after provider',async()=>{ const reviewed={text:'Sunucu inceleme metni '.repeat(5),fileName:'checked.pdf',humanReview:{textHash:'A'}}; const job={id:'a',runId:'r',email:'owner',input:{...input,reviewedSource:{documentId:'doc',revision:1},humanReview:{textHash:'forged'}}}; let pinned,calls=0; await assert.rejects(executeAnalysisJob(job,{pin:(id,runId,data)=>{pinned=data;return true;},reviewSource:(email,ref,key)=>{ assert.equal(email,'owner');assert.equal(key,'2026/1');calls++;return calls===1?reviewed:{...reviewed,humanReview:{textHash:'B'}}; },analyze:async request=>{assert.equal(request.text,reviewed.text);return output();}}),/analiz sırasında değişti/); assert.equal(pinned.humanReview.textHash,'A'); await assert.rejects(executeAnalysisJob({...job,sourcePinned:true,input:pinned},{reviewSource:()=>({...reviewed,humanReview:{textHash:'B'}}),analyze:()=>assert.fail('stale source must not run')}),/İnceleme değişti/); }); test('cancelled source pin prevents provider call and cancellation after provider rejects result',async()=>{ await assert.rejects(executeAnalysisJob({input},{pin:()=>false,analyze:()=>assert.fail()}),/artık etkin değil/); const controller=new AbortController(); await assert.rejects(executeAnalysisJob({input},{signal:controller.signal,pin:()=>true,analyze:async()=>{controller.abort();return output();}}),{name:'AbortError'}); });