test: add replaceInFile write failure, empty sessions dir, and corrupted global config tests (Round 61)

- utils.test.js: replaceInFile returns false on read-only file (catch block)
- session-manager.test.js: getAllSessions returns empty when sessions dir missing
- package-manager.test.js: getPackageManager falls through corrupted global config to npm default

788 tests total, all passing.
This commit is contained in:
Affaan Mustafa
2026-02-13 06:44:52 -08:00
parent 9afecedb21
commit 3ec0aa7b50
3 changed files with 83 additions and 0 deletions

View File

@@ -1196,6 +1196,40 @@ function runTests() {
}
})) passed++; else failed++;
// getPackageManager falls through corrupted global config to npm default
if (test('getPackageManager falls through corrupted global config to npm default', () => {
const tmpDir = createTestDir();
const projDir = path.join(tmpDir, 'proj');
fs.mkdirSync(projDir, { recursive: true });
const origHome = process.env.HOME;
const origUserProfile = process.env.USERPROFILE;
const origPM = process.env.CLAUDE_PACKAGE_MANAGER;
try {
// Create corrupted global config file
const claudeDir = path.join(tmpDir, '.claude');
fs.mkdirSync(claudeDir, { recursive: true });
fs.writeFileSync(path.join(claudeDir, 'package-manager.json'), '{ invalid json !!!', 'utf8');
process.env.HOME = tmpDir;
process.env.USERPROFILE = tmpDir;
delete process.env.CLAUDE_PACKAGE_MANAGER;
// Re-require to pick up new HOME
delete require.cache[require.resolve('../../scripts/lib/package-manager')];
delete require.cache[require.resolve('../../scripts/lib/utils')];
const freshPM = require('../../scripts/lib/package-manager');
// Empty project dir: no lock file, no package.json, no project config
const result = freshPM.getPackageManager({ projectDir: projDir });
assert.strictEqual(result.name, 'npm', 'Should fall through to npm default');
assert.strictEqual(result.source, 'default', 'Source should be default');
} finally {
process.env.HOME = origHome;
process.env.USERPROFILE = origUserProfile;
if (origPM !== undefined) process.env.CLAUDE_PACKAGE_MANAGER = origPM;
delete require.cache[require.resolve('../../scripts/lib/package-manager')];
delete require.cache[require.resolve('../../scripts/lib/utils')];
cleanupTestDir(tmpDir);
}
})) passed++; else failed++;
// Summary
console.log('\n=== Test Results ===');
console.log(`Passed: ${passed}`);

View File

@@ -1139,6 +1139,32 @@ src/main.ts
assert.strictEqual(meta.completed[0], 'Lowercase task');
})) passed++; else failed++;
// getAllSessions returns empty result when sessions directory does not exist
if (test('getAllSessions returns empty when sessions dir missing', () => {
const tmpDir = createTempSessionDir();
const origHome = process.env.HOME;
const origUserProfile = process.env.USERPROFILE;
try {
// Point HOME to a dir with no .claude/sessions/
process.env.HOME = tmpDir;
process.env.USERPROFILE = tmpDir;
// Re-require to pick up new HOME
delete require.cache[require.resolve('../../scripts/lib/session-manager')];
delete require.cache[require.resolve('../../scripts/lib/utils')];
const freshSM = require('../../scripts/lib/session-manager');
const result = freshSM.getAllSessions();
assert.deepStrictEqual(result.sessions, [], 'Should return empty sessions array');
assert.strictEqual(result.total, 0, 'Total should be 0');
assert.strictEqual(result.hasMore, false, 'hasMore should be false');
} finally {
process.env.HOME = origHome;
process.env.USERPROFILE = origUserProfile;
delete require.cache[require.resolve('../../scripts/lib/session-manager')];
delete require.cache[require.resolve('../../scripts/lib/utils')];
cleanup(tmpDir);
}
})) passed++; else failed++;
// Summary
console.log(`\nResults: Passed: ${passed}, Failed: ${failed}`);
process.exit(failed > 0 ? 1 : 0);

View File

@@ -1025,6 +1025,29 @@ function runTests() {
assert.strictEqual(parsed.test, 'settled-guard', 'Should parse normally when end fires first');
})) passed++; else failed++;
// replaceInFile returns false when write fails (e.g., read-only file)
if (test('replaceInFile returns false on write failure (read-only file)', () => {
if (process.platform === 'win32' || process.getuid?.() === 0) {
console.log(' (skipped — chmod ineffective on Windows/root)');
return;
}
const testDir = path.join(utils.getTempDir(), `utils-test-readonly-${Date.now()}`);
fs.mkdirSync(testDir, { recursive: true });
const filePath = path.join(testDir, 'readonly.txt');
try {
fs.writeFileSync(filePath, 'hello world', 'utf8');
fs.chmodSync(filePath, 0o444);
const result = utils.replaceInFile(filePath, 'hello', 'goodbye');
assert.strictEqual(result, false, 'Should return false when file is read-only');
// Verify content unchanged
const content = fs.readFileSync(filePath, 'utf8');
assert.strictEqual(content, 'hello world', 'Original content should be preserved');
} finally {
fs.chmodSync(filePath, 0o644);
fs.rmSync(testDir, { recursive: true, force: true });
}
})) passed++; else failed++;
// Summary
console.log('\n=== Test Results ===');
console.log(`Passed: ${passed}`);