summaryrefslogtreecommitdiff
path: root/packages/cli/src/config/settings.test.ts
diff options
context:
space:
mode:
authorOleksandr Gotgelf <[email protected]>2025-08-03 20:44:15 +0200
committerGitHub <[email protected]>2025-08-03 18:44:15 +0000
commit03ed37d0dc2b5e2077b53073517abaab3d24d9c2 (patch)
treee84a6cadef21cc6862b12215153b3e1177a1732d /packages/cli/src/config/settings.test.ts
parentbedcbb9feb3b4f5fcdd9d64782f3ee1e06376715 (diff)
fix: exclude DEBUG and DEBUG_MODE from project .env files by default (#5289)
Co-authored-by: Jacob Richman <[email protected]>
Diffstat (limited to 'packages/cli/src/config/settings.test.ts')
-rw-r--r--packages/cli/src/config/settings.test.ts216
1 files changed, 216 insertions, 0 deletions
diff --git a/packages/cli/src/config/settings.test.ts b/packages/cli/src/config/settings.test.ts
index b8ecbb62..4099e778 100644
--- a/packages/cli/src/config/settings.test.ts
+++ b/packages/cli/src/config/settings.test.ts
@@ -334,6 +334,86 @@ describe('Settings Loading and Merging', () => {
expect(settings.merged.contextFileName).toBe('PROJECT_SPECIFIC.md');
});
+ it('should handle excludedProjectEnvVars correctly when only in user settings', () => {
+ (mockFsExistsSync as Mock).mockImplementation(
+ (p: fs.PathLike) => p === USER_SETTINGS_PATH,
+ );
+ const userSettingsContent = {
+ excludedProjectEnvVars: ['DEBUG', 'NODE_ENV', 'CUSTOM_VAR'],
+ };
+ (fs.readFileSync as Mock).mockImplementation(
+ (p: fs.PathOrFileDescriptor) => {
+ if (p === USER_SETTINGS_PATH)
+ return JSON.stringify(userSettingsContent);
+ return '';
+ },
+ );
+
+ const settings = loadSettings(MOCK_WORKSPACE_DIR);
+ expect(settings.merged.excludedProjectEnvVars).toEqual([
+ 'DEBUG',
+ 'NODE_ENV',
+ 'CUSTOM_VAR',
+ ]);
+ });
+
+ it('should handle excludedProjectEnvVars correctly when only in workspace settings', () => {
+ (mockFsExistsSync as Mock).mockImplementation(
+ (p: fs.PathLike) => p === MOCK_WORKSPACE_SETTINGS_PATH,
+ );
+ const workspaceSettingsContent = {
+ excludedProjectEnvVars: ['WORKSPACE_DEBUG', 'WORKSPACE_VAR'],
+ };
+ (fs.readFileSync as Mock).mockImplementation(
+ (p: fs.PathOrFileDescriptor) => {
+ if (p === MOCK_WORKSPACE_SETTINGS_PATH)
+ return JSON.stringify(workspaceSettingsContent);
+ return '';
+ },
+ );
+
+ const settings = loadSettings(MOCK_WORKSPACE_DIR);
+ expect(settings.merged.excludedProjectEnvVars).toEqual([
+ 'WORKSPACE_DEBUG',
+ 'WORKSPACE_VAR',
+ ]);
+ });
+
+ it('should merge excludedProjectEnvVars with workspace taking precedence over user', () => {
+ (mockFsExistsSync as Mock).mockReturnValue(true);
+ const userSettingsContent = {
+ excludedProjectEnvVars: ['DEBUG', 'NODE_ENV', 'USER_VAR'],
+ };
+ const workspaceSettingsContent = {
+ excludedProjectEnvVars: ['WORKSPACE_DEBUG', 'WORKSPACE_VAR'],
+ };
+
+ (fs.readFileSync as Mock).mockImplementation(
+ (p: fs.PathOrFileDescriptor) => {
+ if (p === USER_SETTINGS_PATH)
+ return JSON.stringify(userSettingsContent);
+ if (p === MOCK_WORKSPACE_SETTINGS_PATH)
+ return JSON.stringify(workspaceSettingsContent);
+ return '';
+ },
+ );
+
+ const settings = loadSettings(MOCK_WORKSPACE_DIR);
+ expect(settings.user.settings.excludedProjectEnvVars).toEqual([
+ 'DEBUG',
+ 'NODE_ENV',
+ 'USER_VAR',
+ ]);
+ expect(settings.workspace.settings.excludedProjectEnvVars).toEqual([
+ 'WORKSPACE_DEBUG',
+ 'WORKSPACE_VAR',
+ ]);
+ expect(settings.merged.excludedProjectEnvVars).toEqual([
+ 'WORKSPACE_DEBUG',
+ 'WORKSPACE_VAR',
+ ]);
+ });
+
it('should default contextFileName to undefined if not in any settings file', () => {
(mockFsExistsSync as Mock).mockReturnValue(true);
const userSettingsContent = { theme: 'dark' };
@@ -1055,4 +1135,140 @@ describe('Settings Loading and Merging', () => {
expect(loadedSettings.merged.theme).toBe('ocean');
});
});
+
+ describe('excludedProjectEnvVars integration', () => {
+ const originalEnv = { ...process.env };
+
+ beforeEach(() => {
+ process.env = { ...originalEnv };
+ });
+
+ afterEach(() => {
+ process.env = originalEnv;
+ });
+
+ it('should exclude DEBUG and DEBUG_MODE from project .env files by default', () => {
+ // Create a workspace settings file with excludedProjectEnvVars
+ const workspaceSettingsContent = {
+ excludedProjectEnvVars: ['DEBUG', 'DEBUG_MODE'],
+ };
+
+ (mockFsExistsSync as Mock).mockImplementation(
+ (p: fs.PathLike) => p === MOCK_WORKSPACE_SETTINGS_PATH,
+ );
+
+ (fs.readFileSync as Mock).mockImplementation(
+ (p: fs.PathOrFileDescriptor) => {
+ if (p === MOCK_WORKSPACE_SETTINGS_PATH)
+ return JSON.stringify(workspaceSettingsContent);
+ return '{}';
+ },
+ );
+
+ // Mock findEnvFile to return a project .env file
+ const originalFindEnvFile = (
+ loadSettings as unknown as { findEnvFile: () => string }
+ ).findEnvFile;
+ (loadSettings as unknown as { findEnvFile: () => string }).findEnvFile =
+ () => '/mock/project/.env';
+
+ // Mock fs.readFileSync for .env file content
+ const originalReadFileSync = fs.readFileSync;
+ (fs.readFileSync as Mock).mockImplementation(
+ (p: fs.PathOrFileDescriptor) => {
+ if (p === '/mock/project/.env') {
+ return 'DEBUG=true\nDEBUG_MODE=1\nGEMINI_API_KEY=test-key';
+ }
+ if (p === MOCK_WORKSPACE_SETTINGS_PATH) {
+ return JSON.stringify(workspaceSettingsContent);
+ }
+ return '{}';
+ },
+ );
+
+ try {
+ // This will call loadEnvironment internally with the merged settings
+ const settings = loadSettings(MOCK_WORKSPACE_DIR);
+
+ // Verify the settings were loaded correctly
+ expect(settings.merged.excludedProjectEnvVars).toEqual([
+ 'DEBUG',
+ 'DEBUG_MODE',
+ ]);
+
+ // Note: We can't directly test process.env changes here because the mocking
+ // prevents the actual file system operations, but we can verify the settings
+ // are correctly merged and passed to loadEnvironment
+ } finally {
+ (loadSettings as unknown as { findEnvFile: () => string }).findEnvFile =
+ originalFindEnvFile;
+ (fs.readFileSync as Mock).mockImplementation(originalReadFileSync);
+ }
+ });
+
+ it('should respect custom excludedProjectEnvVars from user settings', () => {
+ const userSettingsContent = {
+ excludedProjectEnvVars: ['NODE_ENV', 'DEBUG'],
+ };
+
+ (mockFsExistsSync as Mock).mockImplementation(
+ (p: fs.PathLike) => p === USER_SETTINGS_PATH,
+ );
+
+ (fs.readFileSync as Mock).mockImplementation(
+ (p: fs.PathOrFileDescriptor) => {
+ if (p === USER_SETTINGS_PATH)
+ return JSON.stringify(userSettingsContent);
+ return '{}';
+ },
+ );
+
+ const settings = loadSettings(MOCK_WORKSPACE_DIR);
+ expect(settings.user.settings.excludedProjectEnvVars).toEqual([
+ 'NODE_ENV',
+ 'DEBUG',
+ ]);
+ expect(settings.merged.excludedProjectEnvVars).toEqual([
+ 'NODE_ENV',
+ 'DEBUG',
+ ]);
+ });
+
+ it('should merge excludedProjectEnvVars with workspace taking precedence', () => {
+ const userSettingsContent = {
+ excludedProjectEnvVars: ['DEBUG', 'NODE_ENV', 'USER_VAR'],
+ };
+ const workspaceSettingsContent = {
+ excludedProjectEnvVars: ['WORKSPACE_DEBUG', 'WORKSPACE_VAR'],
+ };
+
+ (mockFsExistsSync as Mock).mockReturnValue(true);
+
+ (fs.readFileSync as Mock).mockImplementation(
+ (p: fs.PathOrFileDescriptor) => {
+ if (p === USER_SETTINGS_PATH)
+ return JSON.stringify(userSettingsContent);
+ if (p === MOCK_WORKSPACE_SETTINGS_PATH)
+ return JSON.stringify(workspaceSettingsContent);
+ return '{}';
+ },
+ );
+
+ const settings = loadSettings(MOCK_WORKSPACE_DIR);
+
+ expect(settings.user.settings.excludedProjectEnvVars).toEqual([
+ 'DEBUG',
+ 'NODE_ENV',
+ 'USER_VAR',
+ ]);
+ expect(settings.workspace.settings.excludedProjectEnvVars).toEqual([
+ 'WORKSPACE_DEBUG',
+ 'WORKSPACE_VAR',
+ ]);
+ expect(settings.merged.excludedProjectEnvVars).toEqual([
+ 'WORKSPACE_DEBUG',
+ 'WORKSPACE_VAR',
+ ]);
+ });
+ });
});