feat: review uncertain weekly brief deliveries with audit history

This commit is contained in:
2026-09-06 14:37:32 +03:00
parent 99a7f2f571
commit 7a01e4bed7
11 changed files with 141 additions and 15 deletions
+22
View File
@@ -265,3 +265,25 @@ test('weekly brief preference loads without feed preview and changes only with a
assert.equal((await request('/api/me/brief','GET',null,other)).data.kapali,false);
assert.equal((await request('/api/me/brief','POST',{kapali:false,revision:saved.data.revision})).status,200);
});
test('weekly brief review is admin-only and persists evidence without sending messages',async()=>{
const route='/api/admin/brief/outbox';
assert.equal((await request(route,'GET',null,null)).status,401);
assert.equal((await request(route)).status,403);
assert.equal((await request(route,'POST',{id:'x',action:'skip',note:'Yetkisiz işlem kontrolü.'})).status,403);
const admin=signToken({email:'weekly-admin@example.test',name:'Admin',isAdmin:true});
const {createBriefOutbox}=await import('../server/brief-outbox.mjs');
const box=createBriefOutbox(dir),batch=box.prepare('2026-09-07','weekly-test@example.test',[{channel:'email',to:'weekly-test@example.test'}]);
box.hold(box.claim(batch.id,0),'Test sonucu belirsiz');
const list=await request(route,'GET',null,admin);
assert.equal(list.status,200);assert.equal(list.data.deliveries.length,1);
const id=list.data.deliveries[0].id;
assert.equal((await request(route,'DELETE',null,admin)).status,405);
const input={id,action:'confirmed_sent',providerId:'test-provider-receipt',confirmed:true,note:'İzole test sağlayıcı kaydı doğrulandı.'};
assert.equal((await request(route,'POST',{...input,confirmed:false},admin)).status,400);
assert.equal((await request(route,'POST',input,admin)).status,200);
assert.equal((await request(route,'POST',input,admin)).status,409);
const saved=(await request(route,'GET',null,admin)).data.deliveries[0];
assert.equal(saved.review.actor,'weekly-admin@example.test');assert.equal(saved.providerId,input.providerId);
assert.equal(saved.state,'sent_manual');
});