import { describe, expect, it } from 'vitest'; import { containsPath, findWorktreeForCwd, sessionBelongsToWorktree } from '../src/core/session-match.js'; describe('containsPath', () => { it('vrai pour le répertoire lui-même', () => { expect(containsPath('/p/repo', '/p/repo')).toBe(true); }); it('vrai pour un descendant', () => { expect(containsPath('/p/repo', '/p/repo/packages/api')).toBe(true); }); it('compare par segment, pas par préfixe de chaîne', () => { // /p/repo ne contient PAS /p/repo-wt-feature (piège du startsWith nu) expect(containsPath('/p/repo', '/p/repo-wt-feature')).toBe(false); }); it('faux pour un ancêtre', () => { expect(containsPath('/p/repo/api', '/p/repo')).toBe(false); }); it('normalise les chemins non résolus', () => { expect(containsPath('/p/repo', '/p/repo/./api/../api')).toBe(true); }); }); describe('sessionBelongsToWorktree', () => { it('rattache une session lancée à la racine du worktree', () => { expect(sessionBelongsToWorktree({ cwd: '/p/repo' }, '/p/repo')).toBe(true); }); it('rattache une session lancée dans un sous-répertoire (« Démarrer le projet »)', () => { // LaunchCommand.cwd autorise un sous-dossier : le terminal doit rester visible sous son worktree. expect(sessionBelongsToWorktree({ cwd: '/p/repo/packages/api' }, '/p/repo')).toBe(true); }); it('ne rattache pas une session d’un worktree frère', () => { expect(sessionBelongsToWorktree({ cwd: '/p/repo-wt-feat' }, '/p/repo')).toBe(false); }); it('donne un worktree imbriqué au plus spécifique, pas au principal', () => { const session = { cwd: '/p/repo/.worktrees/feat/src' }; const all = ['/p/repo', '/p/repo/.worktrees/feat']; expect(sessionBelongsToWorktree(session, '/p/repo/.worktrees/feat', all)).toBe(true); expect(sessionBelongsToWorktree(session, '/p/repo', all)).toBe(false); }); it('rattache une session de groupe via ses répertoires reliés', () => { // cwd = parent commun (hors des repos), les worktrees couverts vivent dans addedDirs. const session = { cwd: '/p', addedDirs: ['/p/api', '/p/web'] }; expect(sessionBelongsToWorktree(session, '/p/api')).toBe(true); expect(sessionBelongsToWorktree(session, '/p/web')).toBe(true); expect(sessionBelongsToWorktree(session, '/p/docs')).toBe(false); }); it('ignore un addedDirs absent', () => { expect(sessionBelongsToWorktree({ cwd: '/p/api' }, '/p/api', [])).toBe(true); }); }); describe('findWorktreeForCwd', () => { const worktrees = [ { repoId: 'r1', path: '/p/api' }, { repoId: 'r1', path: '/p/api-wt-feat' }, { repoId: 'r2', path: '/p/api/vendor/web' }, ]; it('choisit le worktree le plus spécifique', () => { expect(findWorktreeForCwd('/p/api/vendor/web/src', worktrees)?.repoId).toBe('r2'); }); it('choisit le worktree frère exact et non le préfixe de chaîne', () => { expect(findWorktreeForCwd('/p/api-wt-feat/src', worktrees)?.path).toBe('/p/api-wt-feat'); }); it('renvoie null hors de tout worktree connu', () => { expect(findWorktreeForCwd('/tmp/ailleurs', worktrees)).toBeNull(); }); });