/** * Tests for scripts/ecc.js */ const assert = require('assert'); const fs = require('fs'); const os = require('os'); const path = require('path'); const { spawnSync } = require('child_process'); const SCRIPT = path.join(__dirname, '..', '..', 'scripts', 'ecc.js'); function runCli(args, options = {}) { return spawnSync('node', [SCRIPT, ...args], { encoding: 'utf8', cwd: options.cwd || process.cwd(), env: { ...process.env, ...(options.env || {}), }, }); } function createTempDir(prefix) { return fs.mkdtempSync(path.join(os.tmpdir(), prefix)); } function parseJson(stdout) { return JSON.parse(stdout.trim()); } function runTest(name, fn) { try { fn(); console.log(` ✓ ${name}`); return true; } catch (error) { console.log(` ✗ ${name}`); console.error(` ${error.message}`); return false; } } function main() { console.log('\n=== Testing ecc.js ===\n'); let passed = 0; let failed = 0; const tests = [ ['shows top-level help', () => { const result = runCli(['--help']); assert.strictEqual(result.status, 0); assert.match(result.stdout, /ECC selective-install CLI/); assert.match(result.stdout, /list-installed/); assert.match(result.stdout, /doctor/); }], ['delegates explicit install command', () => { const result = runCli(['install', '--dry-run', '--json', 'typescript']); assert.strictEqual(result.status, 0, result.stderr); const payload = parseJson(result.stdout); assert.strictEqual(payload.dryRun, true); assert.strictEqual(payload.plan.mode, 'legacy'); assert.deepStrictEqual(payload.plan.languages, ['typescript']); }], ['routes implicit top-level args to install', () => { const result = runCli(['--dry-run', '--json', 'typescript']); assert.strictEqual(result.status, 0, result.stderr); const payload = parseJson(result.stdout); assert.strictEqual(payload.dryRun, true); assert.strictEqual(payload.plan.mode, 'legacy'); assert.deepStrictEqual(payload.plan.languages, ['typescript']); }], ['delegates plan command', () => { const result = runCli(['plan', '--list-profiles', '--json']); assert.strictEqual(result.status, 0, result.stderr); const payload = parseJson(result.stdout); assert.ok(Array.isArray(payload.profiles)); assert.ok(payload.profiles.length > 0); }], ['delegates lifecycle commands', () => { const homeDir = createTempDir('ecc-cli-home-'); const projectRoot = createTempDir('ecc-cli-project-'); const result = runCli(['list-installed', '--json'], { cwd: projectRoot, env: { HOME: homeDir }, }); assert.strictEqual(result.status, 0, result.stderr); const payload = parseJson(result.stdout); assert.deepStrictEqual(payload.records, []); }], ['delegates session-inspect command', () => { const homeDir = createTempDir('ecc-cli-home-'); const sessionsDir = path.join(homeDir, '.claude', 'sessions'); fs.mkdirSync(sessionsDir, { recursive: true }); fs.writeFileSync( path.join(sessionsDir, '2026-03-13-a1b2c3d4-session.tmp'), '# ECC Session\n\n**Branch:** feat/ecc-cli\n' ); const result = runCli(['session-inspect', 'claude:latest'], { env: { HOME: homeDir }, }); assert.strictEqual(result.status, 0, result.stderr); const payload = parseJson(result.stdout); assert.strictEqual(payload.adapterId, 'claude-history'); assert.strictEqual(payload.workers[0].branch, 'feat/ecc-cli'); }], ['supports help for a subcommand', () => { const result = runCli(['help', 'repair']); assert.strictEqual(result.status, 0, result.stderr); assert.match(result.stdout, /Usage: node scripts\/repair\.js/); }], ['fails on unknown commands instead of treating them as installs', () => { const result = runCli(['bogus']); assert.strictEqual(result.status, 1); assert.match(result.stderr, /Unknown command: bogus/); }], ['fails on unknown help subcommands', () => { const result = runCli(['help', 'bogus']); assert.strictEqual(result.status, 1); assert.match(result.stderr, /Unknown command: bogus/); }], ]; for (const [name, fn] of tests) { if (runTest(name, fn)) { passed += 1; } else { failed += 1; } } console.log(`\nResults: Passed: ${passed}, Failed: ${failed}`); process.exit(failed > 0 ? 1 : 0); } main();