From 33e632dfcec1ea356e4d6d2baf1363e446ad01e0 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Wed, 15 Apr 2026 23:54:34 +0200 Subject: [PATCH] fix(coding-agent): stabilize edit tool redraw test --- packages/coding-agent/CHANGELOG.md | 4 +++ .../test/edit-tool-no-full-redraw.test.ts | 33 ++++++++++++++++--- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 7ccc4a2a..5a5d08e8 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Fixed + +- Fixed flaky `edit-tool-no-full-redraw` TUI tests by waiting for asynchronous preview and preflight error rendering instead of relying on fixed render ticks. + ## [0.67.3] - 2026-04-15 ### New Features diff --git a/packages/coding-agent/test/edit-tool-no-full-redraw.test.ts b/packages/coding-agent/test/edit-tool-no-full-redraw.test.ts index 639b6c6f..e4be669d 100644 --- a/packages/coding-agent/test/edit-tool-no-full-redraw.test.ts +++ b/packages/coding-agent/test/edit-tool-no-full-redraw.test.ts @@ -37,6 +37,25 @@ async function waitForRender(): Promise { await new Promise((resolve) => setTimeout(resolve, 0)); } +async function waitForRenderedText( + getRender: () => string, + expectedText: string, + onRetry?: () => void, + timeoutMs = 2000, +): Promise { + const deadline = Date.now() + timeoutMs; + let lastRender = ""; + while (Date.now() < deadline) { + onRetry?.(); + await waitForRender(); + lastRender = getRender(); + if (lastRender.includes(expectedText)) { + return lastRender; + } + } + throw new Error(`Timed out waiting for render to include "${expectedText}". Last render:\n${lastRender}`); +} + function createLargeEdits(lines: string[]): Edit[] { const targets = [50, 150, 250, 350, 450, 550, 650, 750, 850, 950]; return targets.map((lineNumber) => ({ @@ -99,9 +118,12 @@ describe("edit tool TUI rendering", () => { await waitForRender(); await waitForRender(); - const callOnlyRender = component.render(80).join("\n"); + const callOnlyRender = await waitForRenderedText( + () => component.render(80).join("\n"), + "line 50 changed", + () => tui.requestRender(true), + ); expect(callOnlyRender).toContain("edit"); - expect(callOnlyRender).toContain("line 50 changed"); expect(callOnlyRender).toContain("line 950 changed"); const redrawsBeforeResult = tui.fullRedraws; @@ -201,8 +223,11 @@ describe("edit tool TUI rendering", () => { await waitForRender(); await waitForRender(); - const rendered = component.render(80).join("\n"); - expect(rendered).toContain("Could not find"); + const rendered = await waitForRenderedText( + () => component.render(80).join("\n"), + "Could not find", + () => tui.requestRender(true), + ); expect(rendered).not.toContain("+1 "); expect(rendered).not.toContain("-1 "); });