Skip to content

Commit 59ce28d

Browse files
python: strengthen sessions.list e2e discriminator coverage
Ensure the rpc sessions.list e2e test persists at least one session entry and asserts the matching session decodes to LocalSessionMetadataValue with is_remote=False, exercising the boolean discriminator path end-to-end. Use an authed client token from GITHUB_TOKEN (default fakevalue) and enqueue a user turn before save/list so the entry is present without depending on full model completion. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent c2bd5bf commit 59ce28d

1 file changed

Lines changed: 37 additions & 17 deletions

File tree

python/e2e/test_rpc_server_e2e.py

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
from __future__ import annotations
88

9+
import asyncio
910
import os
1011
import uuid
1112
from datetime import UTC, datetime
@@ -282,63 +283,82 @@ async def test_should_add_secret_filter_values(self, ctx: E2ETestContext):
282283
# error from anyio. We don't want it to fail the test.
283284
pass
284285

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+
286293
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}"
288295
working_directory.mkdir(parents=True, exist_ok=True)
289296
missing_task_id = f"missing-task-{uuid.uuid4().hex}"
290297
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
297299
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))
300310
assert save is not None
301311

302-
listed = await ctx.client.rpc.sessions.list(
312+
listed = await client.rpc.sessions.list(
303313
SessionsListRequest(
304314
filter=SessionListFilter(cwd=str(working_directory)),
305315
metadata_limit=0,
306316
)
307317
)
308318
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
309324
assert all(
310325
item.context is None
311326
or os.path.normcase(os.path.abspath(item.context.cwd))
312327
== os.path.normcase(os.path.abspath(str(working_directory)))
313328
for item in listed.sessions
314329
)
315330

316-
by_prefix = await ctx.client.rpc.sessions.find_by_prefix(
331+
by_prefix = await client.rpc.sessions.find_by_prefix(
317332
SessionsFindByPrefixRequest(prefix=session_id[:8])
318333
)
319334
assert by_prefix.session_id in (None, session_id)
320335

321-
by_task = await ctx.client.rpc.sessions.find_by_task_id(
336+
by_task = await client.rpc.sessions.find_by_task_id(
322337
SessionsFindByTaskIDRequest(task_id=missing_task_id)
323338
)
324339
assert by_task.session_id is None
325340

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(
327342
SessionsGetLastForContextRequest(context=SessionContext(cwd=str(working_directory)))
328343
)
329344
assert last_for_context.session_id in (None, session_id)
330345

331-
sizes = await ctx.client.rpc.sessions.get_sizes()
346+
sizes = await client.rpc.sessions.get_sizes()
332347
assert sizes.sizes is not None
333348
if session_id in sizes.sizes:
334349
assert sizes.sizes[session_id] >= 0
335350

336-
in_use = await ctx.client.rpc.sessions.check_in_use(
351+
in_use = await client.rpc.sessions.check_in_use(
337352
SessionsCheckInUseRequest(session_ids=[session_id, missing_session_id])
338353
)
339354
assert missing_session_id not in in_use.in_use
340355
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
342362

343363
async def test_should_enrich_basic_session_metadata(self, ctx: E2ETestContext):
344364
session_id = str(uuid.uuid4())

0 commit comments

Comments
 (0)