From 611ebd0645fa993a292757b00a630035fda5060a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98=E9=98=BF=E6=B1=9F=28Relakkes?= =?UTF-8?q?=29?= Date: Tue, 19 May 2026 00:33:45 +0800 Subject: [PATCH] Stabilize adapter coverage after main sync The local main sync exposed a flaky WsBridge integration test during coverage: the client-side open event could resolve before the test's server-side connection array observed the connection. The test now waits for the server connection event before sending messages through the captured socket, preserving the FIFO behavior assertion without changing production bridge logic. Constraint: Worktree validation must cover the latest local main commit before merging back Rejected: Retry the full quality gate without a code change | the same timing race can recur and hide real merge readiness Confidence: high Scope-risk: narrow Directive: Keep WsBridge integration tests synchronized on server-side connection readiness before using captured sockets Tested: bun test adapters/common/__tests__/ws-bridge.test.ts Tested: bun test --coverage --coverage-reporter=lcov --coverage-reporter=text --coverage-dir /tmp/cc-haha-adapters-coverage adapters --- adapters/common/__tests__/ws-bridge.test.ts | 23 +++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/adapters/common/__tests__/ws-bridge.test.ts b/adapters/common/__tests__/ws-bridge.test.ts index 6f4c4490..7e8618b2 100644 --- a/adapters/common/__tests__/ws-bridge.test.ts +++ b/adapters/common/__tests__/ws-bridge.test.ts @@ -97,6 +97,22 @@ describe('WsBridge: handler serialization', () => { }) }) + async function waitForServerConnection(): Promise { + if (connections[0]) return connections[0] + await new Promise((resolve, reject) => { + const onConnection = () => { + clearTimeout(timer) + resolve() + } + const timer = setTimeout(() => { + server.off('connection', onConnection) + reject(new Error('Timed out waiting for test WebSocket connection')) + }, 500) + server.once('connection', onConnection) + }) + return connections[0]! + } + it('processes handler calls in strict FIFO order per chatId', async () => { const bridge = new WsBridge(serverUrl, 'test') const events: string[] = [] @@ -115,8 +131,7 @@ describe('WsBridge: handler serialization', () => { bridge.connectSession('chat-1', 'sess-1') const ok = await bridge.waitForOpen('chat-1') expect(ok).toBe(true) - expect(connections.length).toBe(1) - const serverWs = connections[0]! + const serverWs = await waitForServerConnection() // Blast three messages back-to-back. msg1 is slow, msg2/msg3 are fast. // With serialization: start:1, end:1, start:2, end:2, start:3, end:3 @@ -151,7 +166,7 @@ describe('WsBridge: handler serialization', () => { bridge.connectSession('chat-err', 'sess-err') await bridge.waitForOpen('chat-err') - const serverWs = connections[0]! + const serverWs = await waitForServerConnection() serverWs.send(JSON.stringify({ throw: true })) serverWs.send(JSON.stringify({ tag: 'after' })) @@ -169,7 +184,7 @@ describe('WsBridge: handler serialization', () => { bridge.connectSession('chat-deleted', 'sess-deleted') await bridge.waitForOpen('chat-deleted') - const serverWs = connections[0]! + const serverWs = await waitForServerConnection() serverWs.close(1000, 'session deleted') await new Promise((resolve) => setTimeout(resolve, 50))