66"""
77import pytest
88from unittest .mock import AsyncMock , Mock , MagicMock , patch
9+ from traitlets .config import LoggingConfigurable
910from jupyter_server_documents .session_manager import YDocSessionManager
1011
1112
1213@pytest .fixture
1314def 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