Repository files, collaboration, releases and project activity.
archforge-external-status / tests/subscriptions.test.jsmain
▤ tests/subscriptions.test.js2250 bytes
24 lines · Select a line number for a permalink
1
'use strict';2
const test=require('node:test'),assert=require('node:assert/strict'),crypto=require('node:crypto');3
const {openDatabase,one,rows}=require('../src/database');const {makeApp}=require('../src/server');const {notifyQueue}=require('../src/notifications');4
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};5
test('subscribe, double opt-in, independent notification queue and unsubscribe',async()=>{6
const db=openDatabase(':memory:'),app=makeApp({db,cfg,disableMonitor:true});await new Promise(r=>app.server.listen(0,'127.0.0.1',r));7
const base='http://127.0.0.1:'+app.server.address().port;8
try{9
const first=await fetch(base+'/subscribe');const cookie=first.headers.get('set-cookie').split(';')[0];const csrf=cookie.slice(cookie.indexOf('=')+1);10
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})});11
const r=await request('/subscribe');assert.equal(r.status,200);12
assert.equal(one(db,'SELECT confirmed FROM subscriptions').confirmed,0);13
const confirmBody=one(db,"SELECT body FROM messages WHERE subject='Confirm ArchForge Status alerts'").body;14
const token=confirmBody.match(/\/confirm\/([\w-]+)/)[1];15
const activated=await request('/confirm/'+token);assert.equal(activated.status,200);16
assert.equal(one(db,'SELECT confirmed FROM subscriptions').confirmed,1);17
notifyQueue(db,cfg,'Main website is down','Independent outage report');18
const item=one(db,"SELECT body FROM messages WHERE subject='Main website is down'");assert.ok(item.body.includes('unsubscribe/'));19
const unsub=item.body.match(/\/unsubscribe\/([\w-]+)/)[1];20
const removed=await request('/unsubscribe/'+unsub);assert.equal(removed.status,200);21
assert.equal(one(db,'SELECT COUNT(*) c FROM subscriptions').c,0);22
}finally{await app.close();}23
});