|
7 | 7 | from claude_agent_sdk.types import ( |
8 | 8 | AssistantMessage, |
9 | 9 | DeferredToolUse, |
| 10 | + HookEventMessage, |
10 | 11 | RateLimitEvent, |
11 | 12 | ResultMessage, |
12 | 13 | ServerToolResultBlock, |
@@ -989,3 +990,63 @@ def test_parse_result_message_success_no_errors(self): |
989 | 990 | assert isinstance(message, ResultMessage) |
990 | 991 | assert message.errors is None |
991 | 992 | assert message.result == "Task completed successfully" |
| 993 | + |
| 994 | + def test_parse_hook_event_message(self): |
| 995 | + """Hook started events (system/hook_started) parse into HookEventMessage.""" |
| 996 | + data = { |
| 997 | + "type": "system", |
| 998 | + "subtype": "hook_started", |
| 999 | + "hook_event": "PreToolUse", |
| 1000 | + "hook_name": "PreToolUse", |
| 1001 | + "session_id": "sess-123", |
| 1002 | + "uuid": "uuid-456", |
| 1003 | + "tool_name": "Bash", |
| 1004 | + "tool_input": {"command": "ls"}, |
| 1005 | + } |
| 1006 | + message = parse_message(data) |
| 1007 | + assert isinstance(message, HookEventMessage) |
| 1008 | + assert message.subtype == "hook_started" |
| 1009 | + assert message.hook_event_name == "PreToolUse" |
| 1010 | + assert message.session_id == "sess-123" |
| 1011 | + assert message.uuid == "uuid-456" |
| 1012 | + assert message.data == data |
| 1013 | + |
| 1014 | + def test_parse_hook_event_message_response(self): |
| 1015 | + """Hook response events (system/hook_response) parse into HookEventMessage.""" |
| 1016 | + data = { |
| 1017 | + "type": "system", |
| 1018 | + "subtype": "hook_response", |
| 1019 | + "hook_event": "PostToolUse", |
| 1020 | + "hook_name": "PostToolUse", |
| 1021 | + "session_id": "sess-123", |
| 1022 | + "uuid": "uuid-789", |
| 1023 | + "output": "", |
| 1024 | + "exit_code": 0, |
| 1025 | + "outcome": "success", |
| 1026 | + } |
| 1027 | + message = parse_message(data) |
| 1028 | + assert isinstance(message, HookEventMessage) |
| 1029 | + assert message.subtype == "hook_response" |
| 1030 | + assert message.hook_event_name == "PostToolUse" |
| 1031 | + assert message.session_id == "sess-123" |
| 1032 | + assert message.uuid == "uuid-789" |
| 1033 | + assert message.data["output"] == "" |
| 1034 | + assert message.data["exit_code"] == 0 |
| 1035 | + assert message.data["outcome"] == "success" |
| 1036 | + |
| 1037 | + def test_parse_hook_event_message_isinstance_system(self): |
| 1038 | + """HookEventMessage is a SystemMessage subclass for backward compat.""" |
| 1039 | + data = {"type": "system", "subtype": "hook_started", "hook_event": "PreToolUse"} |
| 1040 | + message = parse_message(data) |
| 1041 | + assert isinstance(message, HookEventMessage) |
| 1042 | + assert isinstance(message, SystemMessage) |
| 1043 | + |
| 1044 | + def test_parse_hook_event_message_minimal(self): |
| 1045 | + """Hook events without session_id/uuid/hook_event still parse.""" |
| 1046 | + data = {"type": "system", "subtype": "hook_started", "hook_name": "Stop"} |
| 1047 | + message = parse_message(data) |
| 1048 | + assert isinstance(message, HookEventMessage) |
| 1049 | + assert message.subtype == "hook_started" |
| 1050 | + assert message.hook_event_name == "Stop" |
| 1051 | + assert message.session_id is None |
| 1052 | + assert message.uuid is None |
0 commit comments