| from messaging.event_parser import parse_cli_event |
|
|
|
|
| def test_parse_cli_event_assistant_content(): |
| event = { |
| "type": "assistant", |
| "message": { |
| "content": [ |
| {"type": "thinking", "thinking": "Internal thought"}, |
| {"type": "text", "text": "Hello user"}, |
| ] |
| }, |
| } |
| results = parse_cli_event(event) |
| assert len(results) == 2 |
| assert results[0] == {"type": "thinking_chunk", "text": "Internal thought"} |
| assert results[1] == {"type": "text_chunk", "text": "Hello user"} |
|
|
|
|
| def test_parse_cli_event_assistant_tools(): |
| event = { |
| "type": "assistant", |
| "message": { |
| "content": [{"type": "tool_use", "name": "ls", "input": {"path": "."}}] |
| }, |
| } |
| results = parse_cli_event(event) |
| assert len(results) == 1 |
| assert results[0]["type"] == "tool_use" |
| assert results[0]["name"] == "ls" |
| assert results[0]["input"] == {"path": "."} |
|
|
|
|
| def test_parse_cli_event_assistant_subagent(): |
| event = { |
| "type": "assistant", |
| "message": { |
| "content": [ |
| { |
| "type": "tool_use", |
| "name": "Task", |
| "input": {"description": "Fix bug"}, |
| } |
| ] |
| }, |
| } |
| results = parse_cli_event(event) |
| assert len(results) == 1 |
| assert results[0]["type"] == "tool_use" |
| assert results[0]["name"] == "Task" |
| assert results[0]["input"] == {"description": "Fix bug"} |
|
|
|
|
| def test_parse_cli_event_content_block_delta(): |
| |
| event_text = { |
| "type": "content_block_delta", |
| "index": 0, |
| "delta": {"type": "text_delta", "text": " more"}, |
| } |
| results_text = parse_cli_event(event_text) |
| assert results_text == [{"type": "text_delta", "index": 0, "text": " more"}] |
|
|
| |
| event_think = { |
| "type": "content_block_delta", |
| "index": 1, |
| "delta": {"type": "thinking_delta", "thinking": " more thought"}, |
| } |
| results_think = parse_cli_event(event_think) |
| assert results_think == [ |
| {"type": "thinking_delta", "index": 1, "text": " more thought"} |
| ] |
|
|
|
|
| def test_parse_cli_event_content_block_start(): |
| event = { |
| "type": "content_block_start", |
| "index": 2, |
| "content_block": { |
| "type": "tool_use", |
| "name": "Task", |
| "input": {"description": "deploy"}, |
| }, |
| } |
| results = parse_cli_event(event) |
| assert results == [ |
| { |
| "type": "tool_use_start", |
| "index": 2, |
| "id": "", |
| "name": "Task", |
| "input": {"description": "deploy"}, |
| } |
| ] |
|
|
|
|
| def test_parse_cli_event_error(): |
| event = {"type": "error", "error": {"message": "something failed"}} |
| results = parse_cli_event(event) |
| assert results == [{"type": "error", "message": "something failed"}] |
|
|
|
|
| def test_parse_cli_event_user_tool_result(): |
| event = { |
| "type": "user", |
| "message": { |
| "content": [ |
| { |
| "type": "tool_result", |
| "tool_use_id": "tool_1", |
| "content": "ok", |
| "is_error": False, |
| } |
| ] |
| }, |
| } |
| results = parse_cli_event(event) |
| assert results == [ |
| { |
| "type": "tool_result", |
| "tool_use_id": "tool_1", |
| "content": "ok", |
| "is_error": False, |
| } |
| ] |
|
|
|
|
| def test_parse_cli_event_exit_success(): |
| event = {"type": "exit", "code": 0} |
| results = parse_cli_event(event) |
| assert results == [{"type": "complete", "status": "success"}] |
|
|
|
|
| def test_parse_cli_event_exit_failure(): |
| event = {"type": "exit", "code": 1, "stderr": "fatal error"} |
| results = parse_cli_event(event) |
| assert len(results) == 2 |
| assert results[0] == {"type": "error", "message": "fatal error"} |
| assert results[1] == {"type": "complete", "status": "failed"} |
|
|
|
|
| def test_parse_cli_event_invalid_input(): |
| assert parse_cli_event(None) == [] |
| assert parse_cli_event("not a dict") == [] |
| assert parse_cli_event({"type": "unknown"}) == [] |
|
|
|
|
| def test_parse_cli_event_system_ignored(): |
| assert parse_cli_event({"type": "system", "foo": "bar"}) == [] |
|
|
|
|
| def test_parse_cli_event_result_with_content_directly(): |
| event = {"type": "result", "content": [{"type": "text", "text": "hi"}]} |
| assert parse_cli_event(event) == [{"type": "text_chunk", "text": "hi"}] |
|
|
|
|
| def test_parse_cli_event_result_with_result_content_directly(): |
| event = {"type": "result", "result": {"content": [{"type": "text", "text": "hi"}]}} |
| assert parse_cli_event(event) == [{"type": "text_chunk", "text": "hi"}] |
|
|
|
|
| def test_parse_cli_event_content_block_unknown_type_skipped(): |
| """Content block with unknown type is skipped; known blocks still parsed.""" |
| event = { |
| "type": "assistant", |
| "message": { |
| "content": [ |
| {"type": "text", "text": "visible"}, |
| {"type": "unknown", "data": "ignored"}, |
| {"type": "thinking", "thinking": "thought"}, |
| ] |
| }, |
| } |
| results = parse_cli_event(event) |
| assert len(results) == 2 |
| assert results[0] == {"type": "text_chunk", "text": "visible"} |
| assert results[1] == {"type": "thinking_chunk", "text": "thought"} |
|
|
|
|
| def test_parse_cli_event_error_non_dict(): |
| """Error event with error as string (not dict) is handled.""" |
| event = {"type": "error", "error": "plain string error"} |
| results = parse_cli_event(event) |
| assert results == [{"type": "error", "message": "plain string error"}] |
|
|
|
|
| def test_parse_cli_event_exit_code_none(): |
| """Exit event with no code defaults to success.""" |
| event = {"type": "exit"} |
| results = parse_cli_event(event) |
| assert results == [{"type": "complete", "status": "success"}] |
|
|