| ... | @@ -57,6 +57,7 @@ vi.mock("../lib/gitStatusState", () => ({ | ... | @@ -57,6 +57,7 @@ vi.mock("../lib/gitStatusState", () => ({ |
| 57 | })); | 57 | })); |
| 58 | | 58 | |
| 59 | const THREAD_ID = "thread-browser-test" as ThreadId; | 59 | const THREAD_ID = "thread-browser-test" as ThreadId; |
| | 60 | const THREAD_TITLE = "Browser test thread"; |
| 60 | const ARCHIVED_SECONDARY_THREAD_ID = "thread-secondary-project-archived" as ThreadId; | 61 | const ARCHIVED_SECONDARY_THREAD_ID = "thread-secondary-project-archived" as ThreadId; |
| 61 | const PROJECT_ID = "project-1" as ProjectId; | 62 | const PROJECT_ID = "project-1" as ProjectId; |
| 62 | const SECOND_PROJECT_ID = "project-2" as ProjectId; | 63 | const SECOND_PROJECT_ID = "project-2" as ProjectId; |
| ... | @@ -288,7 +289,7 @@ function createSnapshotForTargetUser(options: { | ... | @@ -288,7 +289,7 @@ function createSnapshotForTargetUser(options: { |
| 288 | { | 289 | { |
| 289 | id: THREAD_ID, | 290 | id: THREAD_ID, |
| 290 | projectId: PROJECT_ID, | 291 | projectId: PROJECT_ID, |
| 291 | title: "Browser test thread", | 292 | title: THREAD_TITLE, |
| 292 | modelSelection: { | 293 | modelSelection: { |
| 293 | provider: "codex", | 294 | provider: "codex", |
| 294 | model: "gpt-5", | 295 | model: "gpt-5", |
| ... | @@ -3413,6 +3414,34 @@ describe("ChatView timeline estimator parity (full app)", () => { | ... | @@ -3413,6 +3414,34 @@ describe("ChatView timeline estimator parity (full app)", () => { |
| 3413 | } | 3414 | } |
| 3414 | }); | 3415 | }); |
| 3415 | | 3416 | |
| | 3417 | it("exposes the full thread title on the sidebar row tooltip", async () => { |
| | 3418 | const mounted = await mountChatView({ |
| | 3419 | viewport: DEFAULT_VIEWPORT, |
| | 3420 | snapshot: createSnapshotForTargetUser({ |
| | 3421 | targetMessageId: "msg-user-thread-tooltip-target" as MessageId, |
| | 3422 | targetText: "thread tooltip target", |
| | 3423 | }), |
| | 3424 | }); |
| | 3425 | |
| | 3426 | try { |
| | 3427 | const threadTitle = page.getByTestId(`thread-title-${THREAD_ID}`); |
| | 3428 | |
| | 3429 | await expect.element(threadTitle).toBeInTheDocument(); |
| | 3430 | await threadTitle.hover(); |
| | 3431 | |
| | 3432 | await vi.waitFor( |
| | 3433 | () => { |
| | 3434 | const tooltip = document.querySelector<HTMLElement>('[data-slot="tooltip-popup"]'); |
| | 3435 | expect(tooltip).not.toBeNull(); |
| | 3436 | expect(tooltip?.textContent).toContain(THREAD_TITLE); |
| | 3437 | }, |
| | 3438 | { timeout: 8_000, interval: 16 }, |
| | 3439 | ); |
| | 3440 | } finally { |
| | 3441 | await mounted.cleanup(); |
| | 3442 | } |
| | 3443 | }); |
| | 3444 | |
| 3416 | it("shows the confirm archive action after clicking the archive button", async () => { | 3445 | it("shows the confirm archive action after clicking the archive button", async () => { |
| 3417 | localStorage.setItem( | 3446 | localStorage.setItem( |
| 3418 | "t3code:client-settings:v1", | 3447 | "t3code:client-settings:v1", |