diff --git a/apps/web/src/components/ChatView.browser.tsx b/apps/web/src/components/ChatView.browser.tsx index 0b49f1d7da..0f4dd85d1f 100644 --- a/apps/web/src/components/ChatView.browser.tsx +++ b/apps/web/src/components/ChatView.browser.tsx @@ -57,6 +57,7 @@ vi.mock("../lib/gitStatusState", () => ({ })); const THREAD_ID = "thread-browser-test" as ThreadId; +const THREAD_TITLE = "Browser test thread"; const ARCHIVED_SECONDARY_THREAD_ID = "thread-secondary-project-archived" as ThreadId; const PROJECT_ID = "project-1" as ProjectId; const SECOND_PROJECT_ID = "project-2" as ProjectId; @@ -288,7 +289,7 @@ function createSnapshotForTargetUser(options: { { id: THREAD_ID, projectId: PROJECT_ID, - title: "Browser test thread", + title: THREAD_TITLE, modelSelection: { provider: "codex", model: "gpt-5", @@ -3083,6 +3084,34 @@ describe("ChatView timeline estimator parity (full app)", () => { } }); + it("exposes the full thread title on the sidebar row tooltip", async () => { + const mounted = await mountChatView({ + viewport: DEFAULT_VIEWPORT, + snapshot: createSnapshotForTargetUser({ + targetMessageId: "msg-user-thread-tooltip-target" as MessageId, + targetText: "thread tooltip target", + }), + }); + + try { + const threadTitle = page.getByTestId(`thread-title-${THREAD_ID}`); + + await expect.element(threadTitle).toBeInTheDocument(); + await threadTitle.hover(); + + await vi.waitFor( + () => { + const tooltip = document.querySelector('[data-slot="tooltip-popup"]'); + expect(tooltip).not.toBeNull(); + expect(tooltip?.textContent).toContain(THREAD_TITLE); + }, + { timeout: 8_000, interval: 16 }, + ); + } finally { + await mounted.cleanup(); + } + }); + it("shows the confirm archive action after clicking the archive button", async () => { localStorage.setItem( "t3code:client-settings:v1", diff --git a/apps/web/src/components/Sidebar.tsx b/apps/web/src/components/Sidebar.tsx index 2495429efd..25fb8b03e8 100644 --- a/apps/web/src/components/Sidebar.tsx +++ b/apps/web/src/components/Sidebar.tsx @@ -647,7 +647,21 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: SidebarThreadRowP onClick={handleRenameInputClick} /> ) : ( - {thread.title} + + + {thread.title} + + } + /> + + {thread.title} + + )}