Persist general specification analysis and expose saved results

This commit is contained in:
2026-09-06 12:44:37 +03:00
parent ca0ed73242
commit bfef768974
11 changed files with 122 additions and 42 deletions
+27
View File
@@ -0,0 +1,27 @@
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'});
});