mirror of
https://github.com/stablyai/orca.git
synced 2026-09-21 16:02:20 +00:00
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:
@@ -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: [
|
||||
|
||||
@@ -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 }) => {
|
||||
|
||||
Reference in New Issue
Block a user