From a000235826c8a2a6b3b98af7f11c12ac54f9e8be Mon Sep 17 00:00:00 2001 From: William Valentin Date: Mon, 16 Feb 2026 20:56:34 -0800 Subject: [PATCH] test(companion): add platform waitForIdle integration coverage --- docs/plans/state.json | 11 ++++++++++ .../platformClients.integration.test.ts | 21 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/docs/plans/state.json b/docs/plans/state.json index f2d334f..1dd2f9d 100644 --- a/docs/plans/state.json +++ b/docs/plans/state.json @@ -916,6 +916,17 @@ ], "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-platform-wait-for-idle-integration-coverage": { + "status": "completed", + "date": "2026-02-17", + "updated": "2026-02-17", + "summary": "Added platform integration coverage for `waitForIdle()` to verify idle-drain synchronization resolves after pending event waiters are cleared via platform wrapper APIs.", + "files_modified": [ + "src/companion/platformClients.integration.test.ts", + "docs/plans/state.json" + ], + "test_status": "pnpm test:run src/companion/platformClients.integration.test.ts src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.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 02da97e..7aa4012 100644 --- a/src/companion/platformClients.integration.test.ts +++ b/src/companion/platformClients.integration.test.ts @@ -150,6 +150,27 @@ describe('platform clients integration', () => { expect(client.pendingEventWaitCount).toBe(0); }); + it('platform waitForIdle resolves after pending waiters are cleared', async () => { + if (!LISTEN_ALLOWED) { + return; + } + + const runtime = createRuntime(); + const client = new IOSCompanionClient({ runtime, nodeId: 'ios-wait-idle-e2e' }); + + const pending = client.waitForAnyEvent(['agent.stream'], { timeoutMs: 10_000 }).catch(() => undefined); + expect(client.hasPendingWork).toBe(true); + + const idle = client.waitForIdle({ timeoutMs: 1_000, pollIntervalMs: 5 }); + setTimeout(() => { + client.clearEventSubscriptions(); + }, 20); + + await expect(idle).resolves.toBeUndefined(); + await pending; + expect(client.hasPendingWork).toBe(false); + }); + it('platform connected reflects runtime connection lifecycle', async () => { if (!LISTEN_ALLOWED) { return;