import { dedupeBufferedRows, lineCountsFromRows, rowFromPayload, rowsFromHistory, rowWasLoadedInHistory, } from '../src/lib/mainLogs.ts'; const assertEquals = (actual: T, expected: T, message: string) => { if (actual !== expected) { throw new Error(`${message}: expected ${expected}, got ${actual}`); } }; Deno.test('history rows parse levels and stable ids', () => { const rows = rowsFromHistory('[2026-06-07][12:00:00][app][WARN] careful\nplain line\n'); assertEquals(rows.length, 2, 'history should skip trailing empty line'); assertEquals(rows[0].id, 'history-0', 'history id should include row position'); assertEquals(rows[0].level, 'WARN', 'explicit level should be parsed'); assertEquals(rows[1].level, 'INFO', 'unknown level should default to info'); }); Deno.test('buffered main log rows covered by history sequence are removed', () => { const historyRows = rowsFromHistory('[2026-06-07][12:00:01][app][INFO] included\n'); const included = rowFromPayload({ line: '[2026-06-07][12:00:01][app][INFO] included', level: 'INFO', sequence: 4, }); const fresh = rowFromPayload({ line: '[2026-06-07][12:00:02][app][INFO] fresh', level: 'INFO', sequence: 5, }); const deduped = dedupeBufferedRows(lineCountsFromRows(historyRows), [included, fresh], 4); assertEquals(rowWasLoadedInHistory(included, 4), true, 'included row should match history'); assertEquals(deduped.length, 1, 'only fresh row should remain'); assertEquals(deduped[0].line, fresh.line, 'fresh row should not be dropped'); }); Deno.test('buffered rows missing from trimmed history are retained', () => { const retained = rowFromPayload({ line: '[2026-06-07][12:00:00][app][INFO] trimmed out', level: 'INFO', sequence: 2, }); const deduped = dedupeBufferedRows(new Map(), [retained], 4); assertEquals(deduped.length, 1, 'trimmed row should remain visible'); assertEquals(deduped[0].line, retained.line, 'trimmed row should be preserved'); });