Hold stale tender notification retries for review

This commit is contained in:
2026-09-06 13:19:55 +03:00
parent 02625906f2
commit 1fbf77c0ac
6 changed files with 73 additions and 4 deletions
+16
View File
@@ -55,3 +55,19 @@ test('subscription criteria remain plain text in outgoing digest HTML',async()=>
assert.ok(!message.html.includes(criteria));
assert.ok(message.subject.includes(criteria),'the non-HTML subject retains the literal criterion');
});
test('pending digest is held before provider replay when its deadline or eligibility changed',async()=>{
const pinned={...future};
for(const current of [[],[{...future,durum:'İptal'}],[{...future,tarih:'01.09.2026'}],
[{...future,saat:''}],[{...future,tarih:'11.09.2026'}]]) {
let held=0;
const delivery={id:'pending',lease:'test',tenderIds:[future.id],payload:{digest:[pinned],html:'original'}};
const deps={now,configured:()=>true,telegramReady:()=>false,
readSubscriptions:()=>[{id:1,email:'qa',initialized:true,deliveryPending:true}],reserve:()=>delivery,
hold:(job,reason)=>{assert.equal(job,delivery);assert.match(reason,/incelemesi/);held++;},
accepted:()=>assert.fail('must not mark as delivered'),deliverEmail:()=>assert.fail('must not replay stale email')};
const result=await bildirimleriIsle(async()=>({tenders:current}),{},deps);
assert.equal(held,1);assert.equal(result.hata,1);assert.equal(result.gonderilen,0);
assert.equal(delivery.payload.html,'original');
}
});
+14
View File
@@ -85,3 +85,17 @@ for(const action of ['confirmed_sent','skip'])test(`manual outbox ${action} is a
assert.equal(subscriptions.reserveDelivery(sub.id,{to:email,html:'A'},['review-tender']),null);
assert.equal(subscriptions.remove(sub.id,email),true);assert.equal(subscriptions.deliveryQueue().find(row=>row.id===delivery.id).review.action,action);
});
test('source review hold preserves payload and seen state, fences stale workers and retains reason',()=>{
const sub=subscriptions.subscribe('source-review',{konular:['Laboratuvar']})[0];
subscriptions.markBaseline(sub.id,[]);
const first=subscriptions.reserveDelivery(sub.id,{html:'immutable'},['pending-item'],{clock:1000});
const reclaimed=subscriptions.reserveDelivery(sub.id,{html:'changed'},['new-item'],{clock:122000});
assert.equal(subscriptions.holdDelivery(first,'stale worker'),false);
assert.equal(subscriptions.holdDelivery(reclaimed,'Kaynak tarihi değişti; inceleme gerekli.'),true);
assert.equal(subscriptions.failDelivery(reclaimed,'late failure'),false);
assert.throws(()=>subscriptions.acceptDelivery(reclaimed,'late-provider'),/etkin değil/);
assert.deepEqual(subscriptions.reserveDelivery(sub.id,{html:'new'},['new-item'],{clock:123000}),{blocked:true});
assert.deepEqual(subscriptions.list('source-review')[0].sonGorulenler,[]);
assert.equal(subscriptions.deliveryQueue().find(row=>row.id===first.id).error,'Kaynak tarihi değişti; inceleme gerekli.');
});