Files
wehub-resource-sync 5296d0e97c
CI / Ban suppressions and legacy annotations (push) Has been cancelled
CI / pytest (push) Has been cancelled
CI / ruff-check (push) Has been cancelled
CI / ruff-format (push) Has been cancelled
CI / ty (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:35:44 +08:00

61 lines
2.1 KiB
Python

"""Messaging-specific assertions built on neutral Anthropic stream contracts."""
from free_claude_code.core.anthropic import AnthropicStreamLedger
from free_claude_code.core.anthropic.stream_contracts import (
assert_anthropic_stream_contract,
has_tool_use,
parse_sse_text,
)
from free_claude_code.messaging.event_parser import parse_cli_event
from free_claude_code.messaging.transcript import RenderCtx, TranscriptBuffer
def test_thinking_tool_text_and_transcript_order_contract() -> None:
builder = AnthropicStreamLedger("msg_contract", "contract-model")
chunks = [builder.message_start()]
chunks.extend(builder.ensure_thinking_block())
chunks.append(builder.emit_thinking_delta("inspect first"))
chunks.extend(builder.close_content_blocks())
tool_block_index = builder.blocks.allocate_index()
chunks.append(
builder.content_block_start(
tool_block_index, "tool_use", id="toolu_1", name="Read"
)
)
chunks.append(
builder.content_block_delta(
tool_block_index, "input_json_delta", '{"file":"README.md"}'
)
)
chunks.append(builder.content_block_stop(tool_block_index))
chunks.extend(builder.ensure_text_block())
chunks.append(builder.emit_text_delta("done"))
chunks.extend(builder.close_all_blocks())
chunks.append(builder.message_delta("end_turn", 20))
chunks.append(builder.message_stop())
events = parse_sse_text("".join(chunks))
assert_anthropic_stream_contract(events)
assert has_tool_use(events)
transcript = TranscriptBuffer()
for event in events:
for parsed in parse_cli_event(event.data):
transcript.apply(parsed)
rendered = transcript.render(_render_ctx(), limit_chars=3900, status=None)
assert (
rendered.find("inspect first")
< rendered.find("Tool call:")
< rendered.find("done")
)
def _render_ctx() -> RenderCtx:
return RenderCtx(
bold=lambda s: f"*{s}*",
code_inline=lambda s: f"`{s}`",
escape_code=lambda s: s,
escape_text=lambda s: s,
render_markdown=lambda s: s,
)