Skip to content

Repository files, collaboration, releases and project activity.

ARCHFORGE HISTORY

Blame · tests/subscriptions.test.js

Branch main · the Commit author is not necessarily a verified ArchForge account.

e59b7f7cc6archadmin2026-10-111 'use strict';
e59b7f7cc6archadmin2026-10-112 const test=require('node:test'),assert=require('node:assert/strict'),crypto=require('node:crypto');
e59b7f7cc6archadmin2026-10-113 const {openDatabase,one,rows}=require('../src/database');const {makeApp}=require('../src/server');const {notifyQueue}=require('../src/notifications');
e59b7f7cc6archadmin2026-10-114 const cfg={key:crypto.randomBytes(32).toString('hex'),dbPath:':memory:',publicUrl:'https://status.archforge.nl/',website:'https://archforge.nl/',websiteHost:'archforge.nl',api:'',gitHttp:'',gitHost:'archforge.nl',gitPort:22,discord:'',smtpAvailable:true,smtpFrom:'status@archforge.nl',failures:3,recoveries:2,timeout:2000,interval:60000,host:'127.0.0.1',port:0,test:true};
e59b7f7cc6archadmin2026-10-115 test('subscribe, double opt-in, independent notification queue and unsubscribe',async()=>{
e59b7f7cc6archadmin2026-10-116  const db=openDatabase(':memory:'),app=makeApp({db,cfg,disableMonitor:true});await new Promise(r=>app.server.listen(0,'127.0.0.1',r));
e59b7f7cc6archadmin2026-10-117  const base='http://127.0.0.1:'+app.server.address().port;
e59b7f7cc6archadmin2026-10-118  try{
e59b7f7cc6archadmin2026-10-119  const first=await fetch(base+'/subscribe');const cookie=first.headers.get('set-cookie').split(';')[0];const csrf=cookie.slice(cookie.indexOf('=')+1);
e59b7f7cc6archadmin2026-10-1110  const request=async pathname=>fetch(base+pathname,{method:'POST',redirect:'manual',headers:{cookie,'content-type':'application/x-www-form-urlencoded',origin:'https://status.archforge.nl'},body:new URLSearchParams({email:'person@example.com',csrf})});
e59b7f7cc6archadmin2026-10-1111  const r=await request('/subscribe');assert.equal(r.status,200);
e59b7f7cc6archadmin2026-10-1112  assert.equal(one(db,'SELECT confirmed FROM subscriptions').confirmed,0);
e59b7f7cc6archadmin2026-10-1113  const confirmBody=one(db,"SELECT body FROM messages WHERE subject='Confirm ArchForge Status alerts'").body;
e59b7f7cc6archadmin2026-10-1114  const token=confirmBody.match(/\/confirm\/([\w-]+)/)[1];
e59b7f7cc6archadmin2026-10-1115  const activated=await request('/confirm/'+token);assert.equal(activated.status,200);
e59b7f7cc6archadmin2026-10-1116  assert.equal(one(db,'SELECT confirmed FROM subscriptions').confirmed,1);
e59b7f7cc6archadmin2026-10-1117  notifyQueue(db,cfg,'Main website is down','Independent outage report');
e59b7f7cc6archadmin2026-10-1118  const item=one(db,"SELECT body FROM messages WHERE subject='Main website is down'");assert.ok(item.body.includes('unsubscribe/'));
e59b7f7cc6archadmin2026-10-1119  const unsub=item.body.match(/\/unsubscribe\/([\w-]+)/)[1];
e59b7f7cc6archadmin2026-10-1120  const removed=await request('/unsubscribe/'+unsub);assert.equal(removed.status,200);
e59b7f7cc6archadmin2026-10-1121  assert.equal(one(db,'SELECT COUNT(*) c FROM subscriptions').c,0);
e59b7f7cc6archadmin2026-10-1122  }finally{await app.close();}
e59b7f7cc6archadmin2026-10-1123 });