test_clink_claude_parser.pyโข1.47 kB
"""Tests for the Claude CLI JSON parser."""
import pytest
from clink.parsers.base import ParserError
from clink.parsers.claude import ClaudeJSONParser
def _build_success_payload() -> str:
return (
'{"type":"result","subtype":"success","is_error":false,"duration_ms":1234,'
'"duration_api_ms":1200,"num_turns":1,"result":"42","session_id":"abc","total_cost_usd":0.12,'
'"usage":{"input_tokens":10,"output_tokens":5},'
'"modelUsage":{"claude-sonnet-4-5-20250929":{"inputTokens":10,"outputTokens":5}}}'
)
def test_claude_parser_extracts_result_and_metadata():
parser = ClaudeJSONParser()
stdout = _build_success_payload()
parsed = parser.parse(stdout=stdout, stderr="")
assert parsed.content == "42"
assert parsed.metadata["model_used"] == "claude-sonnet-4-5-20250929"
assert parsed.metadata["usage"]["output_tokens"] == 5
assert parsed.metadata["is_error"] is False
def test_claude_parser_falls_back_to_message():
parser = ClaudeJSONParser()
stdout = '{"type":"result","is_error":true,"message":"API error message"}'
parsed = parser.parse(stdout=stdout, stderr="warning")
assert parsed.content == "API error message"
assert parsed.metadata["is_error"] is True
assert parsed.metadata["stderr"] == "warning"
def test_claude_parser_requires_output():
parser = ClaudeJSONParser()
with pytest.raises(ParserError):
parser.parse(stdout="", stderr="")