|
6 | 6 |
|
7 | 7 | from __future__ import annotations |
8 | 8 |
|
| 9 | +import asyncio |
9 | 10 | import os |
10 | 11 | import uuid |
11 | 12 | from datetime import UTC, datetime |
@@ -282,63 +283,82 @@ async def test_should_add_secret_filter_values(self, ctx: E2ETestContext): |
282 | 283 | # error from anyio. We don't want it to fail the test. |
283 | 284 | pass |
284 | 285 |
|
285 | | - async def test_should_list_find_and_inspect_persisted_session_state(self, ctx: E2ETestContext): |
| 286 | + async def test_should_list_find_and_inspect_persisted_session_state( |
| 287 | + self, authed_ctx: E2ETestContext |
| 288 | + ): |
| 289 | + token = os.environ.get("GITHUB_TOKEN", "fakevalue") |
| 290 | + await _configure_user(authed_ctx, token) |
| 291 | + client = _make_authed_client(authed_ctx, token) |
| 292 | + |
286 | 293 | session_id = str(uuid.uuid4()) |
287 | | - working_directory = Path(ctx.work_dir) / f"server-rpc-list-{uuid.uuid4().hex}" |
| 294 | + working_directory = Path(authed_ctx.work_dir) / f"server-rpc-list-{uuid.uuid4().hex}" |
288 | 295 | working_directory.mkdir(parents=True, exist_ok=True) |
289 | 296 | missing_task_id = f"missing-task-{uuid.uuid4().hex}" |
290 | 297 | missing_session_id = str(uuid.uuid4()) |
291 | | - |
292 | | - session = await ctx.client.create_session( |
293 | | - session_id=session_id, |
294 | | - working_directory=str(working_directory), |
295 | | - on_permission_request=PermissionHandler.approve_all, |
296 | | - ) |
| 298 | + session = None |
297 | 299 | try: |
298 | | - await session.log("SERVER_RPC_LIST_READY") |
299 | | - save = await ctx.client.rpc.sessions.save(SessionsSaveRequest(session_id=session_id)) |
| 300 | + await client.start() |
| 301 | + session = await client.create_session( |
| 302 | + session_id=session_id, |
| 303 | + working_directory=str(working_directory), |
| 304 | + on_permission_request=PermissionHandler.approve_all, |
| 305 | + ) |
| 306 | + |
| 307 | + await session.send("Record a turn for sessions.list discriminator coverage", mode="enqueue") |
| 308 | + await asyncio.sleep(0.2) |
| 309 | + save = await client.rpc.sessions.save(SessionsSaveRequest(session_id=session_id)) |
300 | 310 | assert save is not None |
301 | 311 |
|
302 | | - listed = await ctx.client.rpc.sessions.list( |
| 312 | + listed = await client.rpc.sessions.list( |
303 | 313 | SessionsListRequest( |
304 | 314 | filter=SessionListFilter(cwd=str(working_directory)), |
305 | 315 | metadata_limit=0, |
306 | 316 | ) |
307 | 317 | ) |
308 | 318 | assert listed.sessions is not None |
| 319 | + assert len(listed.sessions) >= 1 |
| 320 | + matching = [item for item in listed.sessions if item.session_id == session_id] |
| 321 | + assert len(matching) == 1 |
| 322 | + assert isinstance(matching[0], LocalSessionMetadataValue) |
| 323 | + assert matching[0].is_remote is False |
309 | 324 | assert all( |
310 | 325 | item.context is None |
311 | 326 | or os.path.normcase(os.path.abspath(item.context.cwd)) |
312 | 327 | == os.path.normcase(os.path.abspath(str(working_directory))) |
313 | 328 | for item in listed.sessions |
314 | 329 | ) |
315 | 330 |
|
316 | | - by_prefix = await ctx.client.rpc.sessions.find_by_prefix( |
| 331 | + by_prefix = await client.rpc.sessions.find_by_prefix( |
317 | 332 | SessionsFindByPrefixRequest(prefix=session_id[:8]) |
318 | 333 | ) |
319 | 334 | assert by_prefix.session_id in (None, session_id) |
320 | 335 |
|
321 | | - by_task = await ctx.client.rpc.sessions.find_by_task_id( |
| 336 | + by_task = await client.rpc.sessions.find_by_task_id( |
322 | 337 | SessionsFindByTaskIDRequest(task_id=missing_task_id) |
323 | 338 | ) |
324 | 339 | assert by_task.session_id is None |
325 | 340 |
|
326 | | - last_for_context = await ctx.client.rpc.sessions.get_last_for_context( |
| 341 | + last_for_context = await client.rpc.sessions.get_last_for_context( |
327 | 342 | SessionsGetLastForContextRequest(context=SessionContext(cwd=str(working_directory))) |
328 | 343 | ) |
329 | 344 | assert last_for_context.session_id in (None, session_id) |
330 | 345 |
|
331 | | - sizes = await ctx.client.rpc.sessions.get_sizes() |
| 346 | + sizes = await client.rpc.sessions.get_sizes() |
332 | 347 | assert sizes.sizes is not None |
333 | 348 | if session_id in sizes.sizes: |
334 | 349 | assert sizes.sizes[session_id] >= 0 |
335 | 350 |
|
336 | | - in_use = await ctx.client.rpc.sessions.check_in_use( |
| 351 | + in_use = await client.rpc.sessions.check_in_use( |
337 | 352 | SessionsCheckInUseRequest(session_ids=[session_id, missing_session_id]) |
338 | 353 | ) |
339 | 354 | assert missing_session_id not in in_use.in_use |
340 | 355 | finally: |
341 | | - await session.disconnect() |
| 356 | + if session is not None: |
| 357 | + await session.disconnect() |
| 358 | + try: |
| 359 | + await client.stop() |
| 360 | + except ExceptionGroup: |
| 361 | + pass |
342 | 362 |
|
343 | 363 | async def test_should_enrich_basic_session_metadata(self, ctx: E2ETestContext): |
344 | 364 | session_id = str(uuid.uuid4()) |
|
0 commit comments