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 "); });