Files
safetynet/tests/audit-integrity-admin.test.mjs
T

11 lines
2.0 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import {createRequire} from 'node:module';
const {createAuditIntegrityController}=createRequire(import.meta.url)('../apps/server/public/audit-integrity-admin.js');
function fixture(){let principal={sub:'one',role:'analyst',permissions:['audit.read']};const calls=[],renders=[];const view=createAuditIntegrityController({principal:()=>principal,request:path=>new Promise((resolve,reject)=>calls.push({path,resolve,reject})),render:(...args)=>renders.push(args),clear:()=>renders.push(['clear'])});return {view,calls,renders,change:p=>{principal=p;view.permissions();}};}
const result={valid:true,authenticated:false,externallyAnchored:false,head:{sequence:1,hash:'a'.repeat(64)}};
test('verification requires an explicit action and preserves unsigned/unanchored distinctions',async()=>{const f=fixture();f.view.permissions();assert.equal(f.calls.length,0);const pending=f.view.verify();assert.equal(f.calls[0].path,'/api/admin/audit/integrity');f.calls[0].resolve(result);await pending;assert.deepEqual(f.renders.at(-1),['result',result]);});
for(const change of ['identity','permission','reset'])test(`late integrity results are suppressed after ${change}`,async()=>{const f=fixture(),pending=f.view.verify();if(change==='reset')f.view.reset();else f.change({sub:change==='identity'?'two':'one',role:'analyst',permissions:change==='permission'?[]:['audit.read']});f.calls[0].resolve(result);await pending;assert.deepEqual(f.renders.at(-1),['clear']);});
test('backend error details and malformed integrity claims are suppressed',async()=>{const f=fixture();let pending=f.view.verify();f.calls[0].reject(Error('secret'));await pending;assert.deepEqual(f.renders.at(-1),['error']);pending=f.view.verify();f.calls[1].resolve({valid:true});await pending;assert.deepEqual(f.renders.at(-1),['error']);});
test('unprivileged identity cannot trigger verification',async()=>{const f=fixture();f.change(null);await f.view.verify();assert.equal(f.calls.length,0);});