| import { describe, it, expect } from 'vitest'; |
|
|
| import { parseLogLine } from '../../src/lib/log-reader'; |
|
|
| describe('parseLogLine', () => { |
| it('parses time, level, message, and trailing key=value fields', () => { |
| const line = '2026-06-15T05:32:08.722Z INFO llm config turnStep=0.1 provider=openai model=coding-model-okapi thinkingEffort=high'; |
| const parsed = parseLogLine(line, 7); |
| expect(parsed.lineNo).toBe(7); |
| expect(parsed.time).toBe('2026-06-15T05:32:08.722Z'); |
| expect(parsed.level).toBe('INFO'); |
| expect(parsed.message).toBe('llm config'); |
| expect(parsed.fields).toEqual({ |
| turnStep: '0.1', |
| provider: 'openai', |
| model: 'coding-model-okapi', |
| thinkingEffort: 'high', |
| }); |
| }); |
|
|
| it('handles a message with no fields', () => { |
| const parsed = parseLogLine('2026-06-15T05:32:16.680Z WARN something happened', 1); |
| expect(parsed.level).toBe('WARN'); |
| expect(parsed.message).toBe('something happened'); |
| expect(parsed.fields).toEqual({}); |
| }); |
|
|
| it('keeps unparseable lines verbatim as a message', () => { |
| const parsed = parseLogLine(' at someStackFrame (file.ts:1:2)', 3); |
| expect(parsed.time).toBeNull(); |
| expect(parsed.level).toBeNull(); |
| expect(parsed.message).toBe(' at someStackFrame (file.ts:1:2)'); |
| expect(parsed.raw).toBe(' at someStackFrame (file.ts:1:2)'); |
| }); |
| }); |
|
|