@@ -18,6 +18,7 @@ def mock_nanokvm_client():
1818 # Mock authentication
1919 mock_client .authenticate = AsyncMock ()
2020 mock_client .logout = AsyncMock ()
21+ mock_client .close = AsyncMock ()
2122
2223 # Mock info
2324 mock_info = MagicMock ()
@@ -43,6 +44,8 @@ async def mock_stream():
4344 # Mock HID functions
4445 mock_client .paste_text = AsyncMock ()
4546 mock_client .reset_hid = AsyncMock ()
47+ mock_client .mouse_move_abs = AsyncMock ()
48+ mock_client .mouse_click = AsyncMock ()
4649
4750 # Mock reboot
4851 mock_client .reboot_system = AsyncMock ()
@@ -52,14 +55,19 @@ async def mock_stream():
5255 mock_images .files = ["/data/alpine-standard-3.23.2-x86_64.iso" , "/data/cs10-js.iso" ]
5356 mock_client .get_images = AsyncMock (return_value = mock_images )
5457
55- mock_client_class .return_value = mock_client
58+ # Mock context manager behavior
59+ mock_context = AsyncMock ()
60+ mock_context .__aenter__ = AsyncMock (return_value = mock_client )
61+ mock_context .__aexit__ = AsyncMock (return_value = None )
62+ mock_client_class .return_value = mock_context
63+
5664 yield mock_client
5765
5866
5967@pytest .fixture
6068def mock_aiohttp_session ():
6169 """Create a mock aiohttp ClientSession"""
62- with patch ("jumpstarter_driver_nanokvm.driver .ClientSession" ) as mock_session_class :
70+ with patch ("aiohttp .ClientSession" ) as mock_session_class :
6371 mock_session = AsyncMock ()
6472 mock_session .close = AsyncMock ()
6573 mock_session_class .return_value = mock_session
@@ -173,42 +181,28 @@ def test_nanokvm_client_creation():
173181
174182def test_nanokvm_mouse_move_abs (mock_nanokvm_client , mock_aiohttp_session ):
175183 """Test mouse absolute movement"""
176- with patch ("jumpstarter_driver_nanokvm.driver.ClientSession" ) as mock_session_class :
177- mock_ws = AsyncMock ()
178- mock_ws .send_json = AsyncMock ()
179- mock_session = AsyncMock ()
180- mock_session .ws_connect = AsyncMock (return_value = mock_ws )
181- mock_session .close = AsyncMock ()
182- mock_session_class .return_value = mock_session
183-
184- hid = NanoKVMHID (host = "test.local" , username = "admin" , password = "admin" )
184+ hid = NanoKVMHID (host = "test.local" , username = "admin" , password = "admin" )
185185
186- with serve (hid ) as client :
187- # Move mouse to absolute position
188- client .mouse_move_abs (32768 , 32768 )
186+ with serve (hid ) as client :
187+ # Move mouse to absolute position (normalized 0.0-1.0 coordinates)
188+ client .mouse_move_abs (0.5 , 0.5 )
189189
190- # Verify WebSocket message was sent
191- mock_ws . send_json . assert_called ( )
190+ # Verify the mock was called
191+ mock_nanokvm_client . mouse_move_abs . assert_called_once_with ( 0.5 , 0.5 )
192192
193193
194194def test_nanokvm_mouse_click (mock_nanokvm_client , mock_aiohttp_session ):
195195 """Test mouse click"""
196- with patch ("jumpstarter_driver_nanokvm.driver.ClientSession" ) as mock_session_class :
197- mock_ws = AsyncMock ()
198- mock_ws .send_json = AsyncMock ()
199- mock_session = AsyncMock ()
200- mock_session .ws_connect = AsyncMock (return_value = mock_ws )
201- mock_session .close = AsyncMock ()
202- mock_session_class .return_value = mock_session
196+ from nanokvm .models import MouseButton
203197
204- hid = NanoKVMHID (host = "test.local" , username = "admin" , password = "admin" )
198+ hid = NanoKVMHID (host = "test.local" , username = "admin" , password = "admin" )
205199
206- with serve (hid ) as client :
207- # Click left button
208- client .mouse_click ("left" )
200+ with serve (hid ) as client :
201+ # Click left button
202+ client .mouse_click ("left" )
209203
210- # Verify WebSocket messages were sent (down and up)
211- assert mock_ws . send_json . call_count >= 2
204+ # Verify the mock was called
205+ mock_nanokvm_client . mouse_click . assert_called_once_with ( MouseButton . LEFT , None , None )
212206
213207
214208def test_nanokvm_get_images (mock_nanokvm_client , mock_aiohttp_session ):
0 commit comments