mirror of
https://github.com/stablyai/orca.git
synced 2026-11-15 10:27:33 +00:00
89 lines
3.0 KiB
TypeScript
89 lines
3.0 KiB
TypeScript
// @vitest-environment happy-dom
|
|
import { cleanup, fireEvent, render, screen } from '@testing-library/react'
|
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
|
import type { OpenFile } from '@/store/slices/editor/types/open-file'
|
|
import type { WorktreeRuntimeOwnerState } from '@/lib/workspace/ownership/worktree-runtime-owner-state'
|
|
import {
|
|
DropdownMenu,
|
|
DropdownMenuContent,
|
|
DropdownMenuTrigger
|
|
} from '@/components/ui/dropdown-menu'
|
|
import { EditorFileLocationMenuItems } from './EditorFileLocationMenuItems'
|
|
|
|
const store = vi.hoisted((): { state: WorktreeRuntimeOwnerState } => ({ state: {} }))
|
|
vi.mock('@/store', () => ({
|
|
useAppStore: (selector: (state: WorktreeRuntimeOwnerState) => unknown) => selector(store.state)
|
|
}))
|
|
vi.mock('@/i18n/i18n', () => ({ translate: (_key: string, fallback: string) => fallback }))
|
|
|
|
const openInFileManager = vi.fn().mockResolvedValue({ ok: true })
|
|
const writeClipboardText = vi.fn().mockResolvedValue(undefined)
|
|
const onCopyPath = vi.fn()
|
|
const file: OpenFile = {
|
|
id: '/repo/src/file.ts',
|
|
filePath: '/repo/src/file.ts',
|
|
relativePath: 'src/file.ts',
|
|
worktreeId: 'repo::/repo',
|
|
language: 'typescript',
|
|
mode: 'edit',
|
|
isDirty: false
|
|
}
|
|
|
|
function renderMenu(overrides: Partial<OpenFile> = {}): void {
|
|
render(
|
|
<DropdownMenu open modal={false}>
|
|
<DropdownMenuTrigger asChild>
|
|
<button>File actions</button>
|
|
</DropdownMenuTrigger>
|
|
<DropdownMenuContent>
|
|
<EditorFileLocationMenuItems file={{ ...file, ...overrides }} onCopyPath={onCopyPath} />
|
|
</DropdownMenuContent>
|
|
</DropdownMenu>
|
|
)
|
|
}
|
|
|
|
beforeEach(() => {
|
|
store.state = {
|
|
repos: [{ id: 'repo', connectionId: null }],
|
|
worktreesByRepo: {
|
|
repo: [{ id: file.worktreeId, repoId: 'repo', hostId: 'local' }]
|
|
},
|
|
folderWorkspaces: [],
|
|
projectGroups: []
|
|
}
|
|
vi.spyOn(navigator, 'userAgent', 'get').mockReturnValue('Macintosh')
|
|
Object.defineProperty(window, 'api', {
|
|
configurable: true,
|
|
value: { shell: { openInFileManager }, ui: { writeClipboardText } }
|
|
})
|
|
})
|
|
|
|
afterEach(() => {
|
|
cleanup()
|
|
vi.clearAllMocks()
|
|
vi.restoreAllMocks()
|
|
})
|
|
|
|
describe('EditorFileLocationMenuItems', () => {
|
|
it.each([{ externalSshTargetId: 'remote' }, { runtimeEnvironmentId: 'paired-server' }])(
|
|
'disables local reveal for a remote file: %j',
|
|
(overrides) => {
|
|
renderMenu(overrides)
|
|
const reveal = screen.getByRole('menuitem', { name: 'Reveal in Finder Local only' })
|
|
expect(reveal.getAttribute('aria-disabled')).toBe('true')
|
|
fireEvent.click(reveal)
|
|
expect(openInFileManager).not.toHaveBeenCalled()
|
|
expect(
|
|
screen.getByRole('menuitem', { name: 'Copy Relative Path' }).hasAttribute('data-disabled')
|
|
).toBe(false)
|
|
}
|
|
)
|
|
|
|
it('reveals local files even while a remote runtime is selected', () => {
|
|
store.state.settings = { activeRuntimeEnvironmentId: 'paired-server' }
|
|
renderMenu()
|
|
fireEvent.click(screen.getByRole('menuitem', { name: 'Reveal in Finder' }))
|
|
expect(openInFileManager).toHaveBeenCalledWith(file.filePath, 'local')
|
|
})
|
|
})
|