Stay in codex, plan review and fix complicated bugs, then ask it to spawn claude code and implement the plan. This uses your current subscription instead of API tokens.
46 lines
1.4 KiB
Python
46 lines
1.4 KiB
Python
"""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="")
|