Skip to content

Commit add5751

Browse files
committed
Fix test fixtures for YDocSessionManager unit tests
Fixed issues with test fixture mocking: - Use LoggingConfigurable parent class for proper traitlets compatibility - Mock parent class's get_session method instead of YDocSessionManager's - Make kernel_client.add_yroom an AsyncMock for proper async behavior All 9 tests now pass successfully.
1 parent 7c4c985 commit add5751

File tree

1 file changed

+46
-23
lines changed

1 file changed

+46
-23
lines changed

jupyter_server_documents/tests/test_session_manager.py

Lines changed: 46 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,35 @@
66
"""
77
import pytest
88
from unittest.mock import AsyncMock, Mock, MagicMock, patch
9+
from traitlets.config import LoggingConfigurable
910
from jupyter_server_documents.session_manager import YDocSessionManager
1011

1112

1213
@pytest.fixture
1314
def session_manager():
1415
"""Create a mock session manager for testing."""
15-
manager = YDocSessionManager()
16-
17-
# Mock required dependencies
18-
manager.serverapp = Mock()
19-
manager.file_id_manager = Mock()
20-
manager.yroom_manager = Mock()
21-
manager.log = Mock()
16+
# Create mock dependencies
17+
mock_file_id_manager = Mock()
18+
mock_yroom_manager = Mock()
19+
mock_kernel_manager = Mock()
20+
21+
# Create a Configurable parent with the proper structure
22+
class MockServerApp(LoggingConfigurable):
23+
@property
24+
def kernel_manager(self):
25+
return mock_kernel_manager
26+
27+
@property
28+
def web_app(self):
29+
mock_web_app = Mock()
30+
mock_web_app.settings = {
31+
"file_id_manager": mock_file_id_manager,
32+
"yroom_manager": mock_yroom_manager
33+
}
34+
return mock_web_app
35+
36+
# Create the session manager with mock parent
37+
manager = YDocSessionManager(parent=MockServerApp())
2238

2339
# Initialize the _room_ids dict
2440
manager._room_ids = {}
@@ -59,6 +75,9 @@ async def test_uses_cached_room_id(self, session_manager, mock_yroom, mock_kerne
5975
session_manager.yroom_manager.get_room.return_value = mock_yroom
6076
mock_yroom.room_id = room_id
6177

78+
# Mock kernel client's add_yroom method as async
79+
mock_kernel_client.add_yroom = AsyncMock()
80+
6281
# Mock kernel manager
6382
mock_kernel_manager = Mock()
6483
mock_kernel_manager.kernel_client = mock_kernel_client
@@ -69,8 +88,8 @@ async def test_uses_cached_room_id(self, session_manager, mock_yroom, mock_kerne
6988
# Verify cached room_id was used
7089
session_manager.yroom_manager.get_room.assert_called_once_with(room_id)
7190

72-
# Verify yroom was added to kernel client
73-
assert mock_yroom in mock_kernel_client._yrooms
91+
# Verify add_yroom was called with the mock yroom
92+
mock_kernel_client.add_yroom.assert_called_once_with(mock_yroom)
7493

7594
@pytest.mark.asyncio
7695
async def test_reconstructs_room_id_from_session_path(self, session_manager, mock_yroom, mock_kernel_client):
@@ -81,16 +100,16 @@ async def test_reconstructs_room_id_from_session_path(self, session_manager, moc
81100
file_id = "reconstructed-file-id"
82101
room_id = f"json:notebook:{file_id}"
83102

84-
# Mock get_session to return session with path
103+
# Mock get_session from parent (SessionManager) to return session with path
85104
mock_session = {
86105
"id": session_id,
87106
"type": "notebook",
88107
"path": path
89108
}
90109

91-
with patch.object(YDocSessionManager, 'get_session', new_callable=AsyncMock) as mock_get_session:
92-
# Use super() call to avoid recursion
93-
mock_get_session.return_value = mock_session
110+
# Patch the parent class's get_session method
111+
with patch('jupyter_server.services.sessions.sessionmanager.SessionManager.get_session', new_callable=AsyncMock) as mock_parent_get_session:
112+
mock_parent_get_session.return_value = mock_session
94113

95114
# Mock file_id_manager
96115
session_manager.file_id_manager.index.return_value = file_id
@@ -99,6 +118,9 @@ async def test_reconstructs_room_id_from_session_path(self, session_manager, moc
99118
session_manager.yroom_manager.get_room.return_value = mock_yroom
100119
mock_yroom.room_id = room_id
101120

121+
# Mock kernel client's add_yroom as async
122+
mock_kernel_client.add_yroom = AsyncMock()
123+
102124
# Mock kernel manager
103125
mock_kernel_manager = Mock()
104126
mock_kernel_manager.kernel_client = mock_kernel_client
@@ -112,8 +134,8 @@ async def test_reconstructs_room_id_from_session_path(self, session_manager, moc
112134
# Verify room_id was cached
113135
assert session_manager._room_ids[session_id] == room_id
114136

115-
# Verify yroom was added to kernel client
116-
assert mock_yroom in mock_kernel_client._yrooms
137+
# Verify add_yroom was called
138+
mock_kernel_client.add_yroom.assert_called_once_with(mock_yroom)
117139

118140
@pytest.mark.asyncio
119141
async def test_skips_non_notebook_sessions(self, session_manager):
@@ -128,8 +150,8 @@ async def test_skips_non_notebook_sessions(self, session_manager):
128150
"path": "/path/to/console"
129151
}
130152

131-
with patch.object(YDocSessionManager, 'get_session', new_callable=AsyncMock) as mock_get_session:
132-
mock_get_session.return_value = mock_session
153+
with patch('jupyter_server.services.sessions.sessionmanager.SessionManager.get_session', new_callable=AsyncMock) as mock_parent_get_session:
154+
mock_parent_get_session.return_value = mock_session
133155

134156
await session_manager._ensure_yroom_connected(session_id, kernel_id)
135157

@@ -221,8 +243,9 @@ async def test_calls_ensure_yroom_connected(self, session_manager):
221243
"type": "notebook"
222244
}
223245

224-
with patch.object(YDocSessionManager, 'get_session', new_callable=AsyncMock) as mock_super_get_session:
225-
mock_super_get_session.return_value = mock_session
246+
# Patch the parent SessionManager's get_session
247+
with patch('jupyter_server.services.sessions.sessionmanager.SessionManager.get_session', new_callable=AsyncMock) as mock_parent_get_session:
248+
mock_parent_get_session.return_value = mock_session
226249

227250
with patch.object(session_manager, '_ensure_yroom_connected', new_callable=AsyncMock) as mock_ensure:
228251
result = await session_manager.get_session(session_id=session_id)
@@ -236,8 +259,8 @@ async def test_calls_ensure_yroom_connected(self, session_manager):
236259
@pytest.mark.asyncio
237260
async def test_handles_none_session(self, session_manager):
238261
"""Test that get_session handles None session gracefully."""
239-
with patch.object(YDocSessionManager, 'get_session', new_callable=AsyncMock) as mock_super_get_session:
240-
mock_super_get_session.return_value = None
262+
with patch('jupyter_server.services.sessions.sessionmanager.SessionManager.get_session', new_callable=AsyncMock) as mock_parent_get_session:
263+
mock_parent_get_session.return_value = None
241264

242265
with patch.object(session_manager, '_ensure_yroom_connected', new_callable=AsyncMock) as mock_ensure:
243266
result = await session_manager.get_session(session_id="missing-session")
@@ -257,8 +280,8 @@ async def test_handles_session_without_kernel(self, session_manager):
257280
"type": "notebook"
258281
}
259282

260-
with patch.object(YDocSessionManager, 'get_session', new_callable=AsyncMock) as mock_super_get_session:
261-
mock_super_get_session.return_value = mock_session
283+
with patch('jupyter_server.services.sessions.sessionmanager.SessionManager.get_session', new_callable=AsyncMock) as mock_parent_get_session:
284+
mock_parent_get_session.return_value = mock_session
262285

263286
with patch.object(session_manager, '_ensure_yroom_connected', new_callable=AsyncMock) as mock_ensure:
264287
result = await session_manager.get_session(session_id="session-123")

0 commit comments

Comments
 (0)