Files
ccs/tests/npm/cli.test.js
T
semantic-release-botandkaitranntt bd46c8de12 fix(tests): migrate test suite from mocha to bun test runner
- Replace before()/after() with beforeAll()/afterAll()
- Remove this.timeout() calls (unsupported by bun)
- Update package.json scripts to use bun test
- Fix error message regex for cross-runtime compatibility
- Skip integration tests requiring network/child process mocking
- Format source files with prettier
2025-12-03 21:43:29 -05:00

155 lines
5.4 KiB
JavaScript

const assert = require('assert');
const { execSync } = require('child_process');
const path = require('path');
const { createTestEnvironment } = require('../shared/fixtures/test-environment');
describe('npm CLI', () => {
const ccsPath = path.join(__dirname, '..', '..', 'dist', 'ccs.js');
let testEnv;
let testCcsHome;
beforeAll(() => {
// Create isolated test environment
testEnv = createTestEnvironment();
testCcsHome = testEnv.testHome;
// Run postinstall to create config in test environment
const postinstallScript = path.join(__dirname, '..', '..', 'scripts', 'postinstall.js');
execSync(`node "${postinstallScript}"`, {
stdio: 'ignore',
env: { ...process.env, CCS_HOME: testCcsHome }
});
});
afterAll(() => {
// Clean up test environment
if (testEnv) {
testEnv.cleanup();
}
});
// Helper to run CLI with test environment
function runCli(args, options = {}) {
return execSync(`node "${ccsPath}" ${args}`, {
...options,
env: { ...process.env, CCS_HOME: testCcsHome }
});
}
describe('Argument parsing', () => {
it('handles flag -c without profile error', function() {
try {
runCli('-c', { stdio: 'pipe', timeout: 3000 });
} catch (e) {
const output = e.stderr?.toString() || e.stdout?.toString() || '';
// Should NOT show "Profile '-c' not found" error
assert(!output.includes("Profile '-c' not found"), 'Should not treat -c as profile');
}
});
it('handles flag --verbose without profile error', function() {
try {
runCli('--verbose', { stdio: 'pipe', timeout: 3000 });
} catch (e) {
const output = e.stderr?.toString() || e.stdout?.toString() || '';
assert(!output.includes("Profile '--verbose' not found"), 'Should not treat --verbose as profile');
}
});
it('handles flag -p with value', function() {
try {
runCli('-p "test prompt"', { stdio: 'pipe', timeout: 8000 });
} catch (e) {
const output = e.stderr?.toString() || e.stdout?.toString() || '';
assert(!output.includes("Profile '-p' not found"), 'Should not treat -p as profile');
}
});
it('handles multiple flags', function() {
try {
runCli('-c --verbose', { stdio: 'pipe', timeout: 3000 });
} catch (e) {
const output = e.stderr?.toString() || e.stdout?.toString() || '';
assert(!output.includes("Profile '-c' not found"), 'Should not treat flags as profiles');
assert(!output.includes("Profile '--verbose' not found"), 'Should not treat flags as profiles');
}
});
});
describe('Profile handling', () => {
it('loads glm profile', function() {
try {
runCli('glm --help', { stdio: 'pipe' });
} catch (e) {
const output = e.stderr?.toString() || '';
assert(!output.includes("Profile 'glm' not found"), 'GLM profile should exist');
}
});
it('shows error for invalid profile', function() {
try {
runCli('invalid-profile-name', { stdio: 'pipe' });
assert(false, 'Should have thrown an error for invalid profile');
} catch (e) {
const output = e.stderr?.toString() || e.stdout?.toString() || '';
assert(output.includes("not found") || output.includes("invalid"), 'Should show profile not found error');
}
});
it('handles profile with flags', function() {
try {
runCli('glm -c', { stdio: 'pipe', timeout: 3000 });
} catch (e) {
const output = e.stderr?.toString() || '';
assert(!output.includes("Profile 'glm' not found"), 'GLM profile should exist');
assert(!output.includes("Profile '-c' not found"), 'Should not treat -c as profile');
}
});
});
describe('Version and help', () => {
it('shows version with --version flag', function() {
const output = runCli('--version', { encoding: 'utf8' });
assert(/\d+\.\d+\.\d+/.test(output), 'Should show version number');
});
it('shows version with -v flag', function() {
const output = runCli('-v', { encoding: 'utf8' });
assert(/\d+\.\d+\.\d+/.test(output), 'Should show version number');
});
it('shows help with --help flag', function() {
const output = runCli('--help', { encoding: 'utf8' });
assert(/usage|help|options/i.test(output), 'Should show help information');
});
it('shows help with -h flag', function() {
const output = runCli('-h', { encoding: 'utf8' });
assert(/usage|help|options/i.test(output), 'Should show help information');
});
});
describe('Error handling', () => {
it('handles empty arguments gracefully', function() {
try {
runCli('', { stdio: 'pipe' });
} catch (e) {
// Should either succeed or fail gracefully with a helpful error
const output = e.stderr?.toString() || e.stdout?.toString() || '';
assert(!output.includes('TypeError') && !output.includes('Cannot read'), 'Should not crash with TypeError');
}
});
it('handles very long argument', function() {
const longArg = 'a'.repeat(1000);
try {
runCli(`"${longArg}"`, { stdio: 'pipe' });
} catch (e) {
// Should handle gracefully, not crash
const output = e.stderr?.toString() || e.stdout?.toString() || '';
assert(!output.includes('TypeError') && !output.includes('Cannot read'), 'Should not crash with TypeError');
}
});
});
});