From 3b2ee5ce872f1fad4c58a4b81547cacb406e2991 Mon Sep 17 00:00:00 2001 From: creatixchu Date: Fri, 31 Jul 2026 18:37:04 +0800 Subject: [PATCH] test(ui-conversation): pin all three list-summary shapes for the settling exemption The mount fixture always listed the session, so the case named "no list summary" actually exercised a row proving non-blank. An omitSummaryRow option drops the row, and the three cases now pin blank:false, an absent row, and the summary-proven blank open. --- .../ui-conversation/tests/skeleton.spec.tsx | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/packages/client/ui-conversation/tests/skeleton.spec.tsx b/packages/client/ui-conversation/tests/skeleton.spec.tsx index 1d98cfd6fa..ebc263b712 100644 --- a/packages/client/ui-conversation/tests/skeleton.spec.tsx +++ b/packages/client/ui-conversation/tests/skeleton.spec.tsx @@ -85,15 +85,20 @@ function mount( overlayTakeover?: boolean /** The session list summary's `blank` flag — independent of the snapshot's. */ summaryBlank?: boolean + /** Drop the session's summary row entirely (a session the list has not caught up with). */ + omitSummaryRow?: boolean } = {}, ) { const root = sid('root') + const rootRow = { id: root, displayTitle: 'Root', running: false, waitingApproval: false, blank: false, updatedAt: 1 } + const childRow = { + id: SID, displayTitle: 'Child', parentId: root, cwd: '/projects/one', + running: false, waitingApproval: false, blank: options.summaryBlank ?? false, updatedAt: 2, + } + const listed = options.omitSummaryRow !== true const sessions = createSnapshotStore({ - ids: [root, SID], - byId: { - [root]: { id: root, displayTitle: 'Root', running: false, waitingApproval: false, blank: false, updatedAt: 1 }, - [SID]: { id: SID, displayTitle: 'Child', parentId: root, cwd: '/projects/one', running: false, waitingApproval: false, blank: options.summaryBlank ?? false, updatedAt: 2 }, - }, + ids: listed ? [root, SID] : [root], + byId: { [root]: rootRow, ...listed && { [SID]: childRow } }, current: SID, phase: 'ready', }) @@ -274,13 +279,24 @@ describe('ConversationRoot resident composer', () => { expect(b.view.getByText('Selected Folder')).toBeTruthy() }) - it('settling phase: a blank session with no list summary hides the composer while it opens', () => { + it('settling phase: a summary that does not prove the session blank hides the composer while it opens', () => { const b = mount(conversationSnapshot({ composerPhase: 'blank', blank: true, openState: 'loading' })) const root = b.view.container.querySelector('[data-phase]') expect(root?.getAttribute('data-phase')).toBe('settling') expect(b.view.queryByText('开始构建吧')).toBeNull() }) + it('settling phase: a session the list has no row for settles conservatively', () => { + const b = mount( + conversationSnapshot({ composerPhase: 'blank', blank: true, openState: 'loading' }), + undefined, + undefined, + { omitSummaryRow: true }, + ) + const root = b.view.container.querySelector('[data-phase]') + expect(root?.getAttribute('data-phase')).toBe('settling') + }) + it('startup auto-selection: a summary-proven blank session opens straight into the hero', () => { const b = mount( conversationSnapshot({ composerPhase: 'blank', blank: true, openState: 'loading' }),