From 97ac9674950fde768ff3c34ad2fc1b6bacc44ccc Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Sun, 16 Aug 2026 19:12:14 +0200 Subject: [PATCH] test(app): cover composer growth bottom anchoring Composer height changes must preserve a bottom-pinned conversation while blank lines expand the input. --- .../e2e/browser/composer-whitespace.spec.ts | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/packages/app/e2e/browser/composer-whitespace.spec.ts b/packages/app/e2e/browser/composer-whitespace.spec.ts index f199f03ac..81c87d256 100644 --- a/packages/app/e2e/browser/composer-whitespace.spec.ts +++ b/packages/app/e2e/browser/composer-whitespace.spec.ts @@ -1,4 +1,10 @@ import { expect, test, type Page } from "../support/fixtures"; +import { + expectNearBottom, + scrollAgentChatToBottom, + waitForScrollableChat, +} from "../support/helpers/agent-bottom-anchor"; +import { awaitAssistantMessage } from "../support/helpers/agent-stream"; import { composerLocator, expectComposerVisible } from "../support/helpers/composer"; import { openAgentRoute, seedMockAgentWorkspace } from "../support/helpers/mock-agent"; @@ -86,3 +92,30 @@ test("blank composer lines remain present and keep their measured height", async await agent.cleanup(); } }); + +test("composer growth keeps a bottom-pinned chat at the bottom", async ({ page }) => { + test.setTimeout(90_000); + const agent = await seedMockAgentWorkspace({ + repoPrefix: "composer-bottom-anchor-", + title: "Composer bottom anchor", + initialPrompt: "Produce enough content to make the chat scrollable.", + }); + + try { + await openAgentRoute(page, agent); + await expectComposerVisible(page); + await awaitAssistantMessage(page); + await waitForScrollableChat(page, { minScrollableDistance: 200, timeout: 30_000 }); + await scrollAgentChatToBottom(page); + + const composer = composerLocator(page); + await composer.fill("alpha"); + for (let line = 0; line < 8; line += 1) { + await composer.press("Shift+Enter"); + } + + await expectNearBottom(page); + } finally { + await agent.cleanup(); + } +});