import { describe, expect, it } from 'vitest'; import { containsPath, findWorktreeForCwd, sessionBelongsToWorktree } from '../src/path-match.js'; describe('containsPath', () => { it('vrai pour le répertoire lui-même et ses descendants', () => { expect(containsPath('/p/repo', '/p/repo')).toBe(true); expect(containsPath('/p/repo', '/p/repo/packages/api')).toBe(true); }); it('compare par segment, pas par préfixe de chaîne', () => { // piège du startsWith nu : /p/repo n'est pas le parent de /p/repo-wt-feature 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('tolère les deux séparateurs (chemins Windows)', () => { expect(containsPath('C:\\dev\\repo', 'C:\\dev\\repo\\packages\\api')).toBe(true); expect(containsPath('C:\\dev\\repo', 'C:/dev/repo/packages')).toBe(true); expect(containsPath('C:\\dev\\repo', 'C:\\dev\\repo2')).toBe(false); }); it('reste sensible à la casse', () => { expect(containsPath('/p/Repo', '/p/repo/api')).toBe(false); }); it('ignore les séparateurs redondants et un slash final', () => { expect(containsPath('/p/repo/', '/p//repo/api')).toBe(true); }); }); describe('sessionBelongsToWorktree', () => { it('rattache une session lancée dans un sous-répertoire', () => { expect(sessionBelongsToWorktree({ cwd: '/p/repo/packages/api' }, '/p/repo')).toBe(true); }); 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', () => { const session = { cwd: '/p', addedDirs: ['/p/api', '/p/web'] }; expect(sessionBelongsToWorktree(session, '/p/api')).toBe(true); expect(sessionBelongsToWorktree(session, '/p/docs')).toBe(false); }); it('ne rattache pas une session d’un worktree frère', () => { expect(sessionBelongsToWorktree({ cwd: '/p/repo-wt-feat' }, '/p/repo')).toBe(false); }); }); 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', () => { 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(); }); });