import { describe, expect, test } from 'bun:test'; import type { DriftFinding } from '../../services/audit/types'; import type { CommandLogEntry } from './audit-state'; import { formatCommandLogForClipboard, formatFindingForClipboard } from './clipboard'; const base: DriftFinding = { category: 'module_configs', severity: 'drift', code: 'cfg_unset', subject: 'caddy', message: 'config "acme_ca" is unset (default: [])', }; describe('formatFindingForClipboard', () => { test('minimal finding — message + subject/code footer', () => { expect(formatFindingForClipboard(base)).toBe( [ 'config "acme_ca" is unset (default: [])', '', 'caddy · cfg_unset (module_configs/drift)', ].join('\n'), ); }); test('includes details and remediation when present', () => { const out = formatFindingForClipboard({ ...base, details: 'User-configured ACME CA URL', remediation: 'celilo module config set caddy acme_ca ', }); expect(out).toContain('User-configured ACME CA URL'); expect(out).toContain('→ celilo module config set caddy acme_ca '); expect(out).toContain('caddy · cfg_unset'); }); test('strips ANSI escape codes from details', () => { const out = formatFindingForClipboard({ ...base, details: '\x1b[34mError:\x1b[39m something went wrong', }); expect(out).toContain('Error: something went wrong'); expect(out).not.toContain('\x1b'); expect(out).not.toContain('[34m'); }); }); describe('formatCommandLogForClipboard', () => { function entry(over: Partial = {}): CommandLogEntry { return { startedAt: new Date('2026-04-25T12:00:00Z').getTime(), cmd: 'celilo module deploy caddy', lines: [], exitCode: 0, ...over, }; } test('strips ANSI escape codes from streamed output', () => { const out = formatCommandLogForClipboard([ entry({ lines: [ { stream: 'stdout', text: '\x1b[90m│ \x1b[39m' }, { stream: 'stdout', text: '\x1b[34m●\x1b[39m Deploying module: caddy' }, ], }), ]); expect(out).not.toContain('\x1b'); expect(out).not.toContain('[34m'); expect(out).not.toContain('[39m'); expect(out).toContain('● Deploying module: caddy'); }); test('marks stderr lines with [err] prefix', () => { const out = formatCommandLogForClipboard([ entry({ lines: [ { stream: 'stdout', text: 'normal output' }, { stream: 'stderr', text: 'oh no' }, ], }), ]); expect(out).toContain('normal output'); expect(out).toContain('[err] oh no'); }); test('shows running… for an in-flight entry, exit N for finished', () => { const out = formatCommandLogForClipboard([ entry({ exitCode: null, lines: [{ stream: 'stdout', text: 'working' }] }), entry({ startedAt: 2, exitCode: 1, lines: [{ stream: 'stderr', text: 'failed' }] }), ]); expect(out).toContain('running…'); expect(out).toContain('exit 1'); }); });