| import { describe, expect, it } from "vitest"; |
| import { parseOpenCodeJsonl, isOpenCodeUnknownSessionError } from "./parse.js"; |
|
|
| describe("parseOpenCodeJsonl", () => { |
| it("parses assistant text, usage, cost, and errors", () => { |
| const stdout = [ |
| JSON.stringify({ |
| type: "text", |
| sessionID: "session_123", |
| part: { text: "Hello from OpenCode" }, |
| }), |
| JSON.stringify({ |
| type: "step_finish", |
| sessionID: "session_123", |
| part: { |
| reason: "done", |
| cost: 0.0025, |
| tokens: { |
| input: 120, |
| output: 40, |
| reasoning: 10, |
| cache: { read: 20, write: 0 }, |
| }, |
| }, |
| }), |
| JSON.stringify({ |
| type: "error", |
| sessionID: "session_123", |
| error: { message: "model unavailable" }, |
| }), |
| ].join("\n"); |
|
|
| const parsed = parseOpenCodeJsonl(stdout); |
| expect(parsed.sessionId).toBe("session_123"); |
| expect(parsed.summary).toBe("Hello from OpenCode"); |
| expect(parsed.usage).toEqual({ |
| inputTokens: 120, |
| cachedInputTokens: 20, |
| outputTokens: 50, |
| }); |
| expect(parsed.costUsd).toBeCloseTo(0.0025, 6); |
| expect(parsed.errorMessage).toContain("model unavailable"); |
| }); |
|
|
| it("detects unknown session errors", () => { |
| expect(isOpenCodeUnknownSessionError("Session not found: s_123", "")).toBe(true); |
| expect(isOpenCodeUnknownSessionError("", "unknown session id")).toBe(true); |
| expect(isOpenCodeUnknownSessionError("all good", "")).toBe(false); |
| }); |
| }); |
|
|