orca/tests/e2e/file-open.spec.ts

192 lines
6.1 KiB
TypeScript

/**
* E2E tests for opening files and markdown preview from the right sidebar.
*
* User Prompt:
* - you can open files (from the right sidebar)
* - you can open .md files and they show up as preview (from the right sidebar)
*/
import { test, expect } from './helpers/orca-app'
import {
waitForSessionReady,
waitForActiveWorktree,
getActiveWorktreeId,
getActiveTabType,
getOpenFiles,
ensureTerminalVisible
} from './helpers/store'
import { clickFileInExplorer, openFileExplorer } from './helpers/file-explorer'
async function switchToTerminal(
page: Parameters<typeof getActiveWorktreeId>[0],
worktreeId: string
): Promise<void> {
await page.evaluate((targetWorktreeId) => {
const store = window.__store
if (!store) {
return
}
const state = store.getState()
const terminalTab = (state.tabsByWorktree[targetWorktreeId] ?? [])[0]
if (terminalTab) {
state.setActiveTab(terminalTab.id)
}
state.setActiveTabType('terminal')
}, worktreeId)
}
async function switchToEditor(
page: Parameters<typeof getActiveWorktreeId>[0],
fileId: string
): Promise<void> {
await page.evaluate((targetFileId) => {
const store = window.__store
if (!store) {
return
}
const state = store.getState()
if (state.openFiles.some((file) => file.id === targetFileId)) {
state.setActiveFile(targetFileId)
state.setActiveTabType('editor')
}
}, fileId)
}
test.describe('File Open & Markdown Preview', () => {
test.beforeEach(async ({ orcaPage }) => {
await waitForSessionReady(orcaPage)
await waitForActiveWorktree(orcaPage)
await ensureTerminalVisible(orcaPage)
})
/**
* User Prompt:
* - you can open files (from the right sidebar)
*/
test('opening the right sidebar shows file explorer', async ({ orcaPage }) => {
await openFileExplorer(orcaPage)
// Verify the right sidebar is open and on the explorer tab
await expect
.poll(async () => orcaPage.evaluate(() => window.__store?.getState().rightSidebarOpen), {
timeout: 3_000
})
.toBe(true)
await expect
.poll(async () => orcaPage.evaluate(() => window.__store?.getState().rightSidebarTab), {
timeout: 3_000
})
.toBe('explorer')
})
/**
* User Prompt:
* - you can open files (from the right sidebar)
*/
test('clicking a file in the file explorer opens it in an editor tab', async ({ orcaPage }) => {
const worktreeId = (await getActiveWorktreeId(orcaPage))!
await openFileExplorer(orcaPage)
const filesBefore = await getOpenFiles(orcaPage, worktreeId)
// Click a known non-directory file
const clickedFile = await clickFileInExplorer(orcaPage, [
'package.json',
'tsconfig.json',
'.gitignore',
'README.md'
])
expect(clickedFile).not.toBeNull()
// Wait for the file to be opened in the editor
await expect.poll(async () => getActiveTabType(orcaPage), { timeout: 5_000 }).toBe('editor')
// There should be a new open file
await expect
.poll(async () => (await getOpenFiles(orcaPage, worktreeId)).length, { timeout: 5_000 })
.toBeGreaterThan(filesBefore.length)
})
/**
* User Prompt:
* - you can open .md files and they show up as preview (from the right sidebar)
*/
test('opening a .md file shows markdown content', async ({ orcaPage }) => {
await openFileExplorer(orcaPage)
const clickedFile = await clickFileInExplorer(orcaPage, ['README.md', 'CLAUDE.md'])
expect(clickedFile).not.toBeNull()
// Wait for the editor tab to become active
await expect.poll(async () => getActiveTabType(orcaPage), { timeout: 5_000 }).toBe('editor')
await expect
.poll(
async () =>
orcaPage.evaluate(() => {
const store = window.__store
if (!store) {
return false
}
const state = store.getState()
const activeFile = state.openFiles.find((file) => file.id === state.activeFileId)
if (!activeFile || !activeFile.relativePath.endsWith('.md')) {
return false
}
// Why: markdown files default to the rendered "rich" mode in
// EditorPanel. Hidden Electron windows do not make the rendered DOM
// surface a reliable assertion target, so confirm the editor state
// chose the markdown view mode instead of falling back to a plain
// non-markdown tab.
return (state.markdownViewMode[activeFile.id] ?? 'rich') === 'rich'
}),
{ timeout: 15_000, message: 'Markdown file did not enter rich markdown mode' }
)
.toBe(true)
})
/**
* User Prompt:
* - you can open files (from the right sidebar)
* - files retain state when switching tabs
*/
test('editor tab retains state when switching to terminal and back', async ({ orcaPage }) => {
const worktreeId = (await getActiveWorktreeId(orcaPage))!
await openFileExplorer(orcaPage)
// Click a file to open it
const clickedFile = await clickFileInExplorer(orcaPage, [
'package.json',
'tsconfig.json',
'.gitignore'
])
expect(clickedFile).not.toBeNull()
// Wait for editor to become active
await expect.poll(async () => getActiveTabType(orcaPage), { timeout: 5_000 }).toBe('editor')
// Record what files are open
const openFilesBefore = await getOpenFiles(orcaPage, worktreeId)
expect(openFilesBefore.length).toBeGreaterThan(0)
const editorFileId = openFilesBefore[0].id
// Switch to a terminal tab
await switchToTerminal(orcaPage, worktreeId)
await expect.poll(async () => getActiveTabType(orcaPage), { timeout: 3_000 }).not.toBe('editor')
// Switch back to the same editor tab
await switchToEditor(orcaPage, editorFileId)
await expect.poll(async () => getActiveTabType(orcaPage), { timeout: 3_000 }).toBe('editor')
// The same files should still be open
const openFilesAfter = await getOpenFiles(orcaPage, worktreeId)
expect(openFilesAfter.length).toBe(openFilesBefore.length)
expect(openFilesAfter[0].filePath).toBe(openFilesBefore[0].filePath)
})
})