Files
arboretum/packages/server/test/claude-launcher.test.ts
Johan LEROY b5236b41c8 feat(settings): réglages Claude CLI (binaire + ~/.claude) & notif « disponible »
- Réglages → Claude CLI : override du chemin du binaire `claude` (effet à la
  prochaine session, fallback `which claude`), diagnostic de détection, et
  override de la racine ~/.claude (effet au redémarrage). Validateurs stricts.
- Push : notifie aussi sur le front busy→idle (session redevenue disponible).
- Renomme l'état affiché idle → « disponible » / « available » (web EN/FR + VS Code) ;
  l'enum SessionActivity du protocole reste inchangé.
2026-06-24 10:15:29 +02:00

55 lines
2.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { describe, expect, it, vi } from 'vitest';
import { buildSpawnSpec, diagnoseClaudeBin, resolveClaudeBin } from '../src/core/claude-launcher.js';
// resolveClaudeBin() fait `which claude` : on le stub pour ne pas dépendre d'un claude réel en PATH.
vi.mock('node:child_process', () => ({ execFileSync: () => '/usr/bin/claude\n' }));
describe('buildSpawnSpec — session de groupe multi-repo (P6)', () => {
it('émet un --add-dir par répertoire supplémentaire (claude)', () => {
const spec = buildSpawnSpec({ command: 'claude', addDirs: ['/a', '/b', '/c'] });
expect(spec.file).toBe('/usr/bin/claude');
expect(spec.args).toEqual(['--add-dir', '/a', '--add-dir', '/b', '--add-dir', '/c']);
});
it('combine --resume et --add-dir (reprise dune session de groupe)', () => {
const spec = buildSpawnSpec({ command: 'claude', resume: { claudeSessionId: 'sid' }, addDirs: ['/x'] });
expect(spec.args).toEqual(['--resume', 'sid', '--add-dir', '/x']);
});
it('aucun --add-dir quand addDirs est vide/absent', () => {
expect(buildSpawnSpec({ command: 'claude' }).args).toEqual([]);
expect(buildSpawnSpec({ command: 'claude', addDirs: [] }).args).toEqual([]);
});
it('ignore addDirs pour bash (pas de --add-dir)', () => {
const spec = buildSpawnSpec({ command: 'bash', addDirs: ['/a', '/b'] });
expect(spec.file).toBe('bash');
expect(spec.args).toEqual(['--norc']);
});
});
describe('resolveClaudeBin / diagnoseClaudeBin — override de chemin (réglage UI)', () => {
// process.execPath (node) est un fichier exécutable réel garanti sur la machine de test.
const realBin = process.execPath;
it('buildSpawnSpec utilise le chemin configuré tel quel quand fourni', () => {
const spec = buildSpawnSpec({ command: 'claude', claudeBinPath: realBin });
expect(spec.file).toBe(realBin);
});
it('resolveClaudeBin retombe sur le PATH (which) sans override', () => {
expect(resolveClaudeBin()).toBe('/usr/bin/claude');
expect(resolveClaudeBin(null)).toBe('/usr/bin/claude');
});
it('resolveClaudeBin throw si le chemin configuré nest pas exécutable', () => {
expect(() => resolveClaudeBin('/no/such/claude')).toThrow(/not executable/);
});
it('diagnoseClaudeBin : configuré+exécutable → ok ; configuré absent → !ok ; sinon PATH', () => {
expect(diagnoseClaudeBin(realBin)).toEqual({ path: realBin, source: 'configured', ok: true });
expect(diagnoseClaudeBin('/no/such/claude')).toEqual({ path: '/no/such/claude', source: 'configured', ok: false });
expect(diagnoseClaudeBin()).toEqual({ path: '/usr/bin/claude', source: 'path', ok: true });
});
});