Skip to content

Commit 89d038c

Browse files
Fix session_manager_ref bug and add manager unit tests
Fix a bug where `session_manager_ref or []` would create a new empty list when an empty list was passed (since empty list is falsy), breaking the session manager reference chain. This prevented close_sse_stream from being called during SSE polling tests. Also add unit tests for StreamableHTTPSessionManager.close_sse_stream to ensure proper coverage of lines 297-301 in streamable_http_manager.py.
1 parent 99d1873 commit 89d038c

File tree

1 file changed

+37
-1
lines changed

1 file changed

+37
-1
lines changed

tests/shared/test_streamable_http.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ class ServerTest(Server): # pragma: no cover
118118
def __init__(self, session_manager_ref: list[StreamableHTTPSessionManager] | None = None):
119119
super().__init__(SERVER_NAME)
120120
self._lock = None # Will be initialized in async context
121-
self._session_manager_ref = session_manager_ref or []
121+
self._session_manager_ref = [] if session_manager_ref is None else session_manager_ref
122122

123123
@self.read_resource()
124124
async def handle_read_resource(uri: AnyUrl) -> str | bytes:
@@ -1798,6 +1798,42 @@ async def test_close_sse_stream_already_closed():
17981798
assert "request-456" not in transport._request_streams
17991799

18001800

1801+
@pytest.mark.anyio
1802+
async def test_manager_close_sse_stream():
1803+
"""Test StreamableHTTPSessionManager.close_sse_stream delegates to transport."""
1804+
from unittest.mock import AsyncMock
1805+
1806+
# Create a minimal server for the manager
1807+
server = Server("test-manager")
1808+
manager = StreamableHTTPSessionManager(app=server)
1809+
1810+
# Create a mock transport and add it to _server_instances
1811+
mock_transport = AsyncMock()
1812+
mock_transport.close_sse_stream = AsyncMock()
1813+
manager._server_instances["test-session-123"] = mock_transport
1814+
1815+
# Call close_sse_stream on the manager
1816+
result = await manager.close_sse_stream("test-session-123", "request-456")
1817+
1818+
# Should return True and delegate to transport
1819+
assert result is True
1820+
mock_transport.close_sse_stream.assert_awaited_once_with("request-456")
1821+
1822+
1823+
@pytest.mark.anyio
1824+
async def test_manager_close_sse_stream_session_not_found():
1825+
"""Test StreamableHTTPSessionManager.close_sse_stream returns False for unknown session."""
1826+
# Create a minimal server for the manager
1827+
server = Server("test-manager")
1828+
manager = StreamableHTTPSessionManager(app=server)
1829+
1830+
# No sessions in _server_instances
1831+
result = await manager.close_sse_stream("nonexistent-session", "request-123")
1832+
1833+
# Should return False
1834+
assert result is False
1835+
1836+
18011837
@pytest.mark.anyio
18021838
async def test_resume_stream_without_session_id():
18031839
"""Test resume_stream returns early without session ID."""

0 commit comments

Comments
 (0)