From 274bb97e0a65db37c82fef54b189f9067028c8b9 Mon Sep 17 00:00:00 2001 From: liyao Date: Thu, 24 Sep 2026 17:13:12 +0800 Subject: [PATCH] test(client): cover unnamed results and versionless update tooltips --- .../tests/desktop-update.client.spec.tsx | 13 +++++++++++++ .../tests/rename-assembly.client.spec.tsx | 6 +++--- .../client/ui-workspace/tests/rows.client.spec.tsx | 10 ++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/packages/client/ui-settings-general/tests/desktop-update.client.spec.tsx b/packages/client/ui-settings-general/tests/desktop-update.client.spec.tsx index 35970bff6f..505a02d969 100644 --- a/packages/client/ui-settings-general/tests/desktop-update.client.spec.tsx +++ b/packages/client/ui-settings-general/tests/desktop-update.client.spec.tsx @@ -164,3 +164,16 @@ it.each(['checking', 'verifying', 'installing'] as const)('shows only the versio expect((await screen.findByRole('tooltip')).textContent).toBe('0.1.7-alpha.2') } finally { f.view.unmount(); f.status.resolve({ phase: 'idle' }) } }) + +it.each([ + ['checking', '正在检查更新…'], + ['verifying', '正在校验更新文件…'], + ['installing', '正在准备重启…'], +] as const)('retains the state label when %s has no version', async (phase, label) => { + const f = fixture() + try { + await f.emit({ phase }) + fireEvent.focus(screen.getByRole('button', { name: label })) + expect((await screen.findByRole('tooltip')).textContent).toBe(label) + } finally { f.view.unmount(); f.status.resolve({ phase: 'idle' }) } +}) diff --git a/packages/client/ui-workspace/tests/rename-assembly.client.spec.tsx b/packages/client/ui-workspace/tests/rename-assembly.client.spec.tsx index cc785a041b..0187272d53 100644 --- a/packages/client/ui-workspace/tests/rename-assembly.client.spec.tsx +++ b/packages/client/ui-workspace/tests/rename-assembly.client.spec.tsx @@ -119,8 +119,8 @@ describe('session rename through the assembled browser', () => { registerAction('last', 600, -2, 'Last action') const view = runtime.renderRoot() - const row = (await view.findByText('Session title')).closest('[role="treeitem"]')! - const trigger = within(row as HTMLElement).getByLabelText('会话“Session title”的操作') + const row = (await view.findByText('Persisted title')).closest('[role="treeitem"]')! + const trigger = within(row as HTMLElement).getByLabelText('会话“Persisted title”的操作') fireEvent.click(trigger) expect(view.getAllByRole('menuitem').map(item => item.textContent)).toEqual([ '置顶会话', '重命名', '分叉会话', '归档会话', 'Export action', 'Last action', @@ -134,7 +134,7 @@ describe('session rename through the assembled browser', () => { fireEvent.keyDown(last, { key: 'ArrowUp' }) expect(document.activeElement).toBe(exportRow) fireEvent.click(exportRow) - expect(selected).toHaveBeenCalledWith('export', SID, 'Session title') + expect(selected).toHaveBeenCalledWith('export', SID, 'Persisted title') // The plugin row dismissed the menu through the bound open-state hook; // the list returns focus to the trigger. expect(view.queryByRole('menu')).toBeNull() diff --git a/packages/client/ui-workspace/tests/rows.client.spec.tsx b/packages/client/ui-workspace/tests/rows.client.spec.tsx index f1c8ef7574..a2338d6284 100644 --- a/packages/client/ui-workspace/tests/rows.client.spec.tsx +++ b/packages/client/ui-workspace/tests/rows.client.spec.tsx @@ -1088,3 +1088,13 @@ it.each([['未命名', t], ['Untitled', tEn]])('labels unnamed history as %s', ( renderSlot={() => null} t={translate} />) expect(screen.getByText(label)).toBeTruthy() }) + +it.each([['未命名', t], ['Untitled', tEn]])('labels unnamed search results as %s', (label, translate) => { + const result: SearchResultNode = { id: sid('unnamed-search'), title: '', workspace: 'Project', + running: false, runningSubagentCount: 0, completed: false, archived: false } + const onOpen = vi.fn() + render() + fireEvent.click(screen.getByText(label)) + expect(onOpen).toHaveBeenCalledWith(result.id) +})