101 lines
3.1 KiB
TypeScript
101 lines
3.1 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import {
|
|
canCleanupUnregisteredOrcaWorktreeDirectory,
|
|
isWorktreePathMissing,
|
|
stripOrcaProvenanceMetaUpdates
|
|
} from './worktree-removal-safety'
|
|
|
|
describe('isWorktreePathMissing', () => {
|
|
it('recognizes missing-path errors from local and remote stat providers', async () => {
|
|
await expect(
|
|
isWorktreePathMissing('/missing', async () => {
|
|
throw Object.assign(new Error('missing'), { code: 'ENOENT' })
|
|
})
|
|
).resolves.toBe(true)
|
|
|
|
await expect(
|
|
isWorktreePathMissing('/missing', () => Promise.reject({ code: 'ENOTDIR' }))
|
|
).resolves.toBe(true)
|
|
})
|
|
|
|
it('does not classify existing paths or unrelated stat failures as missing', async () => {
|
|
await expect(isWorktreePathMissing('/exists', async () => ({}))).resolves.toBe(false)
|
|
|
|
await expect(
|
|
isWorktreePathMissing('/unknown', async () => {
|
|
throw new Error('permission denied')
|
|
})
|
|
).resolves.toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('canCleanupUnregisteredOrcaWorktreeDirectory', () => {
|
|
it('does not treat orcaCreatedAt alone as cleanup authority', () => {
|
|
expect(
|
|
canCleanupUnregisteredOrcaWorktreeDirectory({
|
|
meta: { orcaCreatedAt: Date.now() },
|
|
worktreePath: '/outside/orphan',
|
|
repo: { path: '/repo' },
|
|
knownOrcaLayouts: []
|
|
})
|
|
).toBe(false)
|
|
expect(
|
|
canCleanupUnregisteredOrcaWorktreeDirectory({
|
|
meta: {
|
|
orcaCreatedAt: Date.now(),
|
|
orcaCreationSource: 'runtime'
|
|
},
|
|
worktreePath: '/outside/orphan',
|
|
repo: { path: '/repo' },
|
|
knownOrcaLayouts: []
|
|
})
|
|
).toBe(true)
|
|
})
|
|
|
|
it('accepts legacy Orca-created metadata before explicit provenance existed', () => {
|
|
expect(
|
|
canCleanupUnregisteredOrcaWorktreeDirectory({
|
|
meta: { createdAt: Date.now() },
|
|
worktreePath: '/outside/orphan',
|
|
repo: { path: '/repo' },
|
|
knownOrcaLayouts: []
|
|
})
|
|
).toBe(true)
|
|
})
|
|
|
|
it('accepts legacy repo-nested Orca workspace paths without metadata provenance', () => {
|
|
expect(
|
|
canCleanupUnregisteredOrcaWorktreeDirectory({
|
|
meta: undefined,
|
|
worktreePath: '/orca/workspaces/app/legacy-orphan',
|
|
repo: { path: '/repos/app' },
|
|
knownOrcaLayouts: [{ path: '/orca/workspaces', nestWorkspaces: true }]
|
|
})
|
|
).toBe(true)
|
|
})
|
|
|
|
it('does not trust flat workspace-root paths without legacy metadata', () => {
|
|
expect(
|
|
canCleanupUnregisteredOrcaWorktreeDirectory({
|
|
meta: undefined,
|
|
worktreePath: '/orca/workspaces/legacy-orphan',
|
|
repo: { path: '/repos/app' },
|
|
knownOrcaLayouts: [{ path: '/orca/workspaces', nestWorkspaces: false }]
|
|
})
|
|
).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('stripOrcaProvenanceMetaUpdates', () => {
|
|
it('removes Orca-owned provenance fields from user metadata updates', () => {
|
|
expect(
|
|
stripOrcaProvenanceMetaUpdates({
|
|
comment: 'keep me',
|
|
orcaCreatedAt: 123,
|
|
orcaCreationSource: 'desktop',
|
|
orcaCreationWorkspaceLayout: { path: '/workspace', nestWorkspaces: false }
|
|
})
|
|
).toEqual({ comment: 'keep me' })
|
|
})
|
|
})
|