// tests/audit.test.js require('../__mocks__/chrome.js'); const { addEvent, addViolation, getStats, getAuditLog, getViolations, exportAuditLog, searchAuditLog, verifyIntegrity } = require('../lib/audit.js'); describe('Audit', () => { beforeEach(() => { global.__chromeStore = {}; }); test('addEvent stores event', async () => { const event = { id: 'e1', type: 'tool_use', timestamp: new Date().toISOString() }; await addEvent(event); const log = await getAuditLog(10); expect(log).toHaveLength(1); expect(log[0].id).toBe('e1'); }); test('addViolation stores violation', async () => { const violation = { id: 'v1', event_id: 'e1', detector: 'disallowed_tools', severity: 'critical', timestamp: new Date().toISOString() }; await addViolation(violation); const list = await getViolations(10); expect(list).toHaveLength(1); expect(list[0].severity).toBe('critical'); }); test('getStats returns correct counts', async () => { await addEvent({ id: 'e1', type: 'tool_use', timestamp: new Date().toISOString() }); await addEvent({ id: 'e2', type: 'api_call', timestamp: new Date().toISOString() }); await addViolation({ id: 'v1', event_id: 'e1', detector: 'disallowed_tools', severity: 'high', timestamp: new Date().toISOString() }); const stats = await getStats(); expect(stats.totalEvents).toBe(2); expect(stats.totalViolations).toBe(1); expect(stats.severityCounts.high).toBe(1); }); test('exportAuditLog includes integrity hash', async () => { await addEvent({ id: 'e1', type: 'tool_use', timestamp: new Date().toISOString() }); const exported = await exportAuditLog(); expect(exported.totalEvents).toBe(1); expect(exported.integrity).toBeDefined(); expect(exported.integrity.length).toBeGreaterThan(0); }); test('searchAuditLog filters by query', async () => { await addEvent({ id: 'e1', type: 'tool_use', tool: 'read_file', target: 'app.js', timestamp: new Date().toISOString() }); await addEvent({ id: 'e2', type: 'tool_use', tool: 'edit_file', target: 'config.js', timestamp: new Date().toISOString() }); const results = await searchAuditLog('config'); expect(results).toHaveLength(1); expect(results[0].target).toBe('config.js'); }); test('verifyIntegrity returns valid for empty log', async () => { const result = await verifyIntegrity(); expect(result.valid).toBe(true); expect(result.eventsChecked).toBe(0); }); test('max events limit enforced', async () => { for (let i = 0; i < 1100; i++) { await addEvent({ id: `e${i}`, type: 'tool_use', timestamp: new Date().toISOString() }); } const log = await getAuditLog(2000); expect(log.length).toBeLessThanOrEqual(1000); }); });