Skip to content

Repository files, collaboration, releases and project activity.

ARCHFORGE HISTORY

Blame · tests/monitor.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');
e59b7f7cc6archadmin2026-10-113 const {openDatabase,run,one,rows}=require('../src/database');const {syncServices}=require('../src/database');
e59b7f7cc6archadmin2026-10-114 const {upsertState,uptimeStats,incidentMaintenanceState}=require('../src/monitor');
e59b7f7cc6archadmin2026-10-115 function prep(){const db=openDatabase(':memory:');syncServices(db,[{id:'website',label:'Website',description:'site',category:'Platform',configured:true}]);const cfg={failures:3,recoveries:2,discord:'',smtpAvailable:false};return {db,cfg};}
e59b7f7cc6archadmin2026-10-116 test('three failures create exactly one automated incident, recovery needs two successes',()=>{
e59b7f7cc6archadmin2026-10-117  const {db,cfg}=prep();let time=1750000000;
e59b7f7cc6archadmin2026-10-118  upsertState(db,cfg,'website',{success:false,latency:1,detail:'HTTP 500'},time++);assert.equal(one(db,'SELECT current_state s FROM services').s,'unknown');
e59b7f7cc6archadmin2026-10-119  upsertState(db,cfg,'website',{success:false,latency:1,detail:'HTTP 500'},time++);assert.equal(one(db,'SELECT COUNT(*) c FROM incidents').c,0);
e59b7f7cc6archadmin2026-10-1110  upsertState(db,cfg,'website',{success:false,latency:1,detail:'HTTP 500'},time++);assert.equal(one(db,'SELECT current_state s FROM services').s,'offline');
e59b7f7cc6archadmin2026-10-1111  upsertState(db,cfg,'website',{success:false,latency:1,detail:'HTTP 500'},time++);assert.equal(one(db,'SELECT COUNT(*) c FROM incidents').c,1);
e59b7f7cc6archadmin2026-10-1112  upsertState(db,cfg,'website',{success:true,latency:100,detail:'HTTP 200'},time++);assert.equal(one(db,'SELECT current_state s FROM services').s,'offline');
e59b7f7cc6archadmin2026-10-1113  upsertState(db,cfg,'website',{success:true,latency:100,detail:'HTTP 200'},time++);assert.equal(one(db,'SELECT current_state s FROM services').s,'operational');assert.equal(one(db,'SELECT COUNT(*) c FROM incidents WHERE resolved_at IS NOT NULL').c,1);db.close();
e59b7f7cc6archadmin2026-10-1114 });
e59b7f7cc6archadmin2026-10-1115 test('no data days are explicitly unknown, never assumed operational',()=>{const {db}=prep();const data=uptimeStats(db,90);assert.equal(data[0].stats.coverage,0);assert.equal(data[0].stats.uptime,null);assert.equal(data[0].stats.buckets.length,90);assert.ok(data[0].stats.buckets.every(d=>d.state==='unknown'));db.close();});
e59b7f7cc6archadmin2026-10-1116 test('maintenance windows are independent from health check samples',()=>{const {db}=prep();const n=1750000000;run(db,'INSERT INTO maintenance(title,description,starts_at,ends_at,created_at) VALUES(?,?,?,?,?)','Upgrade','Planned',n,n+3600,n);assert.equal(incidentMaintenanceState(db,n+1).length,1);assert.equal(incidentMaintenanceState(db,n+4000).length,0);db.close();});
e59b7f7cc6archadmin2026-10-1117 
e59b7f7cc6archadmin2026-10-1118 test('certificate warnings become degraded, not offline',()=>{const {db,cfg}=prep();for(let i=0;i<3;i++)upsertState(db,cfg,'website',{success:true,warning:true,latency:2,detail:'Expires in 3 days'});assert.equal(one(db,'SELECT current_state s FROM services').s,'degraded');assert.equal(one(db,'SELECT severity s FROM incidents').s,'degraded');upsertState(db,cfg,'website',{success:true,latency:2,detail:'Valid certificate'});upsertState(db,cfg,'website',{success:true,latency:2,detail:'Valid certificate'});assert.equal(one(db,'SELECT current_state s FROM services').s,'operational');db.close();});