mirror of
https://github.com/affaan-m/everything-claude-code.git
synced 2026-03-30 13:43:26 +08:00
168 lines
5.6 KiB
JavaScript
168 lines
5.6 KiB
JavaScript
/**
|
|
* 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 = {}) {
|
|
const envOverrides = {
|
|
...(options.env || {}),
|
|
};
|
|
|
|
if (typeof envOverrides.HOME === 'string' && !('USERPROFILE' in envOverrides)) {
|
|
envOverrides.USERPROFILE = envOverrides.HOME;
|
|
}
|
|
|
|
if (typeof envOverrides.USERPROFILE === 'string' && !('HOME' in envOverrides)) {
|
|
envOverrides.HOME = envOverrides.USERPROFILE;
|
|
}
|
|
|
|
return spawnSync('node', [SCRIPT, ...args], {
|
|
encoding: 'utf8',
|
|
cwd: options.cwd || process.cwd(),
|
|
maxBuffer: 10 * 1024 * 1024,
|
|
env: {
|
|
...process.env,
|
|
...envOverrides,
|
|
},
|
|
});
|
|
}
|
|
|
|
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, /catalog/);
|
|
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-compat');
|
|
assert.deepStrictEqual(payload.plan.legacyLanguages, ['typescript']);
|
|
assert.ok(payload.plan.selectedModuleIds.includes('framework-language'));
|
|
}],
|
|
['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-compat');
|
|
assert.deepStrictEqual(payload.plan.legacyLanguages, ['typescript']);
|
|
assert.ok(payload.plan.selectedModuleIds.includes('framework-language'));
|
|
}],
|
|
['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 catalog command', () => {
|
|
const result = runCli(['catalog', 'show', 'framework:nextjs', '--json']);
|
|
assert.strictEqual(result.status, 0, result.stderr);
|
|
const payload = parseJson(result.stdout);
|
|
assert.strictEqual(payload.id, 'framework:nextjs');
|
|
assert.deepStrictEqual(payload.moduleIds, ['framework-language']);
|
|
}],
|
|
['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/);
|
|
}],
|
|
['supports help for the catalog subcommand', () => {
|
|
const result = runCli(['help', 'catalog']);
|
|
assert.strictEqual(result.status, 0, result.stderr);
|
|
assert.match(result.stdout, /node scripts\/catalog\.js show <component-id>/);
|
|
}],
|
|
['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();
|