test: refresh palette identities and structured-session journal fixtures (#19165)

* test: persist palette fixture names across inventory refresh

* test: locate palette workspaces by host-qualified identity

* test: supply journal activity clocks in branch-rename fixtures
This commit is contained in:
Neil
2026-09-06 18:20:49 -07:00
committed by GitHub
parent 8b197ffdc2
commit 57d4f63ac3
2 changed files with 33 additions and 15 deletions
@@ -101,6 +101,7 @@ describe('maybeAutoRenameBranchOnFirstWork', () => {
})
const items: AgentJournalRenderItem[] = []
const journal = {
lastActivityAt: () => 0,
snapshot: () => ({ items }),
isReadOnly: false
} as unknown as AgentSessionJournal
@@ -172,6 +173,7 @@ describe('maybeAutoRenameBranchOnFirstWork', () => {
getRepo: () => ({ id: REPO_ID, kind: 'folder', path: '/workspace/platform' }) as Repo
})
const journal = {
lastActivityAt: () => 0,
isReadOnly: false,
snapshot: () => ({
items: [
+31 -15
View File
@@ -1,4 +1,7 @@
import type { Locator, Page } from '@stablyai/playwright-test'
import type { ExecutionHostId } from '../../src/shared/execution-host'
import { getPaletteWorktreeIdentity } from '../../src/renderer/src/lib/palette-repo-resolution'
import { encodePaletteIdentity } from '../../src/renderer/src/lib/palette-match/palette-ranking'
import { expect, test } from './helpers/orca-app'
import { waitForActiveWorktree, waitForSessionReady } from './helpers/store'
@@ -12,18 +15,25 @@ type PaletteFilterFixture = {
localRepoId: string
localWorktreeId: string
remoteWorktreeId: string
remoteHostId: ExecutionHostId
}
async function seedPaletteFilterFixture(page: Page): Promise<PaletteFilterFixture> {
return page.evaluate(
({ localProject, remoteHost, remoteProject, remoteWorkspace }) => {
async ({ localProject, remoteHost, remoteProject, remoteWorkspace }) => {
const store = window.__store
if (!store) {
throw new Error('window.__store is unavailable')
}
const sourceRepo = store.getState().repos[0]
if (
!sourceRepo ||
!(await store.getState().updateRepo(sourceRepo.id, { displayName: localProject }))
) {
throw new Error('Failed to persist the local palette fixture name')
}
const state = store.getState()
const sourceRepo = state.repos[0]
const sourceWorktree = Object.values(state.worktreesByRepo)
.flat()
.find((worktree) => worktree.repoId === sourceRepo?.id && !worktree.isArchived)
@@ -60,12 +70,7 @@ async function seedPaletteFilterFixture(page: Page): Promise<PaletteFilterFixtur
const sshTargetLabels = new Map(state.sshTargetLabels)
sshTargetLabels.set(remoteConnectionId, remoteHost)
store.setState({
repos: [
...state.repos.map((repo) =>
repo.id === sourceRepo.id ? { ...repo, displayName: localProject } : repo
),
remoteRepo
],
repos: [...state.repos, remoteRepo],
sshTargetLabels,
worktreesByRepo: {
...state.worktreesByRepo,
@@ -79,7 +84,8 @@ async function seedPaletteFilterFixture(page: Page): Promise<PaletteFilterFixtur
return {
localRepoId: sourceRepo.id,
localWorktreeId: sourceWorktree.id,
remoteWorktreeId
remoteWorktreeId,
remoteHostId
}
},
{
@@ -91,8 +97,12 @@ async function seedPaletteFilterFixture(page: Page): Promise<PaletteFilterFixtur
)
}
function worktreeRow(page: Page, worktreeId: string) {
return palette(page).locator(`[cmdk-item][data-value="worktree:${worktreeId}"]`)
function worktreeRow(page: Page, worktreeId: string, hostId: ExecutionHostId = 'local') {
const rowId = encodePaletteIdentity([
'worktree',
getPaletteWorktreeIdentity({ id: worktreeId, hostId })
])
return palette(page).locator(`[cmdk-item][data-value=${JSON.stringify(rowId)}]`)
}
function palette(page: Page) {
@@ -112,7 +122,7 @@ async function searchFixtureWorkspaces(page: Page, fixture: PaletteFilterFixture
const input = palette(page).getByPlaceholder(SEARCH_PLACEHOLDER)
await input.fill('E2E Palette')
await expect(worktreeRow(page, fixture.localWorktreeId)).toBeVisible()
await expect(worktreeRow(page, fixture.remoteWorktreeId)).toBeVisible()
await expect(worktreeRow(page, fixture.remoteWorktreeId, fixture.remoteHostId)).toBeVisible()
}
async function selectRemoteHost(page: Page, useKeyboard = false): Promise<void> {
@@ -174,7 +184,9 @@ test.describe('Worktree jump-palette filters', () => {
await selectRemoteHost(orcaPage, true)
await expect(filterTrigger(orcaPage)).toContainText('1')
await expect(palette(orcaPage).getByLabel(`Remove filter ${REMOTE_HOST}`)).toBeVisible()
await expect(worktreeRow(orcaPage, fixture.remoteWorktreeId)).toBeVisible()
await expect(
worktreeRow(orcaPage, fixture.remoteWorktreeId, fixture.remoteHostId)
).toBeVisible()
await expect(worktreeRow(orcaPage, fixture.localWorktreeId)).toHaveCount(0)
// P2: host and repository fields intersect, with the filter-specific empty state.
@@ -209,7 +221,9 @@ test.describe('Worktree jump-palette filters', () => {
await palette(orcaPage).getByPlaceholder(SEARCH_PLACEHOLDER).fill('E2E Palette')
await expect(filterTrigger(orcaPage)).toContainText('1')
await expect(worktreeRow(orcaPage, fixture.localWorktreeId)).toBeVisible()
await expect(worktreeRow(orcaPage, fixture.remoteWorktreeId)).toHaveCount(0)
await expect(worktreeRow(orcaPage, fixture.remoteWorktreeId, fixture.remoteHostId)).toHaveCount(
0
)
})
test('opens with the sidebar repository scope without widening it', async ({ orcaPage }) => {
@@ -224,7 +238,9 @@ test.describe('Worktree jump-palette filters', () => {
await expect(filterTrigger(orcaPage)).toContainText('1')
await expect(palette(orcaPage).getByLabel(`Remove filter ${LOCAL_PROJECT}`)).toBeVisible()
await expect(worktreeRow(orcaPage, fixture.localWorktreeId)).toBeVisible()
await expect(worktreeRow(orcaPage, fixture.remoteWorktreeId)).toHaveCount(0)
await expect(worktreeRow(orcaPage, fixture.remoteWorktreeId, fixture.remoteHostId)).toHaveCount(
0
)
})
test('pressing Enter creates a worktree from a typed name', async ({ orcaPage }) => {