Persist versioned document text reviews against source file hashes
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
import {test} from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import fs from 'node:fs';
|
||||
import {tmpdir} from 'node:os';
|
||||
import path from 'node:path';
|
||||
test('document review becomes stale when actual source bytes change; deletion removes private history',async()=>{
|
||||
const dir=fs.mkdtempSync(path.join(tmpdir(),'ihale-review-'));
|
||||
process.env.IHALEIST_USER_DATA_DIR=dir;
|
||||
const store=await import('../server/user-store.mjs');
|
||||
const {documentReview,saveDocumentReview}=await import('../server/document-review.mjs');
|
||||
try {
|
||||
const id=store.saveDocumentFile('owner',{ad:'qa.txt',tur:'ihale',ikn:'2026/1'},Buffer.from('Original source'));
|
||||
const source=documentReview('owner',id);
|
||||
const input={fileHash:source.fileHash,expectedRevision:0,correctedText:'A complete synthetic corrected document text for the test.',note:'All pages compared in this isolated synthetic test.',allPagesCompared:true};
|
||||
saveDocumentReview('owner',id,input);
|
||||
const record=store.getDocument('owner',id);
|
||||
fs.writeFileSync(path.join(store.BELGE_DIR,record.dosya),'Changed source bytes');
|
||||
assert.equal(documentReview('owner',id).stale,true);
|
||||
assert.throws(()=>saveDocumentReview('owner',id,{...input,expectedRevision:1}),e=>e.status===409);
|
||||
store.deleteDocument('owner',id);
|
||||
const db=store.openDb();
|
||||
try {assert.equal(db.prepare('SELECT COUNT(*) n FROM document_text_reviews').get().n,0);}finally{db.close();}
|
||||
} finally {fs.rmSync(dir,{recursive:true,force:true});}
|
||||
});
|
||||
@@ -106,6 +106,21 @@ test('shared item extraction requires an owned tender document and matching tend
|
||||
const retained=await fetch(base+'/api/me/documents/download?id='+tender.data.id,{headers:{Authorization:'Bearer '+token}});
|
||||
assert.equal(retained.status,200);
|
||||
assert.equal(await retained.text(),Buffer.from(body.icerikBase64,'base64').toString());
|
||||
const reviewUrl='/api/me/documents/text-review?id='+tender.data.id;
|
||||
assert.equal((await request(reviewUrl,'GET',null,other)).status,404);
|
||||
const initialReview=await request(reviewUrl);
|
||||
assert.equal(initialReview.data.review,null);
|
||||
const correction={id:tender.data.id,fileHash:initialReview.data.fileHash,expectedRevision:0,
|
||||
correctedText:'Sentetik belge metni tüm sayfalarla karşılaştırıldı. Bu gerçek ihale incelemesi değildir.',
|
||||
note:'Sayfa 1 üzerinde sentetik test karşılaştırması yapıldı.',allPagesCompared:true};
|
||||
assert.equal((await request('/api/me/documents/text-review','POST',{...correction,allPagesCompared:false})).status,400);
|
||||
assert.equal((await request('/api/me/documents/text-review','POST',correction,other)).status,404);
|
||||
const savedReview=await request('/api/me/documents/text-review','POST',correction);
|
||||
assert.equal(savedReview.status,200);assert.equal(savedReview.data.review.revision,1);
|
||||
assert.equal((await request(reviewUrl)).data.review.corrected_text,correction.correctedText);
|
||||
assert.equal((await request('/api/me/documents/text-review','POST',correction)).status,409);
|
||||
assert.equal((await request('/api/me/documents/text-review','POST',{...correction,expectedRevision:1,fileHash:'old-hash'})).status,409);
|
||||
|
||||
assert.equal((await request('/api/kalem/cikar','POST',{ikn:body.ikn,metin:'test'})).status,403);
|
||||
await request('/api/me/documents?id='+company.data.id,'DELETE');
|
||||
await request('/api/me/documents?id='+tender.data.id,'DELETE');
|
||||
|
||||
@@ -15,7 +15,7 @@ after(() => rmSync(dir, { recursive: true, force: true }));
|
||||
test('old volume migrates before indexing, preserves files and migration is repeatable', () => {
|
||||
for (let i = 0; i < 2; i++) {
|
||||
const db = store.openDb();
|
||||
assert.equal(db.prepare('SELECT COUNT(*) n FROM schema_migrations').get().n, 3);
|
||||
assert.equal(db.prepare('SELECT COUNT(*) n FROM schema_migrations').get().n, 4);
|
||||
assert.ok(db.prepare('PRAGMA table_info(belgeler)').all().some(c => c.name === 'ikn'));
|
||||
db.close();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user