99
1010
1111class TestHandleMsg (UnitTest ):
12+ def test_empty_msg (self ):
13+ """Test handling of an empty message."""
14+ client = ClientServer ()
15+ client ._handle_msg ([])
16+ self .mock_logger .warning .assert_called_once_with ("Invalid RPC message received (must be a non-empty list)." )
17+ self .mock_logger .error .assert_not_called ()
18+
19+ def test_unknown_msg_type (self ):
20+ """Test handling of an unknown message type."""
21+ client = ClientServer ()
22+ client ._handle_msg ([99 , 1 , None , "result" ]) # Msg type 99 does not exist
23+ self .mock_logger .warning .assert_called_once_with ("Invalid RPC message type received: 99" )
24+ self .mock_logger .error .assert_not_called ()
25+
26+ def test_unknown_msg_id (self ):
27+ """Test handling of an unknown message id."""
28+ client = ClientServer ()
29+ client ._handle_msg ([1 , 9999 , None , "result" ]) # Msg id 9999 does not exist
30+ self .mock_logger .warning .assert_called_once_with ("Response for unknown msgid 9999 received." )
31+ self .mock_logger .error .assert_not_called ()
32+
33+ def test_malformed_messages (self ):
34+ """Test handling of malformed messages."""
35+ client = ClientServer ()
36+
37+ client ._handle_msg ([0 , 1 , "method" , [0 , 1 ], "extra field" ]) # Malformed payload
38+ self .mock_logger .warning .assert_not_called ()
39+ self .mock_logger .error .assert_called_once_with ("Message validation error: Invalid RPC request: expected length 4, got 5" )
40+ self .mock_logger .reset_mock ()
41+ client ._handle_msg ([0 , 1 , "method" , 1 ]) # Malformed params
42+ self .mock_logger .warning .assert_not_called ()
43+ self .mock_logger .error .assert_called_once_with ("Message validation error: Invalid RPC request params: expected array or tuple" )
44+ self .mock_logger .reset_mock ()
45+
46+ client ._handle_msg ([1 , 1 , None , "result" , "extra field" ]) # Malformed payload
47+ self .mock_logger .warning .assert_not_called ()
48+ self .mock_logger .error .assert_called_once_with ("Message validation error: Invalid RPC response: expected length 4, got 5" )
49+ self .mock_logger .reset_mock ()
50+ client ._handle_msg ([1 , 1 , 42 , "result" ]) # Malformed error
51+ self .mock_logger .warning .assert_not_called ()
52+ self .mock_logger .error .assert_called_once_with ("Message validation error: Invalid error format in RPC response" )
53+ self .mock_logger .reset_mock ()
54+
55+ client ._handle_msg ([2 , 1 , [0 , 1 ], "extra field" ]) # Malformed payload
56+ self .mock_logger .warning .assert_not_called ()
57+ self .mock_logger .error .assert_called_once_with ("Message validation error: Invalid RPC notification: expected length 3, got 4" )
58+ self .mock_logger .reset_mock ()
59+ client ._handle_msg ([2 , 1 , 42 ]) # Malformed params
60+ self .mock_logger .warning .assert_not_called ()
61+ self .mock_logger .error .assert_called_once_with ("Message validation error: Invalid RPC notification params: expected array or tuple" )
62+ self .mock_logger .reset_mock ()
63+
1264 def test_handle_msg_request (self ):
1365 """Test handling of an incoming request message."""
1466 client = ClientServer ()
@@ -27,6 +79,22 @@ def test_handle_msg_request(self):
2779 handler_mock .assert_called_once_with (* params )
2880 client ._send_response .assert_called_once_with (msgid , None , "handled" )
2981
82+ def test_handle_msg_request_handler_fail (self ):
83+ """Test handling of a request for a method that fails running its handler."""
84+ client = ClientServer ()
85+ client ._send_response = MagicMock ()
86+
87+ request_msg = [0 , 111 , "failing_method" , []]
88+ client .handlers ["failing_method" ] = MagicMock (side_effect = ValueError ("Handler failed" ))
89+
90+ client ._handle_msg (request_msg )
91+
92+ client ._send_response .assert_called_once ()
93+ args , _ = client ._send_response .call_args
94+ self .assertEqual (args [0 ], 111 ) # msgid
95+ self .assertIsInstance (args [1 ], ValueError ) # error
96+ self .assertIsNone (args [2 ]) # result
97+
3098 def test_handle_msg_request_method_not_found (self ):
3199 """Test handling of a request for a method that is not found."""
32100 client = ClientServer ()
@@ -79,7 +147,7 @@ def test_handle_msg_response(self):
79147 on_error_mock .assert_not_called ()
80148 self .assertNotIn (msgid , client .callbacks ) # Callback should be removed
81149
82- def test_handle_msg_response_function_not_found (self ):
150+ def test_handle_msg_generic_error_response (self ):
83151 """Test handling of an incoming error response message."""
84152 client = ClientServer ()
85153
@@ -100,7 +168,7 @@ def test_handle_msg_response_function_not_found(self):
100168 on_error_mock .assert_called_once_with (result_error )
101169 self .assertNotIn (msgid , client .callbacks ) # Callback should be removed
102170
103- def test_handle_msg_response_already_provided_error (self ):
171+ def test_handle_msg_method_exists_error_response (self ):
104172 """Test handling of an incoming error response message that signals a method is already provided."""
105173 client = ClientServer ()
106174
0 commit comments