From 567664091daccc7b9c6f9da42b7b52a20776b804 Mon Sep 17 00:00:00 2001 From: Affaan Mustafa Date: Fri, 13 Feb 2026 07:35:20 -0800 Subject: [PATCH] test: add 3 tests for untested code paths (Round 69, 812 total) - getGitModifiedFiles: all-invalid patterns skip filtering (compiled.length === 0) - getSessionById: returns null when sessions directory doesn't exist - getPackageManager: global-config success path returns source 'global-config' --- tests/lib/package-manager.test.js | 39 +++++++++++++++++++++++++++++++ tests/lib/session-manager.test.js | 26 +++++++++++++++++++++ tests/lib/utils.test.js | 14 +++++++++++ 3 files changed, 79 insertions(+) diff --git a/tests/lib/package-manager.test.js b/tests/lib/package-manager.test.js index a4f1eb14..fc81cb40 100644 --- a/tests/lib/package-manager.test.js +++ b/tests/lib/package-manager.test.js @@ -1230,6 +1230,45 @@ function runTests() { } })) passed++; else failed++; + // ── Round 69: getPackageManager global-config success path ── + console.log('\nRound 69: getPackageManager (global-config success):'); + + if (test('getPackageManager returns source global-config when valid global config exists', () => { + 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 valid global config with pnpm preference + const claudeDir = path.join(tmpDir, '.claude'); + fs.mkdirSync(claudeDir, { recursive: true }); + fs.writeFileSync(path.join(claudeDir, 'package-manager.json'), + JSON.stringify({ packageManager: 'pnpm', setAt: '2026-01-01T00:00:00Z' }), '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, 'pnpm', 'Should detect pnpm from global config'); + assert.strictEqual(result.source, 'global-config', 'Source should be global-config'); + assert.ok(result.config, 'Should include config object'); + assert.strictEqual(result.config.lockFile, 'pnpm-lock.yaml', 'Config should match pnpm'); + } 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}`); diff --git a/tests/lib/session-manager.test.js b/tests/lib/session-manager.test.js index 3e651acf..93fcc44d 100644 --- a/tests/lib/session-manager.test.js +++ b/tests/lib/session-manager.test.js @@ -1181,6 +1181,32 @@ src/main.ts } })) passed++; else failed++; + // ── Round 69: getSessionById returns null when sessions dir missing ── + console.log('\nRound 69: getSessionById (missing sessions directory):'); + + if (test('getSessionById returns null when sessions directory does not exist', () => { + 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.getSessionById('anything'); + assert.strictEqual(result, null, 'Should return null when sessions dir does not exist'); + } 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); diff --git a/tests/lib/utils.test.js b/tests/lib/utils.test.js index eb0c85e3..224026c1 100644 --- a/tests/lib/utils.test.js +++ b/tests/lib/utils.test.js @@ -1048,6 +1048,20 @@ function runTests() { } })) passed++; else failed++; + // ── Round 69: getGitModifiedFiles with ALL invalid patterns ── + console.log('\ngetGitModifiedFiles all-invalid patterns (Round 69):'); + + if (test('getGitModifiedFiles with all-invalid patterns skips filtering (returns all files)', () => { + // When every pattern is invalid regex, compiled.length === 0 at line 386, + // so the filtering is skipped entirely and all modified files are returned. + // This differs from the mixed-valid test where at least one pattern compiles. + const allInvalid = utils.getGitModifiedFiles(['(unclosed', '[bad', '**invalid']); + const unfiltered = utils.getGitModifiedFiles(); + // Both should return the same list — all-invalid patterns = no filtering + assert.deepStrictEqual(allInvalid, unfiltered, + 'All-invalid patterns should return same result as no patterns (no filtering)'); + })) passed++; else failed++; + // Summary console.log('\n=== Test Results ==='); console.log(`Passed: ${passed}`);