|
6 | 6 | from dataclasses import dataclass |
7 | 7 | from datetime import datetime |
8 | 8 | from typing import Any |
| 9 | +from unittest.mock import AsyncMock, MagicMock |
9 | 10 |
|
10 | 11 | import pytest |
11 | 12 | import sqlalchemy as sa |
@@ -176,29 +177,49 @@ async def test_restart_nonexistent_session_returns_not_found( |
176 | 177 | class TestSessionStatusTransition: |
177 | 178 | """Test session status transit endpoint (POST /_/transit-status).""" |
178 | 179 |
|
179 | | - @pytest.mark.xfail( |
180 | | - reason="Requires live agent — agent_registry mock does not return proper transit result" |
181 | | - ) |
182 | 180 | async def test_transit_single_session_status( |
183 | 181 | self, |
184 | 182 | admin_registry: BackendAIClientRegistry, |
185 | 183 | session_seed: SessionSeedData, |
| 184 | + agent_registry: AsyncMock, |
186 | 185 | ) -> None: |
| 186 | + mock_lifecycle_mgr = AsyncMock() |
| 187 | + mock_row = MagicMock() |
| 188 | + mock_row.id = session_seed.session_id |
| 189 | + mock_row.status = SessionStatus.RUNNING |
| 190 | + mock_lifecycle_mgr.transit_session_status.return_value = [(mock_row, False)] |
| 191 | + mock_lifecycle_mgr.deregister_status_updatable_session.return_value = 0 |
| 192 | + agent_registry.session_lifecycle_mgr = mock_lifecycle_mgr |
| 193 | + |
187 | 194 | result = await admin_registry.session.transit_session_status( |
188 | 195 | TransitSessionStatusRequest(ids=[session_seed.session_id]), |
189 | 196 | ) |
190 | 197 | assert isinstance(result, TransitSessionStatusResponse) |
191 | 198 | assert isinstance(result.session_status_map, dict) |
192 | 199 |
|
193 | | - @pytest.mark.xfail( |
194 | | - reason="Requires live agent — agent_registry mock does not return proper transit result" |
195 | | - ) |
196 | 200 | async def test_transit_multiple_sessions( |
197 | 201 | self, |
198 | 202 | admin_registry: BackendAIClientRegistry, |
199 | 203 | session_seed: SessionSeedData, |
200 | 204 | terminated_session_seed: SessionSeedData, |
| 205 | + agent_registry: AsyncMock, |
201 | 206 | ) -> None: |
| 207 | + mock_lifecycle_mgr = AsyncMock() |
| 208 | + mock_row_running = MagicMock() |
| 209 | + mock_row_running.id = session_seed.session_id |
| 210 | + mock_row_running.status = SessionStatus.RUNNING |
| 211 | + |
| 212 | + mock_row_terminated = MagicMock() |
| 213 | + mock_row_terminated.id = terminated_session_seed.session_id |
| 214 | + mock_row_terminated.status = SessionStatus.TERMINATED |
| 215 | + |
| 216 | + mock_lifecycle_mgr.transit_session_status.side_effect = [ |
| 217 | + [(mock_row_running, False)], |
| 218 | + [(mock_row_terminated, False)], |
| 219 | + ] |
| 220 | + mock_lifecycle_mgr.deregister_status_updatable_session.return_value = 0 |
| 221 | + agent_registry.session_lifecycle_mgr = mock_lifecycle_mgr |
| 222 | + |
202 | 223 | result = await admin_registry.session.transit_session_status( |
203 | 224 | TransitSessionStatusRequest( |
204 | 225 | ids=[session_seed.session_id, terminated_session_seed.session_id], |
|
0 commit comments