Files
orca/tests/e2e/quick-open-file-paths.spec.ts
Jinjing 58de75acf8 test(e2e): use bounding box for quick-open hover positioning (#21505)
Handle cases where the quick-open result element remounts by tracking
its current bounding box and using absolute mouse positioning instead
of relative row.hover() calls.
2026-09-19 00:46:40 -07:00

73 lines
3.2 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { mkdirSync, writeFileSync } from 'node:fs'
import path from 'node:path'
import { expect, test } from './helpers/orca-app'
import { ensureTerminalVisible, waitForActiveWorktree, waitForSessionReady } from './helpers/store'
const relativeFilePath =
'packages/orca/src/renderer/src/components/navigation/worktree/quick-open/long-path-fixtures/very-deeply-nested-folder/QuickOpenTarget.tsx'
test('cmd+p quick open prioritizes the filename and reveals the full path on hover', async ({
electronApp,
orcaPage,
testRepoPath
}) => {
const filePath = path.join(testRepoPath, ...relativeFilePath.split('/'))
mkdirSync(path.dirname(filePath), { recursive: true })
writeFileSync(filePath, 'export const QuickOpenTarget = true\n')
await waitForSessionReady(orcaPage)
await waitForActiveWorktree(orcaPage)
await ensureTerminalVisible(orcaPage)
// Headless Playwright keyboard events bypass Electrons before-input-event shortcut path.
await electronApp.evaluate(({ BrowserWindow }) => {
BrowserWindow.getAllWindows()[0]?.webContents.send('ui:openQuickOpen')
})
const dialog = orcaPage.getByRole('dialog', { name: 'Go to file' })
await expect(dialog).toBeVisible()
const inputBox = await dialog.locator('[data-cmdk-input-wrapper]').boundingBox()
expect(inputBox).not.toBeNull()
expect(inputBox!.height).toBeLessThanOrEqual(45)
const input = dialog.locator('input[placeholder="Go to file..."]')
await input.fill('QuickOpenTarget')
const row = dialog.getByRole('option').filter({ hasText: 'QuickOpenTarget.tsx' }).first()
await expect(row).toBeVisible()
await expect(row).toContainText('packages/orca/src/renderer/src/components/navigation/')
const rowBox = await row.boundingBox()
expect(rowBox).not.toBeNull()
expect(rowBox!.height).toBeLessThanOrEqual(29)
const rowText = await row.textContent()
expect(rowText?.indexOf('QuickOpenTarget.tsx')).toBeLessThan(
rowText?.indexOf('packages/orca/src/renderer/src/components/navigation/') ?? -1
)
const tooltip = orcaPage
.locator('[data-slot="tooltip-content"]')
.filter({ hasText: relativeFilePath })
// Streaming results can remount the row under a stationary pointer, and a
// tooltip left open from a prior attempt can swallow the next hover.
await expect(async () => {
await orcaPage.mouse.move(8, 8)
const currentRow = dialog.getByRole('option').filter({ hasText: 'QuickOpenTarget.tsx' }).first()
await expect(currentRow).toBeVisible()
const currentBox = await currentRow.boundingBox()
if (!currentBox) {
throw new Error('Quick Open result remounted before hover')
}
await orcaPage.mouse.move(currentBox.x + 20, currentBox.y + 12)
await orcaPage.mouse.move(currentBox.x + 40, currentBox.y + 12)
await expect(tooltip).toBeVisible({ timeout: 2_000 })
}).toPass({ timeout: 15_000, intervals: [100, 250, 500] })
// Exact cursor placement is arithmetic, unit-tested via cursorTooltipOffsets.
// Asserting it here measures the app mid-reflow and is flaky; what E2E is
// uniquely good for is that the tooltip really opens with the whole path.
await expect(tooltip).toBeVisible()
const proofPath = process.env.ORCA_QUICK_OPEN_PROOF_PATH
if (proofPath) {
await orcaPage.screenshot({ path: proofPath })
}
})