mirror of
https://github.com/affaan-m/everything-claude-code.git
synced 2026-04-08 10:23:30 +08:00
test: add 7 package-manager priority and source detection tests
- Test valid project-config detection (.claude/package-manager.json) - Test priority order: project-config > package.json > lock-file - Test package.json > lock-file priority - Test default fallback to npm - Test setPreferredPackageManager success case - Test getCommandPattern for test and build actions
This commit is contained in:
@@ -607,6 +607,137 @@ function runTests() {
|
|||||||
}
|
}
|
||||||
})) passed++; else failed++;
|
})) passed++; else failed++;
|
||||||
|
|
||||||
|
// getPackageManager source detection tests
|
||||||
|
console.log('\ngetPackageManager (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' }));
|
||||||
|
|
||||||
|
const originalEnv = process.env.CLAUDE_PACKAGE_MANAGER;
|
||||||
|
try {
|
||||||
|
delete process.env.CLAUDE_PACKAGE_MANAGER;
|
||||||
|
const result = pm.getPackageManager({ projectDir: testDir });
|
||||||
|
assert.strictEqual(result.name, 'pnpm', 'Should detect pnpm from project config');
|
||||||
|
assert.strictEqual(result.source, 'project-config', 'Source should be project-config');
|
||||||
|
} finally {
|
||||||
|
if (originalEnv !== undefined) {
|
||||||
|
process.env.CLAUDE_PACKAGE_MANAGER = originalEnv;
|
||||||
|
}
|
||||||
|
fs.rmSync(testDir, { recursive: true, force: true });
|
||||||
|
}
|
||||||
|
})) 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' }));
|
||||||
|
// package.json says yarn
|
||||||
|
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;
|
||||||
|
const result = pm.getPackageManager({ projectDir: testDir });
|
||||||
|
assert.strictEqual(result.name, 'bun', 'Project config should win over package.json and lock file');
|
||||||
|
assert.strictEqual(result.source, 'project-config');
|
||||||
|
} finally {
|
||||||
|
if (originalEnv !== undefined) {
|
||||||
|
process.env.CLAUDE_PACKAGE_MANAGER = originalEnv;
|
||||||
|
}
|
||||||
|
fs.rmSync(testDir, { recursive: true, force: true });
|
||||||
|
}
|
||||||
|
})) 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' }));
|
||||||
|
// 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;
|
||||||
|
const result = pm.getPackageManager({ projectDir: testDir });
|
||||||
|
assert.strictEqual(result.name, 'yarn', 'package.json should win over lock file');
|
||||||
|
assert.strictEqual(result.source, 'package.json');
|
||||||
|
} finally {
|
||||||
|
if (originalEnv !== undefined) {
|
||||||
|
process.env.CLAUDE_PACKAGE_MANAGER = originalEnv;
|
||||||
|
}
|
||||||
|
fs.rmSync(testDir, { recursive: true, force: true });
|
||||||
|
}
|
||||||
|
})) passed++; else failed++;
|
||||||
|
|
||||||
|
if (test('defaults to npm when no config found', () => {
|
||||||
|
const testDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pm-default-'));
|
||||||
|
const originalEnv = process.env.CLAUDE_PACKAGE_MANAGER;
|
||||||
|
try {
|
||||||
|
delete process.env.CLAUDE_PACKAGE_MANAGER;
|
||||||
|
const result = pm.getPackageManager({ projectDir: testDir });
|
||||||
|
assert.strictEqual(result.name, 'npm', 'Should default to npm');
|
||||||
|
assert.strictEqual(result.source, 'default');
|
||||||
|
} finally {
|
||||||
|
if (originalEnv !== undefined) {
|
||||||
|
process.env.CLAUDE_PACKAGE_MANAGER = originalEnv;
|
||||||
|
}
|
||||||
|
fs.rmSync(testDir, { recursive: true, force: true });
|
||||||
|
}
|
||||||
|
})) passed++; else failed++;
|
||||||
|
|
||||||
|
// setPreferredPackageManager success
|
||||||
|
console.log('\nsetPreferredPackageManager (success):');
|
||||||
|
|
||||||
|
if (test('successfully saves preferred package manager', () => {
|
||||||
|
// This writes to ~/.claude/package-manager.json — read original to restore
|
||||||
|
const utils = require('../../scripts/lib/utils');
|
||||||
|
const configPath = path.join(utils.getClaudeDir(), 'package-manager.json');
|
||||||
|
const original = utils.readFile(configPath);
|
||||||
|
try {
|
||||||
|
const config = pm.setPreferredPackageManager('bun');
|
||||||
|
assert.strictEqual(config.packageManager, 'bun');
|
||||||
|
assert.ok(config.setAt, 'Should have setAt timestamp');
|
||||||
|
// Verify it was persisted
|
||||||
|
const saved = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
||||||
|
assert.strictEqual(saved.packageManager, 'bun');
|
||||||
|
} finally {
|
||||||
|
// Restore original config
|
||||||
|
if (original) {
|
||||||
|
fs.writeFileSync(configPath, original, 'utf8');
|
||||||
|
} else {
|
||||||
|
try { fs.unlinkSync(configPath); } catch {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})) passed++; else failed++;
|
||||||
|
|
||||||
|
// getCommandPattern completeness
|
||||||
|
console.log('\ngetCommandPattern (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++;
|
||||||
|
|
||||||
|
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++;
|
||||||
|
|
||||||
if (test('ignores unknown env var package manager', () => {
|
if (test('ignores unknown env var package manager', () => {
|
||||||
const originalEnv = process.env.CLAUDE_PACKAGE_MANAGER;
|
const originalEnv = process.env.CLAUDE_PACKAGE_MANAGER;
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user