Files
orca/src/renderer/src/components/editor/EditorFileLocationMenuItems.test.tsx
T

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')
})
})