From 9df2dfab240c038e1909c47698928df279ffbdcf Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Tue, 3 Nov 2026 18:36:29 -0800 Subject: [PATCH] test(web): wait for painted timeline before measuring work heading Wait for LegendList to finish its hidden initial layout before recording the heading position. Keep real timers running through the click and expansion so the virtualizer can complete its layout work. Co-Authored-By: GPT-6 Astra --- .../components/chat/MessagesTimeline.browser.test.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/web/src/components/chat/MessagesTimeline.browser.test.tsx b/apps/web/src/components/chat/MessagesTimeline.browser.test.tsx index 6b1df4ca16927..2769bee83699e 100644 --- a/apps/web/src/components/chat/MessagesTimeline.browser.test.tsx +++ b/apps/web/src/components/chat/MessagesTimeline.browser.test.tsx @@ -238,15 +238,15 @@ describe("MessagesTimeline work rows", () => { const heading = screen.getByRole("button", { name: /^Worked for/ }); await expect.element(heading).toBeVisible(); const viewport = props.listRef.current!.getScrollableNode()!; - await vi.waitFor(() => - expect(viewport.scrollHeight - viewport.clientHeight - viewport.scrollTop).toBeLessThan(2), - ); + await vi.waitFor(() => { + // LegendList hides its initial layout with opacity, which toBeVisible does not check. + expect(heading.element().checkVisibility({ checkOpacity: true })).toBe(true); + expect(viewport.scrollHeight - viewport.clientHeight - viewport.scrollTop).toBeLessThan(2); + }); expect(viewport.scrollTop).toBeGreaterThan(0); const top = heading.element().getBoundingClientRect().top; const height = viewport.scrollHeight; - using _timers = fakeTimers(); await heading.click(); - await act(() => vi.advanceTimersByTime(1000)); await vi.waitFor(() => { expect(viewport.scrollHeight).toBeGreaterThan(height + 500); expect(heading.element().getBoundingClientRect().top).toBeCloseTo(top, 0);