import { describe, expect, test } from 'bun:test'; import type { SystemAuditReport } from '../../services/audit'; import { formatReport } from './system-audit'; const baseReport = (overrides: Partial = {}): SystemAuditReport => ({ version: 1, verdict: 'READY', generatedAt: '2026-04-25T00:00:00.000Z', findings: [], ...overrides, }); describe('formatReport', () => { test('READY report calls out no drift', () => { const out = formatReport(baseReport()); expect(out).toContain('READY'); expect(out).toContain('No drift detected'); }); test('DRIFT report lists each finding with remediation', () => { const out = formatReport( baseReport({ verdict: 'DRIFT', findings: [ { category: 'cli_version', severity: 'drift', code: 'cli_version_drift', message: '@celilo/cli 0.1.5 → 0.1.7 available', remediation: '`celilo system update` will self-update first', subject: 'system', }, ], }), ); expect(out).toContain('DRIFT (1 finding)'); expect(out).toContain('@celilo/cli 0.1.5 → 0.1.7'); expect(out).toContain('→ `celilo system update`'); }); test('BLOCKED report puts blocked findings first', () => { const out = formatReport( baseReport({ verdict: 'BLOCKED', findings: [ { category: 'cli_version', severity: 'drift', code: 'cli_version_drift', message: 'cli is old', subject: 'system', }, { category: 'schema', severity: 'blocked', code: 'schema_pending_migrations', message: '2 pending DB migrations', subject: 'system', }, ], }), ); const blockedIdx = out.indexOf('BLOCKED • schema'); const driftIdx = out.indexOf('DRIFT • cli_version'); expect(blockedIdx).toBeGreaterThanOrEqual(0); expect(driftIdx).toBeGreaterThan(blockedIdx); }); test('groups findings by category', () => { const out = formatReport( baseReport({ verdict: 'DRIFT', findings: [ { category: 'module_versions', severity: 'drift', code: 'x', message: 'caddy: 1.0 → 1.1', subject: 'caddy', }, { category: 'module_versions', severity: 'drift', code: 'x', message: 'iptables: 1.0 → 1.1', subject: 'iptables', }, ], }), ); expect(out).toContain('DRIFT • module_versions (2)'); expect(out).toContain('caddy: 1.0 → 1.1'); expect(out).toContain('iptables: 1.0 → 1.1'); }); test('renders details on indented lines', () => { const out = formatReport( baseReport({ verdict: 'BLOCKED', findings: [ { category: 'schema', severity: 'blocked', code: 'schema_pending_migrations', message: '2 pending DB migrations', details: ' • 0001_zones\n • 0002_backups', subject: 'system', }, ], }), ); expect(out).toContain('0001_zones'); expect(out).toContain('0002_backups'); }); test('singular wording for exactly one finding', () => { const out = formatReport( baseReport({ verdict: 'DRIFT', findings: [ { category: 'cli_version', severity: 'drift', code: 'x', message: 'cli is old', subject: 'system', }, ], }), ); expect(out).toContain('DRIFT (1 finding)'); expect(out).not.toContain('1 findings'); }); });