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 now=()=>new Date('2026-09-06T10:00:00Z'); test('notification eligibility excludes expired cancelled and unknown deadlines',()=>{ assert.equal(bildirilebilir(future,now()),true); for(const patch of [{durum:'İptal'},{durum:'Sonuçlandı'},{id:'hist-1'},{tarih:'01.09.2026'},{saat:''},{tarih:''}])assert.equal(bildirilebilir({...future,...patch},now()),false); }); test('delivery failure retains pending items and batches acknowledge only included tenders',async()=>{ const rows=Array.from({length:28},(_,i)=>({...future,id:'t-'+i,ikn:'2026/'+i,baslik:'Laboratuvar '+i})); const subscription={id:1,email:'qa@example.test',initialized:true,sonGorulenler:[]}; const sent=[],messages=[];let fail=true; const dependencies={now,configured:()=>true,telegramReady:()=>false,readSubscriptions:()=>[subscription],saveSent:(id,ids)=>{sent.push(ids);subscription.sonGorulenler.push(...ids);},deliverEmail:async message=>{if(fail)throw new Error('provider unavailable');messages.push(message);}}; assert.equal((await bildirimleriIsle(async()=>({tenders:rows}),{},dependencies)).hata,1);assert.equal(sent.length,0); fail=false;assert.equal((await bildirimleriIsle(async()=>({tenders:rows}),{},dependencies)).gonderilen,1);assert.equal(sent[0].length,25);assert.match(messages[0].html,/>Laboratuvar 24Laboratuvar 25({tenders:rows}),{},dependencies);assert.equal(sent[1].length,3);assert.match(messages[1].html,/>Laboratuvar 27({tenders:rows}),{},dependencies);assert.equal(sent.length,2); }); test('baseline is distinct from delivery and overlapping turns do not send twice',async()=>{ let release;const pending=new Promise(resolve=>release=resolve);let baseline=0; const dependencies={now,configured:()=>true,telegramReady:()=>false,readSubscriptions:()=>[{id:1,initialized:false}],saveBaseline:()=>baseline++,deliverEmail:()=>assert.fail('baseline must not send')}; const first=bildirimleriIsle(async()=>{await pending;return {tenders:[future]};},{},dependencies); assert.equal((await bildirimleriIsle(()=>assert.fail(),{},dependencies)).atlandi,'önceki tur sürüyor'); release();await first;assert.equal(baseline,1); });