@@ -86,3 +86,255 @@ def test_missing_required_parameter(self):
8686 assert len (result ) == 1
8787 result_text = json .loads (result [0 ].text )
8888 assert "error" in result_text or "suggestions" in result_text
89+
90+ @patch ("lab_testing.server.tool_handlers.ssh_to_device" )
91+ def test_ssh_to_device_handler (self , mock_ssh ):
92+ """Test ssh_to_device handler"""
93+ mock_ssh .return_value = {"success" : True , "output" : "test output" }
94+
95+ result = handle_tool (
96+ "ssh_to_device" ,
97+ {"device_id" : "test_device_1" , "command" : "uptime" },
98+ "test-123" ,
99+ 0.0 ,
100+ )
101+
102+ assert len (result ) == 1
103+ assert result [0 ].type == "text"
104+ mock_ssh .assert_called_once_with ("test_device_1" , "uptime" , None )
105+
106+ @patch ("lab_testing.server.tool_handlers.get_vpn_status" )
107+ def test_vpn_status_handler (self , mock_status ):
108+ """Test vpn_status handler"""
109+ mock_status .return_value = {"connected" : True , "interface" : "wg0" }
110+
111+ result = handle_tool ("vpn_status" , {}, "test-123" , 0.0 )
112+
113+ assert len (result ) == 1
114+ assert result [0 ].type == "text"
115+ mock_status .assert_called_once ()
116+
117+ @patch ("lab_testing.server.tool_handlers.connect_vpn" )
118+ def test_connect_vpn_handler (self , mock_connect ):
119+ """Test connect_vpn handler"""
120+ mock_connect .return_value = {"success" : True , "message" : "Connected" }
121+
122+ result = handle_tool ("connect_vpn" , {}, "test-123" , 0.0 )
123+
124+ assert len (result ) == 1
125+ assert result [0 ].type == "text"
126+ mock_connect .assert_called_once ()
127+
128+ @patch ("lab_testing.server.tool_handlers.disconnect_vpn" )
129+ def test_disconnect_vpn_handler (self , mock_disconnect ):
130+ """Test disconnect_vpn handler"""
131+ mock_disconnect .return_value = {"success" : True , "message" : "Disconnected" }
132+
133+ result = handle_tool ("disconnect_vpn" , {}, "test-123" , 0.0 )
134+
135+ assert len (result ) == 1
136+ assert result [0 ].type == "text"
137+ mock_disconnect .assert_called_once ()
138+
139+ @patch ("lab_testing.server.tool_handlers.check_ota_status" )
140+ def test_check_ota_status_handler (self , mock_ota ):
141+ """Test check_ota_status handler"""
142+ mock_ota .return_value = {"device_id" : "test_device_1" , "registered" : True }
143+
144+ result = handle_tool ("check_ota_status" , {"device_id" : "test_device_1" }, "test-123" , 0.0 )
145+
146+ assert len (result ) == 1
147+ assert result [0 ].type == "text"
148+ mock_ota .assert_called_once_with ("test_device_1" )
149+
150+ @patch ("lab_testing.server.tool_handlers.check_ota_status" )
151+ def test_check_ota_status_missing_device_id (self , mock_ota ):
152+ """Test check_ota_status handler with missing device_id"""
153+ result = handle_tool ("check_ota_status" , {}, "test-123" , 0.0 )
154+
155+ assert len (result ) == 1
156+ result_text = json .loads (result [0 ].text )
157+ assert "error" in result_text
158+ assert "device_id" in result_text ["error" ].lower ()
159+ mock_ota .assert_not_called ()
160+
161+ @patch ("lab_testing.server.tool_handlers.trigger_ota_update" )
162+ def test_trigger_ota_update_handler (self , mock_trigger ):
163+ """Test trigger_ota_update handler"""
164+ mock_trigger .return_value = {"success" : True , "message" : "Update triggered" }
165+
166+ result = handle_tool (
167+ "trigger_ota_update" ,
168+ {"device_id" : "test_device_1" , "target" : "production" },
169+ "test-123" ,
170+ 0.0 ,
171+ )
172+
173+ assert len (result ) == 1
174+ assert result [0 ].type == "text"
175+ mock_trigger .assert_called_once_with ("test_device_1" , "production" )
176+
177+ @patch ("lab_testing.server.tool_handlers.list_containers" )
178+ def test_list_containers_handler (self , mock_list ):
179+ """Test list_containers handler"""
180+ mock_list .return_value = {"containers" : []}
181+
182+ result = handle_tool ("list_containers" , {"device_id" : "test_device_1" }, "test-123" , 0.0 )
183+
184+ assert len (result ) == 1
185+ assert result [0 ].type == "text"
186+ mock_list .assert_called_once_with ("test_device_1" )
187+
188+ @patch ("lab_testing.server.tool_handlers.deploy_container" )
189+ def test_deploy_container_handler (self , mock_deploy ):
190+ """Test deploy_container handler"""
191+ mock_deploy .return_value = {"success" : True , "message" : "Container deployed" }
192+
193+ result = handle_tool (
194+ "deploy_container" ,
195+ {"device_id" : "test_device_1" , "container_name" : "app" , "image" : "app:1.0.0" },
196+ "test-123" ,
197+ 0.0 ,
198+ )
199+
200+ assert len (result ) == 1
201+ assert result [0 ].type == "text"
202+ mock_deploy .assert_called_once_with ("test_device_1" , "app" , "app:1.0.0" )
203+
204+ @patch ("lab_testing.server.tool_handlers.deploy_container" )
205+ def test_deploy_container_missing_params (self , mock_deploy ):
206+ """Test deploy_container handler with missing parameters"""
207+ result = handle_tool ("deploy_container" , {"device_id" : "test_device_1" }, "test-123" , 0.0 )
208+
209+ assert len (result ) == 1
210+ result_text = json .loads (result [0 ].text )
211+ assert "error" in result_text
212+ mock_deploy .assert_not_called ()
213+
214+ @patch ("lab_testing.server.tool_handlers.get_system_status" )
215+ def test_get_system_status_handler (self , mock_status ):
216+ """Test get_system_status handler"""
217+ mock_status .return_value = {"device_id" : "test_device_1" , "uptime" : "2 days" }
218+
219+ result = handle_tool ("get_system_status" , {"device_id" : "test_device_1" }, "test-123" , 0.0 )
220+
221+ assert len (result ) == 1
222+ assert result [0 ].type == "text"
223+ mock_status .assert_called_once_with ("test_device_1" )
224+
225+ @patch ("lab_testing.server.tool_handlers.get_firmware_version" )
226+ def test_get_firmware_version_handler (self , mock_version ):
227+ """Test get_firmware_version handler"""
228+ mock_version .return_value = {"version" : "1.0.0" }
229+
230+ result = handle_tool (
231+ "get_firmware_version" , {"device_id" : "test_device_1" }, "test-123" , 0.0
232+ )
233+
234+ assert len (result ) == 1
235+ assert result [0 ].type == "text"
236+ mock_version .assert_called_once_with ("test_device_1" )
237+
238+ @patch ("lab_testing.server.tool_handlers.tasmota_control" )
239+ def test_tasmota_control_handler (self , mock_tasmota ):
240+ """Test tasmota_control handler"""
241+ mock_tasmota .return_value = {"success" : True , "action" : "on" }
242+
243+ result = handle_tool (
244+ "tasmota_control" , {"device_id" : "tasmota_switch_1" , "action" : "on" }, "test-123" , 0.0
245+ )
246+
247+ assert len (result ) == 1
248+ assert result [0 ].type == "text"
249+ mock_tasmota .assert_called_once_with ("tasmota_switch_1" , "on" )
250+
251+ @patch ("lab_testing.server.tool_handlers.tasmota_control" )
252+ def test_tasmota_control_missing_params (self , mock_tasmota ):
253+ """Test tasmota_control handler with missing parameters"""
254+ result = handle_tool ("tasmota_control" , {"device_id" : "tasmota_switch_1" }, "test-123" , 0.0 )
255+
256+ assert len (result ) == 1
257+ result_text = json .loads (result [0 ].text )
258+ assert "error" in result_text
259+ mock_tasmota .assert_not_called ()
260+
261+ @patch ("lab_testing.server.tool_handlers.list_tasmota_devices" )
262+ def test_list_tasmota_devices_handler (self , mock_list ):
263+ """Test list_tasmota_devices handler"""
264+ mock_list .return_value = {"devices" : []}
265+
266+ result = handle_tool ("list_tasmota_devices" , {}, "test-123" , 0.0 )
267+
268+ assert len (result ) == 1
269+ assert result [0 ].type == "text"
270+ mock_list .assert_called_once ()
271+
272+ @patch ("lab_testing.server.tool_handlers.get_setup_instructions" )
273+ def test_vpn_setup_instructions_handler (self , mock_instructions ):
274+ """Test vpn_setup_instructions handler"""
275+ mock_instructions .return_value = {"instructions" : {}}
276+
277+ result = handle_tool ("vpn_setup_instructions" , {}, "test-123" , 0.0 )
278+
279+ assert len (result ) == 1
280+ assert result [0 ].type == "text"
281+ mock_instructions .assert_called_once ()
282+
283+ @patch ("lab_testing.server.tool_handlers.check_wireguard_installed" )
284+ def test_check_wireguard_installed_handler (self , mock_check ):
285+ """Test check_wireguard_installed handler"""
286+ mock_check .return_value = {"installed" : True }
287+
288+ result = handle_tool ("check_wireguard_installed" , {}, "test-123" , 0.0 )
289+
290+ assert len (result ) == 1
291+ assert result [0 ].type == "text"
292+ mock_check .assert_called_once ()
293+
294+ @patch ("lab_testing.server.tool_handlers.get_help_content" )
295+ def test_help_handler_all (self , mock_help ):
296+ """Test help handler with all topics"""
297+ mock_help .return_value = {"tools" : {}, "resources" : {}}
298+
299+ result = handle_tool ("help" , {"topic" : "all" }, "test-123" , 0.0 )
300+
301+ assert len (result ) == 1
302+ assert result [0 ].type == "text"
303+ mock_help .assert_called_once ()
304+
305+ @patch ("lab_testing.server.tool_handlers.get_help_content" )
306+ def test_help_handler_specific_topic (self , mock_help ):
307+ """Test help handler with specific topic"""
308+ mock_help .return_value = {"tools" : {}, "resources" : {}}
309+
310+ result = handle_tool ("help" , {"topic" : "tools" }, "test-123" , 0.0 )
311+
312+ assert len (result ) == 1
313+ result_text = json .loads (result [0 ].text )
314+ assert result_text ["success" ] is True
315+ assert "tools" in result_text ["content" ]
316+
317+ @patch ("lab_testing.server.tool_handlers.get_help_content" )
318+ def test_help_handler_unknown_topic (self , mock_help ):
319+ """Test help handler with unknown topic"""
320+ mock_help .return_value = {"tools" : {}, "resources" : {}}
321+
322+ result = handle_tool ("help" , {"topic" : "unknown" }, "test-123" , 0.0 )
323+
324+ assert len (result ) == 1
325+ result_text = json .loads (result [0 ].text )
326+ assert result_text ["success" ] is False
327+ assert "error" in result_text
328+
329+ @patch ("lab_testing.server.tool_handlers.format_error_response" )
330+ def test_tool_handler_exception (self , mock_error ):
331+ """Test tool handler exception handling"""
332+ mock_error .return_value = {"error" : "Test error" }
333+ with patch (
334+ "lab_testing.server.tool_handlers.list_devices" , side_effect = Exception ("Test error" )
335+ ):
336+ result = handle_tool ("list_devices" , {}, "test-123" , 0.0 )
337+
338+ assert len (result ) == 1
339+ assert result [0 ].type == "text"
340+ mock_error .assert_called_once ()
0 commit comments