Some checks failed
CI / Build & test (Node 24) (push) Has been cancelled
CI / Pack & boot smoke (Node 22) (push) Has been cancelled
CI / No em/en dashes (push) Has been cancelled
CI / Build & test (Node 22) (push) Has been cancelled
Deploy site (production) / build-and-deploy (push) Successful in 20s
Remplace les 547 tirets cadratins (U+2014) et demi-cadratins (U+2013) des fichiers versionnés par la ponctuation contextuelle adaptée (point médian, deux-points, virgule, parenthèses ; tiret simple pour les plages), sur 122 fichiers (appli, vitrine, doc, tests, workflows, scripts). Ajoute le job CI « lint-dashes » (git grep -P) qui échoue si un tiret cadratin/demi-cadratin réapparaît, hors logo binaire et captures brutes du terminal (fidélité des fixtures de détection de dialogue).
55 lines
2.6 KiB
TypeScript
55 lines
2.6 KiB
TypeScript
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 d’une 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é n’est 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 });
|
||
});
|
||
});
|