10 lines
2.0 KiB
JavaScript
10 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);});
|