mirror of
https://github.com/stablyai/orca.git
synced 2026-10-30 16:47:34 +00:00
110 lines
3.9 KiB
JavaScript
110 lines
3.9 KiB
JavaScript
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'
|
|
import { tmpdir } from 'node:os'
|
|
import path from 'node:path'
|
|
import { afterEach, describe, expect, it } from 'vitest'
|
|
import {
|
|
dropInheritedDevInstanceEnv,
|
|
pickInstancePort,
|
|
resolveDevProfile
|
|
} from './dev-instance-isolation.mjs'
|
|
|
|
const roots = []
|
|
afterEach(() => {
|
|
for (const root of roots.splice(0)) {
|
|
rmSync(root, { recursive: true, force: true })
|
|
}
|
|
})
|
|
|
|
function checkout(kind) {
|
|
const root = mkdtempSync(path.join(tmpdir(), 'orca-dev-isolation-'))
|
|
roots.push(root)
|
|
if (kind === 'linked') {
|
|
writeFileSync(path.join(root, '.git'), 'gitdir: /repo/.git/worktrees/feature\n')
|
|
} else {
|
|
mkdirSync(path.join(root, '.git'))
|
|
}
|
|
return root
|
|
}
|
|
|
|
const env = { HOME: '/home/dev', XDG_CONFIG_HOME: '/home/dev/.config' }
|
|
|
|
describe('resolveDevProfile', () => {
|
|
it('isolates linked worktrees from each other and keeps orca-dev for the main checkout', () => {
|
|
const first = resolveDevProfile({ repoRoot: checkout('linked'), env, platform: 'linux' })
|
|
const second = resolveDevProfile({ repoRoot: checkout('linked'), env, platform: 'linux' })
|
|
const main = resolveDevProfile({ repoRoot: checkout('main'), env, platform: 'linux' })
|
|
|
|
expect(first.kind).toBe('worktree')
|
|
expect(path.dirname(first.userDataPath)).toBe(path.join('/home/dev/.config', 'orca-dev-wt'))
|
|
expect(first.userDataPath).not.toBe(second.userDataPath)
|
|
expect(main).toEqual({
|
|
kind: 'shared',
|
|
userDataPath: path.join('/home/dev/.config', 'orca-dev')
|
|
})
|
|
})
|
|
|
|
it('lets the flag, ORCA_DEV_PROFILE, and an explicit path override the default', () => {
|
|
const repoRoot = checkout('linked')
|
|
expect(resolveDevProfile({ repoRoot, mode: 'shared', env, platform: 'linux' }).kind).toBe(
|
|
'shared'
|
|
)
|
|
expect(
|
|
resolveDevProfile({
|
|
repoRoot: checkout('main'),
|
|
env: { ...env, ORCA_DEV_PROFILE: 'worktree' },
|
|
platform: 'linux'
|
|
}).kind
|
|
).toBe('worktree')
|
|
expect(
|
|
resolveDevProfile({
|
|
repoRoot,
|
|
mode: 'shared',
|
|
env: { ...env, ORCA_DEV_USER_DATA_PATH: '/tmp/custom' },
|
|
platform: 'linux'
|
|
})
|
|
).toEqual({ kind: 'custom', userDataPath: path.resolve('/tmp/custom') })
|
|
expect(() =>
|
|
resolveDevProfile({ repoRoot, env: { ...env, ORCA_DEV_PROFILE: 'other' }, platform: 'linux' })
|
|
).toThrow('ORCA_DEV_PROFILE')
|
|
})
|
|
})
|
|
|
|
describe('dropInheritedDevInstanceEnv', () => {
|
|
it('drops a parent dev instance identity but keeps an explicit profile override', () => {
|
|
const inherited = {
|
|
ORCA_DEV_REPO_ROOT: '/worktrees/parent',
|
|
ORCA_DEV_INSTANCE_KEY: '/worktrees/parent',
|
|
ORCA_DEV_RENDERER_PORT: '15300',
|
|
ORCA_USER_DATA_PATH: '/profiles/parent',
|
|
ORCA_DEV_USER_DATA_PATH: '/profiles/parent'
|
|
}
|
|
const same = { ...inherited }
|
|
dropInheritedDevInstanceEnv(same, '/worktrees/parent')
|
|
expect(same).toEqual(inherited)
|
|
|
|
const explicit = { ...inherited, ORCA_DEV_USER_DATA_PATH: '/profiles/mine' }
|
|
dropInheritedDevInstanceEnv(explicit, '/worktrees/child')
|
|
expect(explicit).toEqual({
|
|
ORCA_USER_DATA_PATH: '/profiles/parent',
|
|
ORCA_DEV_USER_DATA_PATH: '/profiles/mine'
|
|
})
|
|
|
|
dropInheritedDevInstanceEnv(inherited, '/worktrees/child')
|
|
expect(inherited).toEqual({ ORCA_USER_DATA_PATH: '/profiles/parent' })
|
|
})
|
|
})
|
|
|
|
describe('pickInstancePort', () => {
|
|
it('is stable per key and sweeps forward past taken ports', async () => {
|
|
const range = { base: 15200, spread: 200 }
|
|
const first = await pickInstancePort('worktree-a', range, async () => true)
|
|
expect(await pickInstancePort('worktree-a', range, async () => true)).toBe(first)
|
|
expect(first).toBeGreaterThanOrEqual(15200)
|
|
expect(first).toBeLessThan(15400)
|
|
expect(await pickInstancePort('worktree-a', range, async (port) => port > first + 1)).toBe(
|
|
first + 2
|
|
)
|
|
expect(await pickInstancePort('worktree-a', range, async () => false)).toBeNull()
|
|
})
|
|
})
|