From 7e556c5815cc5a7fa1d65be783ee6cbb23b52f6f Mon Sep 17 00:00:00 2001 From: William Valentin Date: Mon, 16 Feb 2026 20:53:27 -0800 Subject: [PATCH] test(companion): cover pending event wait count lifecycle --- docs/plans/state.json | 12 ++++++++++++ .../platformClients.integration.test.ts | 19 +++++++++++++++++++ src/companion/runtimeClient.test.ts | 3 +++ 3 files changed, 34 insertions(+) diff --git a/docs/plans/state.json b/docs/plans/state.json index 8269b3c..ad0ff3d 100644 --- a/docs/plans/state.json +++ b/docs/plans/state.json @@ -873,6 +873,18 @@ ], "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing" }, + "companion-pending-event-wait-count-lifecycle-coverage": { + "status": "completed", + "date": "2026-02-17", + "updated": "2026-02-17", + "summary": "Added lifecycle coverage for `pendingEventWaitCount` across runtime and platform wait flows, including `waitForAnyEvent()` increment/decrement and clear-subscription rejection teardown.", + "files_modified": [ + "src/companion/runtimeClient.test.ts", + "src/companion/platformClients.integration.test.ts", + "docs/plans/state.json" + ], + "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing" + }, "browser-tools-activation-clarity": { "status": "completed", "date": "2026-02-17", diff --git a/src/companion/platformClients.integration.test.ts b/src/companion/platformClients.integration.test.ts index 0c7e788..02da97e 100644 --- a/src/companion/platformClients.integration.test.ts +++ b/src/companion/platformClients.integration.test.ts @@ -131,6 +131,25 @@ describe('platform clients integration', () => { expect(client.eventSubscriptionCount).toBe(0); }); + it('platform pendingEventWaitCount tracks waitForAnyEvent lifecycle', async () => { + if (!LISTEN_ALLOWED) { + return; + } + + const runtime = createRuntime(); + const client = new IOSCompanionClient({ runtime, nodeId: 'ios-wait-count-e2e' }); + + expect(client.pendingEventWaitCount).toBe(0); + const awaited = expect( + client.waitForAnyEvent(['agent.stream'], { timeoutMs: 10_000 }), + ).rejects.toThrow('Event subscriptions cleared'); + expect(client.pendingEventWaitCount).toBe(1); + + client.clearEventSubscriptions(); + await awaited; + expect(client.pendingEventWaitCount).toBe(0); + }); + it('platform connected reflects runtime connection lifecycle', async () => { if (!LISTEN_ALLOWED) { return; diff --git a/src/companion/runtimeClient.test.ts b/src/companion/runtimeClient.test.ts index 792c26b..3e0be8c 100644 --- a/src/companion/runtimeClient.test.ts +++ b/src/companion/runtimeClient.test.ts @@ -528,10 +528,12 @@ describe('CompanionRuntimeClient', () => { const client = new CompanionRuntimeClient({ url: 'ws://127.0.0.1:1', }); + expect(client.pendingEventWaitCount).toBe(0); const awaited = client.waitForAnyEvent<{ active?: boolean; token?: string }>( ['agent.typing', 'agent.stream'], { timeoutMs: 2000 }, ); + expect(client.pendingEventWaitCount).toBe(1); (client as unknown as { handleMessage: (raw: string) => void }).handleMessage( JSON.stringify({ @@ -545,6 +547,7 @@ describe('CompanionRuntimeClient', () => { event: 'agent.typing', data: { active: true }, }); + expect(client.pendingEventWaitCount).toBe(0); }); it('waitForAnyEvent supports per-event predicate filtering', async () => {