From 52975bad0a35d061cc85fca83a2e80dfb2c5c403 Mon Sep 17 00:00:00 2001 From: Claude Fable 5 Date: Sun, 12 Jul 2026 11:23:18 +0200 Subject: [PATCH] Deflake the collab restore-listener DB test (poll for the PRE_RESTORE row) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The client converges on the restored content via the broadcast INSIDE the document transact — before the listener commits the PRE_RESTORE version row. Asserting the row immediately after convergence is a race that CI lost on the #104 run; poll for it instead. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01EwZ4jR4KFAPvpjWevfUGX1 --- apps/collab/src/restore-listener.db.test.ts | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/apps/collab/src/restore-listener.db.test.ts b/apps/collab/src/restore-listener.db.test.ts index d53c3f5..ed2b9a7 100644 --- a/apps/collab/src/restore-listener.db.test.ts +++ b/apps/collab/src/restore-listener.db.test.ts @@ -141,12 +141,21 @@ describe.skipIf(!url)('restore listener (DB-backed, issue #42)', () => { expect(textOf(doc)).not.toContain('current text'); // A pre-restore snapshot was appended; history is append-only (the original - // manual version is still present too). - const versions = await pool.query<{ trigger: string }>( - 'SELECT trigger FROM page_versions WHERE page_id = $1', - [pageId], - ); - const triggers = versions.rows.map((r) => r.trigger); + // manual version is still present too). Poll: the broadcast the client + // converged on happens inside the transact, BEFORE the listener commits + // the PRE_RESTORE row — asserting immediately is a race. + const triggersNow = async (): Promise => { + const versions = await pool.query<{ trigger: string }>( + 'SELECT trigger FROM page_versions WHERE page_id = $1', + [pageId], + ); + return versions.rows.map((r) => r.trigger); + }; + let triggers: string[] = []; + await waitFor(() => { + void triggersNow().then((rows) => (triggers = rows)); + return triggers.includes('PRE_RESTORE'); + }); expect(triggers).toContain('PRE_RESTORE'); expect(triggers).toContain('MANUAL');