diff --git a/src/logging/parse-log-line.test.ts b/src/logging/parse-log-line.test.ts new file mode 100644 index 000000000..09da3a554 --- /dev/null +++ b/src/logging/parse-log-line.test.ts @@ -0,0 +1,46 @@ +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/providers/whatsapp"}', + 1: "connected", + _meta: { + name: '{"subsystem":"gateway/providers/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/providers/whatsapp"); + expect(parsed?.message).toBe("{\"subsystem\":\"gateway/providers/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(); + }); +});