From 0bf47bbb41c4a2a2b8511368206c7fd67c4a5826 Mon Sep 17 00:00:00 2001 From: Pangerkumzuk Longkumer <73515951+pangerlkr@users.noreply.github.com> Date: Wed, 18 Feb 2026 07:29:16 +0530 Subject: [PATCH] Update print statement from 'Hfix: update package manager tests and add summaryello' to 'Goodbye' --- tests/lib/package-manager.test.js | 743 ++++++++++++++++++------------ 1 file changed, 450 insertions(+), 293 deletions(-) diff --git a/tests/lib/package-manager.test.js b/tests/lib/package-manager.test.js index a9b32f7b..58818e93 100644 --- a/tests/lib/package-manager.test.js +++ b/tests/lib/package-manager.test.js @@ -16,11 +16,11 @@ const pm = require('../../scripts/lib/package-manager'); function test(name, fn) { try { fn(); - console.log(` ✓ ${name}`); + console.log(` ✓ ${name}`); return true; } catch (err) { - console.log(` ✗ ${name}`); - console.log(` Error: ${err.message}`); + console.log(` ✗ ${name}`); + console.log(` Error: ${err.message}`); return false; } } @@ -39,7 +39,9 @@ function cleanupTestDir(testDir) { // Test suite function runTests() { - console.log('\n=== Testing package-manager.js ===\n'); + console.log(' +=== Testing package-manager.js === +'); let passed = 0; let failed = 0; @@ -52,7 +54,8 @@ function runTests() { assert.ok(pm.PACKAGE_MANAGERS.pnpm, 'Should have pnpm'); assert.ok(pm.PACKAGE_MANAGERS.yarn, 'Should have yarn'); assert.ok(pm.PACKAGE_MANAGERS.bun, 'Should have bun'); - })) passed++; else failed++; + })) passed++; + else failed++; if (test('Each manager has required properties', () => { const requiredProps = ['name', 'lockFile', 'installCmd', 'runCmd', 'execCmd', 'testCmd', 'buildCmd', 'devCmd']; @@ -61,10 +64,12 @@ function runTests() { assert.ok(config[prop], `${name} should have ${prop}`); } } - })) passed++; else failed++; + })) passed++; + else failed++; // detectFromLockFile tests - console.log('\ndetectFromLockFile:'); + console.log(' +detectFromLockFile:'); if (test('detects npm from package-lock.json', () => { const testDir = createTestDir(); @@ -75,7 +80,8 @@ function runTests() { } finally { cleanupTestDir(testDir); } - })) passed++; else failed++; + })) passed++; + else failed++; if (test('detects pnpm from pnpm-lock.yaml', () => { const testDir = createTestDir(); @@ -86,7 +92,8 @@ function runTests() { } finally { cleanupTestDir(testDir); } - })) passed++; else failed++; + })) passed++; + else failed++; if (test('detects yarn from yarn.lock', () => { const testDir = createTestDir(); @@ -97,7 +104,8 @@ function runTests() { } finally { cleanupTestDir(testDir); } - })) passed++; else failed++; + })) passed++; + else failed++; if (test('detects bun from bun.lockb', () => { const testDir = createTestDir(); @@ -108,7 +116,8 @@ function runTests() { } finally { cleanupTestDir(testDir); } - })) passed++; else failed++; + })) passed++; + else failed++; if (test('returns null when no lock file exists', () => { const testDir = createTestDir(); @@ -118,7 +127,8 @@ function runTests() { } finally { cleanupTestDir(testDir); } - })) passed++; else failed++; + })) passed++; + else failed++; if (test('respects detection priority (pnpm > npm)', () => { const testDir = createTestDir(); @@ -132,51 +142,48 @@ function runTests() { } finally { cleanupTestDir(testDir); } - })) passed++; else failed++; + })) passed++; + else failed++; // detectFromPackageJson tests - console.log('\ndetectFromPackageJson:'); + console.log(' +detectFromPackageJson:'); if (test('detects package manager from packageManager field', () => { const testDir = createTestDir(); try { - fs.writeFileSync(path.join(testDir, 'package.json'), JSON.stringify({ - name: 'test', - packageManager: 'pnpm@8.6.0' - })); + fs.writeFileSync(path.join(testDir, 'package.json'), JSON.stringify({ name: 'test', packageManager: 'pnpm@8.6.0' })); const result = pm.detectFromPackageJson(testDir); assert.strictEqual(result, 'pnpm'); } finally { cleanupTestDir(testDir); } - })) passed++; else failed++; + })) passed++; + else failed++; if (test('handles packageManager without version', () => { const testDir = createTestDir(); try { - fs.writeFileSync(path.join(testDir, 'package.json'), JSON.stringify({ - name: 'test', - packageManager: 'yarn' - })); + fs.writeFileSync(path.join(testDir, 'package.json'), JSON.stringify({ name: 'test', packageManager: 'yarn' })); const result = pm.detectFromPackageJson(testDir); assert.strictEqual(result, 'yarn'); } finally { cleanupTestDir(testDir); } - })) passed++; else failed++; + })) passed++; + else failed++; if (test('returns null when no packageManager field', () => { const testDir = createTestDir(); try { - fs.writeFileSync(path.join(testDir, 'package.json'), JSON.stringify({ - name: 'test' - })); + fs.writeFileSync(path.join(testDir, 'package.json'), JSON.stringify({ name: 'test' })); const result = pm.detectFromPackageJson(testDir); assert.strictEqual(result, null); } finally { cleanupTestDir(testDir); } - })) passed++; else failed++; + })) passed++; + else failed++; if (test('returns null when no package.json exists', () => { const testDir = createTestDir(); @@ -186,27 +193,32 @@ function runTests() { } finally { cleanupTestDir(testDir); } - })) passed++; else failed++; + })) passed++; + else failed++; // getAvailablePackageManagers tests - console.log('\ngetAvailablePackageManagers:'); + console.log(' +getAvailablePackageManagers:'); if (test('returns array of available managers', () => { const available = pm.getAvailablePackageManagers(); assert.ok(Array.isArray(available), 'Should return array'); // npm should always be available with Node.js assert.ok(available.includes('npm'), 'npm should be available'); - })) passed++; else failed++; + })) passed++; + else failed++; // getPackageManager tests - console.log('\ngetPackageManager:'); + console.log(' +getPackageManager:'); if (test('returns object with name, config, and source', () => { const result = pm.getPackageManager(); assert.ok(result.name, 'Should have name'); assert.ok(result.config, 'Should have config'); assert.ok(result.source, 'Should have source'); - })) passed++; else failed++; + })) passed++; + else failed++; if (test('respects environment variable', () => { const originalEnv = process.env.CLAUDE_PACKAGE_MANAGER; @@ -222,12 +234,12 @@ function runTests() { delete process.env.CLAUDE_PACKAGE_MANAGER; } } - })) passed++; else failed++; + })) passed++; + else failed++; if (test('detects from lock file in project', () => { const originalEnv = process.env.CLAUDE_PACKAGE_MANAGER; delete process.env.CLAUDE_PACKAGE_MANAGER; - const testDir = createTestDir(); try { fs.writeFileSync(path.join(testDir, 'bun.lockb'), ''); @@ -240,10 +252,12 @@ function runTests() { process.env.CLAUDE_PACKAGE_MANAGER = originalEnv; } } - })) passed++; else failed++; + })) passed++; + else failed++; // getRunCommand tests - console.log('\ngetRunCommand:'); + console.log(' +getRunCommand:'); if (test('returns correct install command', () => { const originalEnv = process.env.CLAUDE_PACKAGE_MANAGER; @@ -258,7 +272,8 @@ function runTests() { delete process.env.CLAUDE_PACKAGE_MANAGER; } } - })) passed++; else failed++; + })) passed++; + else failed++; if (test('returns correct test command', () => { const originalEnv = process.env.CLAUDE_PACKAGE_MANAGER; @@ -273,10 +288,12 @@ function runTests() { delete process.env.CLAUDE_PACKAGE_MANAGER; } } - })) passed++; else failed++; + })) passed++; + else failed++; // getExecCommand tests - console.log('\ngetExecCommand:'); + console.log(' +getExecCommand:'); if (test('returns correct exec command for npm', () => { const originalEnv = process.env.CLAUDE_PACKAGE_MANAGER; @@ -291,7 +308,8 @@ function runTests() { delete process.env.CLAUDE_PACKAGE_MANAGER; } } - })) passed++; else failed++; + })) passed++; + else failed++; if (test('returns correct exec command for pnpm', () => { const originalEnv = process.env.CLAUDE_PACKAGE_MANAGER; @@ -306,10 +324,12 @@ function runTests() { delete process.env.CLAUDE_PACKAGE_MANAGER; } } - })) passed++; else failed++; + })) passed++; + else failed++; // getCommandPattern tests - console.log('\ngetCommandPattern:'); + console.log(' +getCommandPattern:'); if (test('generates pattern for dev command', () => { const pattern = pm.getCommandPattern('dev'); @@ -317,31 +337,35 @@ function runTests() { assert.ok(pattern.includes('pnpm'), 'Should include pnpm'); assert.ok(pattern.includes('yarn dev'), 'Should include yarn'); assert.ok(pattern.includes('bun run dev'), 'Should include bun'); - })) passed++; else failed++; + })) passed++; + else failed++; if (test('pattern matches actual commands', () => { const pattern = pm.getCommandPattern('test'); const regex = new RegExp(pattern); - assert.ok(regex.test('npm test'), 'Should match npm test'); assert.ok(regex.test('pnpm test'), 'Should match pnpm test'); assert.ok(regex.test('yarn test'), 'Should match yarn test'); assert.ok(regex.test('bun test'), 'Should match bun test'); assert.ok(!regex.test('cargo test'), 'Should not match cargo test'); - })) passed++; else failed++; + })) passed++; + else failed++; // getSelectionPrompt tests - console.log('\ngetSelectionPrompt:'); + console.log(' +getSelectionPrompt:'); if (test('returns informative prompt', () => { const prompt = pm.getSelectionPrompt(); assert.ok(prompt.includes('Supported package managers'), 'Should list supported managers'); assert.ok(prompt.includes('CLAUDE_PACKAGE_MANAGER'), 'Should mention env var'); assert.ok(prompt.includes('lock file'), 'Should mention lock file option'); - })) passed++; else failed++; + })) passed++; + else failed++; // setProjectPackageManager tests - console.log('\nsetProjectPackageManager:'); + console.log(' +setProjectPackageManager:'); if (test('sets project package manager', () => { const testDir = createTestDir(); @@ -349,7 +373,6 @@ function runTests() { const result = pm.setProjectPackageManager('pnpm', testDir); assert.strictEqual(result.packageManager, 'pnpm'); assert.ok(result.setAt, 'Should have setAt timestamp'); - // Verify file was created const configPath = path.join(testDir, '.claude', 'package-manager.json'); assert.ok(fs.existsSync(configPath), 'Config file should exist'); @@ -358,25 +381,30 @@ function runTests() { } finally { cleanupTestDir(testDir); } - })) passed++; else failed++; + })) passed++; + else failed++; if (test('rejects unknown package manager', () => { assert.throws(() => { pm.setProjectPackageManager('cargo'); }, /Unknown package manager/); - })) passed++; else failed++; + })) passed++; + else failed++; // setPreferredPackageManager tests - console.log('\nsetPreferredPackageManager:'); + console.log(' +setPreferredPackageManager:'); if (test('rejects unknown package manager', () => { assert.throws(() => { pm.setPreferredPackageManager('pip'); }, /Unknown package manager/); - })) passed++; else failed++; + })) passed++; + else failed++; // detectFromPackageJson edge cases - console.log('\ndetectFromPackageJson (edge cases):'); + console.log(' +detectFromPackageJson (edge cases):'); if (test('handles invalid JSON in package.json', () => { const testDir = createTestDir(); @@ -387,24 +415,24 @@ function runTests() { } finally { cleanupTestDir(testDir); } - })) passed++; else failed++; + })) passed++; + else failed++; if (test('returns null for unknown package manager in packageManager field', () => { const testDir = createTestDir(); try { - fs.writeFileSync(path.join(testDir, 'package.json'), JSON.stringify({ - name: 'test', - packageManager: 'deno@1.0' - })); + fs.writeFileSync(path.join(testDir, 'package.json'), JSON.stringify({ name: 'test', packageManager: 'deno@1.0' })); const result = pm.detectFromPackageJson(testDir); assert.strictEqual(result, null); } finally { cleanupTestDir(testDir); } - })) passed++; else failed++; + })) passed++; + else failed++; // getExecCommand edge cases - console.log('\ngetExecCommand (edge cases):'); + console.log(' +getExecCommand (edge cases):'); if (test('returns exec command without args', () => { const originalEnv = process.env.CLAUDE_PACKAGE_MANAGER; @@ -419,10 +447,12 @@ function runTests() { delete process.env.CLAUDE_PACKAGE_MANAGER; } } - })) passed++; else failed++; + })) passed++; + else failed++; // getRunCommand additional cases - console.log('\ngetRunCommand (additional):'); + console.log(' +getRunCommand (additional):'); if (test('returns correct build command', () => { const originalEnv = process.env.CLAUDE_PACKAGE_MANAGER; @@ -436,7 +466,8 @@ function runTests() { delete process.env.CLAUDE_PACKAGE_MANAGER; } } - })) passed++; else failed++; + })) passed++; + else failed++; if (test('returns correct dev command', () => { const originalEnv = process.env.CLAUDE_PACKAGE_MANAGER; @@ -450,7 +481,8 @@ function runTests() { delete process.env.CLAUDE_PACKAGE_MANAGER; } } - })) passed++; else failed++; + })) passed++; + else failed++; if (test('returns correct custom script command', () => { const originalEnv = process.env.CLAUDE_PACKAGE_MANAGER; @@ -464,21 +496,26 @@ function runTests() { delete process.env.CLAUDE_PACKAGE_MANAGER; } } - })) passed++; else failed++; + })) passed++; + else failed++; // DETECTION_PRIORITY tests - console.log('\nDETECTION_PRIORITY:'); + console.log(' +DETECTION_PRIORITY:'); if (test('has pnpm first', () => { assert.strictEqual(pm.DETECTION_PRIORITY[0], 'pnpm'); - })) passed++; else failed++; + })) passed++; + else failed++; if (test('has npm last', () => { assert.strictEqual(pm.DETECTION_PRIORITY[pm.DETECTION_PRIORITY.length - 1], 'npm'); - })) passed++; else failed++; + })) passed++; + else failed++; // getCommandPattern additional cases - console.log('\ngetCommandPattern (additional):'); + console.log(' +getCommandPattern (additional):'); if (test('generates pattern for install command', () => { const pattern = pm.getCommandPattern('install'); @@ -487,7 +524,8 @@ function runTests() { assert.ok(regex.test('pnpm install'), 'Should match pnpm install'); assert.ok(regex.test('yarn'), 'Should match yarn (install implicit)'); assert.ok(regex.test('bun install'), 'Should match bun install'); - })) passed++; else failed++; + })) passed++; + else failed++; if (test('generates pattern for custom action', () => { const pattern = pm.getCommandPattern('lint'); @@ -496,17 +534,18 @@ function runTests() { assert.ok(regex.test('pnpm lint'), 'Should match pnpm lint'); assert.ok(regex.test('yarn lint'), 'Should match yarn lint'); assert.ok(regex.test('bun run lint'), 'Should match bun run lint'); - })) passed++; else failed++; + })) passed++; + else failed++; // getPackageManager robustness tests - console.log('\ngetPackageManager (robustness):'); + console.log(' +getPackageManager (robustness):'); if (test('falls through on corrupted project config JSON', () => { const testDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pm-robust-')); const claudeDir = path.join(testDir, '.claude'); fs.mkdirSync(claudeDir, { recursive: true }); fs.writeFileSync(path.join(claudeDir, 'package-manager.json'), '{not valid json!!!'); - const originalEnv = process.env.CLAUDE_PACKAGE_MANAGER; try { delete process.env.CLAUDE_PACKAGE_MANAGER; @@ -520,15 +559,14 @@ function runTests() { } fs.rmSync(testDir, { recursive: true, force: true }); } - })) passed++; else failed++; + })) passed++; + else failed++; if (test('falls through on project config with unknown PM', () => { const testDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pm-robust-')); const claudeDir = path.join(testDir, '.claude'); fs.mkdirSync(claudeDir, { recursive: true }); - fs.writeFileSync(path.join(claudeDir, 'package-manager.json'), - JSON.stringify({ packageManager: 'nonexistent-pm' })); - + fs.writeFileSync(path.join(claudeDir, 'package-manager.json'), JSON.stringify({ packageManager: 'nonexistent-pm' })); const originalEnv = process.env.CLAUDE_PACKAGE_MANAGER; try { delete process.env.CLAUDE_PACKAGE_MANAGER; @@ -541,26 +579,32 @@ function runTests() { } fs.rmSync(testDir, { recursive: true, force: true }); } - })) passed++; else failed++; + })) passed++; + else failed++; // getRunCommand validation tests - console.log('\ngetRunCommand (validation):'); + console.log(' +getRunCommand (validation):'); if (test('rejects empty script name', () => { assert.throws(() => pm.getRunCommand(''), /non-empty string/); - })) passed++; else failed++; + })) passed++; + else failed++; if (test('rejects null script name', () => { assert.throws(() => pm.getRunCommand(null), /non-empty string/); - })) passed++; else failed++; + })) passed++; + else failed++; if (test('rejects script name with shell metacharacters', () => { assert.throws(() => pm.getRunCommand('test; rm -rf /'), /unsafe characters/); - })) passed++; else failed++; + })) passed++; + else failed++; if (test('rejects script name with backticks', () => { assert.throws(() => pm.getRunCommand('test`whoami`'), /unsafe characters/); - })) passed++; else failed++; + })) passed++; + else failed++; if (test('accepts scoped package names', () => { const originalEnv = process.env.CLAUDE_PACKAGE_MANAGER; @@ -575,22 +619,27 @@ function runTests() { delete process.env.CLAUDE_PACKAGE_MANAGER; } } - })) passed++; else failed++; + })) passed++; + else failed++; // getExecCommand validation tests - console.log('\ngetExecCommand (validation):'); + console.log(' +getExecCommand (validation):'); if (test('rejects empty binary name', () => { assert.throws(() => pm.getExecCommand(''), /non-empty string/); - })) passed++; else failed++; + })) passed++; + else failed++; if (test('rejects null binary name', () => { assert.throws(() => pm.getExecCommand(null), /non-empty string/); - })) passed++; else failed++; + })) passed++; + else failed++; if (test('rejects binary name with shell metacharacters', () => { assert.throws(() => pm.getExecCommand('prettier; cat /etc/passwd'), /unsafe characters/); - })) passed++; else failed++; + })) passed++; + else failed++; if (test('accepts dotted binary names like tsc', () => { const originalEnv = process.env.CLAUDE_PACKAGE_MANAGER; @@ -605,18 +654,18 @@ function runTests() { delete process.env.CLAUDE_PACKAGE_MANAGER; } } - })) passed++; else failed++; + })) passed++; + else failed++; // getPackageManager source detection tests - console.log('\ngetPackageManager (source detection):'); + console.log(' +getPackageManager (source detection):'); if (test('detects from valid project-config (.claude/package-manager.json)', () => { const testDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pm-projcfg-')); const claudeDir = path.join(testDir, '.claude'); fs.mkdirSync(claudeDir, { recursive: true }); - fs.writeFileSync(path.join(claudeDir, 'package-manager.json'), - JSON.stringify({ packageManager: 'pnpm' })); - + fs.writeFileSync(path.join(claudeDir, 'package-manager.json'), JSON.stringify({ packageManager: 'pnpm' })); const originalEnv = process.env.CLAUDE_PACKAGE_MANAGER; try { delete process.env.CLAUDE_PACKAGE_MANAGER; @@ -629,22 +678,19 @@ function runTests() { } fs.rmSync(testDir, { recursive: true, force: true }); } - })) passed++; else failed++; + })) passed++; + else failed++; if (test('project-config takes priority over package.json', () => { const testDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pm-priority-')); const claudeDir = path.join(testDir, '.claude'); fs.mkdirSync(claudeDir, { recursive: true }); - // Project config says bun - fs.writeFileSync(path.join(claudeDir, 'package-manager.json'), - JSON.stringify({ packageManager: 'bun' })); + fs.writeFileSync(path.join(claudeDir, 'package-manager.json'), JSON.stringify({ packageManager: 'bun' })); // package.json says yarn - fs.writeFileSync(path.join(testDir, 'package.json'), - JSON.stringify({ packageManager: 'yarn@4.0.0' })); + fs.writeFileSync(path.join(testDir, 'package.json'), JSON.stringify({ packageManager: 'yarn@4.0.0' })); // Lock file says npm fs.writeFileSync(path.join(testDir, 'package-lock.json'), '{}'); - const originalEnv = process.env.CLAUDE_PACKAGE_MANAGER; try { delete process.env.CLAUDE_PACKAGE_MANAGER; @@ -657,16 +703,15 @@ function runTests() { } fs.rmSync(testDir, { recursive: true, force: true }); } - })) passed++; else failed++; + })) passed++; + else failed++; if (test('package.json takes priority over lock file', () => { const testDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pm-pj-lock-')); // package.json says yarn - fs.writeFileSync(path.join(testDir, 'package.json'), - JSON.stringify({ packageManager: 'yarn@4.0.0' })); + fs.writeFileSync(path.join(testDir, 'package.json'), JSON.stringify({ packageManager: 'yarn@4.0.0' })); // Lock file says npm fs.writeFileSync(path.join(testDir, 'package-lock.json'), '{}'); - const originalEnv = process.env.CLAUDE_PACKAGE_MANAGER; try { delete process.env.CLAUDE_PACKAGE_MANAGER; @@ -679,7 +724,8 @@ function runTests() { } fs.rmSync(testDir, { recursive: true, force: true }); } - })) passed++; else failed++; + })) passed++; + else failed++; if (test('defaults to npm when no config found', () => { const testDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pm-default-')); @@ -695,10 +741,12 @@ function runTests() { } fs.rmSync(testDir, { recursive: true, force: true }); } - })) passed++; else failed++; + })) passed++; + else failed++; // setPreferredPackageManager success - console.log('\nsetPreferredPackageManager (success):'); + console.log(' +setPreferredPackageManager (success):'); if (test('successfully saves preferred package manager', () => { // This writes to ~/.claude/package-manager.json — read original to restore @@ -717,31 +765,40 @@ function runTests() { if (original) { fs.writeFileSync(configPath, original, 'utf8'); } else { - try { fs.unlinkSync(configPath); } catch {} + try { + fs.unlinkSync(configPath); + } catch (err) { + // ignore + } } } - })) passed++; else failed++; + })) passed++; + else failed++; // getCommandPattern completeness - console.log('\ngetCommandPattern (completeness):'); + console.log(' +getCommandPattern (completeness):'); if (test('generates pattern for test command', () => { const pattern = pm.getCommandPattern('test'); assert.ok(pattern.includes('npm test'), 'Should include npm test'); assert.ok(pattern.includes('pnpm test'), 'Should include pnpm test'); assert.ok(pattern.includes('bun test'), 'Should include bun test'); - })) passed++; else failed++; + })) passed++; + else failed++; if (test('generates pattern for build command', () => { const pattern = pm.getCommandPattern('build'); assert.ok(pattern.includes('npm run build'), 'Should include npm run build'); assert.ok(pattern.includes('yarn build'), 'Should include yarn build'); - })) passed++; else failed++; + })) passed++; + else failed++; // getRunCommand PM-specific format tests - console.log('\ngetRunCommand (PM-specific formats):'); + console.log(' +getRunCommand (PM-specific formats):'); - if (test('pnpm custom script: pnpm