Reject malformed notification feeds before state changes
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import test from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import {bildirimleriIsle,bildirilebilir} from '../server/notifier.mjs';
|
||||
const future={tarih:'10.09.2026',saat:'10:00',durum:'Açık',baslik:'Laboratuvar'};
|
||||
const future={id:'future-tender',tarih:'10.09.2026',saat:'10:00',durum:'Açık',baslik:'Laboratuvar'};
|
||||
const now=()=>new Date('2026-09-06T10:00:00Z');
|
||||
test('notification eligibility excludes expired cancelled and unknown deadlines',()=>{
|
||||
assert.equal(bildirilebilir(future,now()),true);
|
||||
@@ -24,3 +24,34 @@ test('baseline is distinct from delivery and overlapping turns do not send twice
|
||||
assert.equal((await bildirimleriIsle(()=>assert.fail(),{},dependencies)).atlandi,'önceki tur sürüyor');
|
||||
release();await first;assert.equal(baseline,1);
|
||||
});
|
||||
|
||||
|
||||
test('unreadable source never establishes baseline or touches delivery state, and next turn recovers',async()=>{
|
||||
let baseline=0;
|
||||
const deps={now,configured:()=>true,readSubscriptions:()=>[{id:1,initialized:false}],
|
||||
saveBaseline:()=>baseline++,reserve:()=>assert.fail('invalid source must not reserve'),
|
||||
accepted:()=>assert.fail('invalid source must not acknowledge'),deliverEmail:()=>assert.fail('must not deliver')};
|
||||
for(const payload of [null,{}, {success:false,tenders:[]},{tenders:{}},{tenders:[null]},
|
||||
{tenders:[{...future,id:''}]},{tenders:[{...future,baslik:''}]},
|
||||
{tenders:[future,future]},{tenders:[{...future,items:{}}]},
|
||||
{tenders:[{...future,items:[null]}]}]) {
|
||||
await assert.rejects(bildirimleriIsle(async()=>payload,{},deps),/kaynağı geçersiz/);
|
||||
assert.equal(baseline,0);
|
||||
}
|
||||
await bildirimleriIsle(async()=>({success:true,tenders:[]}),{},deps);
|
||||
assert.equal(baseline,1,'a valid empty feed is distinct from an unreadable feed');
|
||||
});
|
||||
|
||||
test('subscription criteria remain plain text in outgoing digest HTML',async()=>{
|
||||
let message;
|
||||
const criteria='<a href="https://example.test">Laboratuvar</a>';
|
||||
const deps={now,configured:()=>true,telegramReady:()=>false,
|
||||
readSubscriptions:()=>[{id:1,email:'qa@example.test',initialized:true,anahtar:criteria}],
|
||||
reserve:(id,payload,tenderIds)=>({id:'escaped-test',payload,tenderIds}),accepted:()=>{},failed:()=>{},
|
||||
deliverEmail:async payload=>{message=payload;return {id:'local-test'};}};
|
||||
await bildirimleriIsle(async()=>({tenders:[{...future,baslik:criteria}]}),{},deps);
|
||||
assert.ok(message);
|
||||
assert.ok(message.html.includes('Kriteriniz: Anahtar: <a href="https://example.test">Laboratuvar</a>'));
|
||||
assert.ok(!message.html.includes(criteria));
|
||||
assert.ok(message.subject.includes(criteria),'the non-HTML subject retains the literal criterion');
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user