@@ -54,6 +54,7 @@ class DummyClass:
5454# Import real MCP classes
5555try :
5656 from mcp import StdioServerParameters
57+ from mcp .types import EmptyResult
5758except ImportError :
5859 # Create a mock if MCP is not available
5960 class StdioServerParameters :
@@ -62,6 +63,9 @@ def __init__(self, command="test_command", args=None):
6263 self .command = command
6364 self .args = args or []
6465
66+ class EmptyResult :
67+ pass
68+
6569
6670class MockClientSession :
6771 """Mock ClientSession for testing."""
@@ -72,6 +76,7 @@ def __init__(self):
7276 self ._read_stream ._closed = False
7377 self ._write_stream ._closed = False
7478 self .initialize = AsyncMock ()
79+ self .send_ping = AsyncMock ()
7580
7681
7782class MockAsyncExitStack :
@@ -206,19 +211,52 @@ def test_merge_headers_sse(self):
206211 }
207212 assert merged == expected
208213
209- def test_is_session_disconnected (self ):
210- """Test session disconnection detection."""
214+ @pytest .mark .asyncio
215+ async def test_is_session_disconnected_when_connected (self ):
216+ """Test session disconnection detection when session is connected."""
211217 manager = MCPSessionManager (self .mock_stdio_connection_params )
218+ session = MockClientSession ()
219+ session .send_ping .return_value = EmptyResult ()
220+ assert not await manager ._is_session_disconnected (session )
221+ session .send_ping .assert_called_once ()
222+
223+ @pytest .mark .asyncio
224+ async def test_is_session_disconnected_read_stream_closed (self ):
225+ """Test session disconnection detection when read stream is closed."""
226+ manager = MCPSessionManager (self .mock_stdio_connection_params )
227+ session = MockClientSession ()
228+ session .send_ping .return_value = EmptyResult ()
229+ session ._read_stream ._closed = True
230+ assert await manager ._is_session_disconnected (session )
231+ session .send_ping .assert_not_called ()
212232
213- # Create mock session
233+ @pytest .mark .asyncio
234+ async def test_is_session_disconnected_write_stream_closed (self ):
235+ """Test session disconnection detection when write stream is closed."""
236+ manager = MCPSessionManager (self .mock_stdio_connection_params )
214237 session = MockClientSession ()
238+ session .send_ping .return_value = EmptyResult ()
239+ session ._write_stream ._closed = True
240+ assert await manager ._is_session_disconnected (session )
241+ session .send_ping .assert_not_called ()
215242
216- # Not disconnected
217- assert not manager ._is_session_disconnected (session )
243+ @pytest .mark .asyncio
244+ async def test_is_session_disconnected_ping_fails (self ):
245+ """Test session disconnection detection when ping fails."""
246+ manager = MCPSessionManager (self .mock_stdio_connection_params )
247+ session = MockClientSession ()
248+ session .send_ping .side_effect = Exception ("Ping failed" )
249+ assert await manager ._is_session_disconnected (session )
250+ session .send_ping .assert_called_once ()
218251
219- # Disconnected - read stream closed
220- session ._read_stream ._closed = True
221- assert manager ._is_session_disconnected (session )
252+ @pytest .mark .asyncio
253+ async def test_is_session_disconnected_ping_returns_wrong_result (self ):
254+ """Test session disconnection detection when ping returns wrong result."""
255+ manager = MCPSessionManager (self .mock_stdio_connection_params )
256+ session = MockClientSession ()
257+ session .send_ping .return_value = "Wrong result"
258+ assert await manager ._is_session_disconnected (session )
259+ session .send_ping .assert_called_once ()
222260
223261 @pytest .mark .asyncio
224262 async def test_create_session_stdio_new (self ):
@@ -271,6 +309,7 @@ async def test_create_session_reuse_existing(self):
271309 # Session is connected
272310 existing_session ._read_stream ._closed = False
273311 existing_session ._write_stream ._closed = False
312+ existing_session .send_ping .return_value = EmptyResult ()
274313
275314 session = await manager .create_session ()
276315
0 commit comments