| import { describe, expect, it } from "vitest"; |
| import { parseLogLine } from "./parse-log-line.js"; |
|
|
| describe("parseLogLine", () => { |
| it("parses structured JSON log lines", () => { |
| const line = JSON.stringify({ |
| time: "2026-01-09T01:38:41.523Z", |
| 0: '{"subsystem":"gateway/channels/whatsapp"}', |
| 1: "connected", |
| _meta: { |
| name: '{"subsystem":"gateway/channels/whatsapp"}', |
| logLevelName: "INFO", |
| }, |
| }); |
|
|
| const parsed = parseLogLine(line); |
|
|
| expect(parsed).not.toBeNull(); |
| expect(parsed?.time).toBe("2026-01-09T01:38:41.523Z"); |
| expect(parsed?.level).toBe("info"); |
| expect(parsed?.subsystem).toBe("gateway/channels/whatsapp"); |
| expect(parsed?.message).toBe('{"subsystem":"gateway/channels/whatsapp"} connected'); |
| expect(parsed?.raw).toBe(line); |
| }); |
|
|
| it("falls back to meta timestamp when top-level time is missing", () => { |
| const line = JSON.stringify({ |
| 0: "hello", |
| _meta: { |
| name: '{"subsystem":"gateway"}', |
| logLevelName: "WARN", |
| date: "2026-01-09T02:10:00.000Z", |
| }, |
| }); |
|
|
| const parsed = parseLogLine(line); |
|
|
| expect(parsed?.time).toBe("2026-01-09T02:10:00.000Z"); |
| expect(parsed?.level).toBe("warn"); |
| }); |
|
|
| it("returns null for invalid JSON", () => { |
| expect(parseLogLine("not-json")).toBeNull(); |
| }); |
| }); |
|
|