224 lines
7.2 KiB
TypeScript
224 lines
7.2 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright 2025 Google LLC
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
|
|
import * as fs from 'fs';
|
|
import * as path from 'path';
|
|
import { tmpdir } from 'os';
|
|
import {
|
|
Config,
|
|
ConfigParameters,
|
|
ContentGeneratorConfig,
|
|
} from '@gemini-cli/core';
|
|
|
|
const TEST_CONTENT_GENERATOR_CONFIG: ContentGeneratorConfig = {
|
|
apiKey: 'test-key',
|
|
model: 'test-model',
|
|
userAgent: 'test-agent',
|
|
};
|
|
|
|
// Mock file discovery service and tool registry
|
|
vi.mock('@gemini-cli/core', async () => {
|
|
const actual = await vi.importActual('@gemini-cli/core');
|
|
return {
|
|
...actual,
|
|
FileDiscoveryService: vi.fn().mockImplementation(() => ({
|
|
initialize: vi.fn(),
|
|
})),
|
|
createToolRegistry: vi.fn().mockResolvedValue({}),
|
|
};
|
|
});
|
|
|
|
describe('Configuration Integration Tests', () => {
|
|
let tempDir: string;
|
|
let originalEnv: NodeJS.ProcessEnv;
|
|
|
|
beforeEach(() => {
|
|
tempDir = fs.mkdtempSync(path.join(tmpdir(), 'gemini-cli-test-'));
|
|
originalEnv = { ...process.env };
|
|
process.env.GEMINI_API_KEY = 'test-api-key';
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
afterEach(() => {
|
|
process.env = originalEnv;
|
|
if (fs.existsSync(tempDir)) {
|
|
fs.rmSync(tempDir, { recursive: true });
|
|
}
|
|
});
|
|
|
|
describe('File Filtering Configuration', () => {
|
|
it('should load default file filtering settings', async () => {
|
|
const configParams: ConfigParameters = {
|
|
cwd: '/tmp',
|
|
contentGeneratorConfig: TEST_CONTENT_GENERATOR_CONFIG,
|
|
embeddingModel: 'test-embedding-model',
|
|
sandbox: false,
|
|
targetDir: tempDir,
|
|
debugMode: false,
|
|
fileFilteringRespectGitIgnore: undefined, // Should default to true
|
|
fileFilteringAllowBuildArtifacts: undefined, // Should default to false
|
|
};
|
|
|
|
const config = new Config(configParams);
|
|
|
|
expect(config.getFileFilteringRespectGitIgnore()).toBe(true);
|
|
expect(config.getFileFilteringAllowBuildArtifacts()).toBe(false);
|
|
});
|
|
|
|
it('should load custom file filtering settings from configuration', async () => {
|
|
const configParams: ConfigParameters = {
|
|
cwd: '/tmp',
|
|
contentGeneratorConfig: TEST_CONTENT_GENERATOR_CONFIG,
|
|
embeddingModel: 'test-embedding-model',
|
|
sandbox: false,
|
|
targetDir: tempDir,
|
|
debugMode: false,
|
|
fileFilteringRespectGitIgnore: false,
|
|
fileFilteringAllowBuildArtifacts: true,
|
|
};
|
|
|
|
const config = new Config(configParams);
|
|
|
|
expect(config.getFileFilteringRespectGitIgnore()).toBe(false);
|
|
expect(config.getFileFilteringAllowBuildArtifacts()).toBe(true);
|
|
});
|
|
|
|
it('should merge user and workspace file filtering settings', async () => {
|
|
const configParams: ConfigParameters = {
|
|
cwd: '/tmp',
|
|
contentGeneratorConfig: TEST_CONTENT_GENERATOR_CONFIG,
|
|
embeddingModel: 'test-embedding-model',
|
|
sandbox: false,
|
|
targetDir: tempDir,
|
|
debugMode: false,
|
|
fileFilteringRespectGitIgnore: true,
|
|
fileFilteringAllowBuildArtifacts: true,
|
|
};
|
|
|
|
const config = new Config(configParams);
|
|
|
|
expect(config.getFileFilteringAllowBuildArtifacts()).toBe(true);
|
|
expect(config.getFileFilteringRespectGitIgnore()).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe('Configuration Integration', () => {
|
|
it('should handle partial configuration objects gracefully', async () => {
|
|
const configParams: ConfigParameters = {
|
|
cwd: '/tmp',
|
|
contentGeneratorConfig: TEST_CONTENT_GENERATOR_CONFIG,
|
|
embeddingModel: 'test-embedding-model',
|
|
sandbox: false,
|
|
targetDir: tempDir,
|
|
debugMode: false,
|
|
fileFilteringRespectGitIgnore: false,
|
|
fileFilteringAllowBuildArtifacts: undefined, // Should default to false
|
|
};
|
|
|
|
const config = new Config(configParams);
|
|
|
|
// Specified settings should be applied
|
|
expect(config.getFileFilteringRespectGitIgnore()).toBe(false);
|
|
|
|
// Missing settings should use defaults
|
|
expect(config.getFileFilteringAllowBuildArtifacts()).toBe(false);
|
|
});
|
|
|
|
it('should handle empty configuration objects gracefully', async () => {
|
|
const configParams: ConfigParameters = {
|
|
cwd: '/tmp',
|
|
contentGeneratorConfig: TEST_CONTENT_GENERATOR_CONFIG,
|
|
embeddingModel: 'test-embedding-model',
|
|
sandbox: false,
|
|
targetDir: tempDir,
|
|
debugMode: false,
|
|
fileFilteringRespectGitIgnore: undefined,
|
|
fileFilteringAllowBuildArtifacts: undefined,
|
|
};
|
|
|
|
const config = new Config(configParams);
|
|
|
|
// All settings should use defaults
|
|
expect(config.getFileFilteringRespectGitIgnore()).toBe(true);
|
|
expect(config.getFileFilteringAllowBuildArtifacts()).toBe(false);
|
|
});
|
|
|
|
it('should handle missing configuration sections gracefully', async () => {
|
|
const configParams: ConfigParameters = {
|
|
cwd: '/tmp',
|
|
contentGeneratorConfig: TEST_CONTENT_GENERATOR_CONFIG,
|
|
embeddingModel: 'test-embedding-model',
|
|
sandbox: false,
|
|
targetDir: tempDir,
|
|
debugMode: false,
|
|
// Missing fileFiltering configuration
|
|
};
|
|
|
|
const config = new Config(configParams);
|
|
|
|
// All git-aware settings should use defaults
|
|
expect(config.getFileFilteringRespectGitIgnore()).toBe(true);
|
|
expect(config.getFileFilteringAllowBuildArtifacts()).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('Real-world Configuration Scenarios', () => {
|
|
it('should handle a security-focused configuration', async () => {
|
|
const configParams: ConfigParameters = {
|
|
cwd: '/tmp',
|
|
contentGeneratorConfig: TEST_CONTENT_GENERATOR_CONFIG,
|
|
embeddingModel: 'test-embedding-model',
|
|
sandbox: false,
|
|
targetDir: tempDir,
|
|
debugMode: false,
|
|
fileFilteringRespectGitIgnore: true,
|
|
fileFilteringAllowBuildArtifacts: false,
|
|
};
|
|
|
|
const config = new Config(configParams);
|
|
|
|
expect(config.getFileFilteringRespectGitIgnore()).toBe(true);
|
|
expect(config.getFileFilteringAllowBuildArtifacts()).toBe(false);
|
|
});
|
|
|
|
it('should handle a development-focused configuration', async () => {
|
|
const configParams: ConfigParameters = {
|
|
cwd: '/tmp',
|
|
contentGeneratorConfig: TEST_CONTENT_GENERATOR_CONFIG,
|
|
embeddingModel: 'test-embedding-model',
|
|
sandbox: false,
|
|
targetDir: tempDir,
|
|
debugMode: false,
|
|
fileFilteringRespectGitIgnore: true,
|
|
fileFilteringAllowBuildArtifacts: true,
|
|
};
|
|
|
|
const config = new Config(configParams);
|
|
|
|
expect(config.getFileFilteringAllowBuildArtifacts()).toBe(true);
|
|
});
|
|
|
|
it('should handle a CI/CD environment configuration', async () => {
|
|
const configParams: ConfigParameters = {
|
|
cwd: '/tmp',
|
|
contentGeneratorConfig: TEST_CONTENT_GENERATOR_CONFIG,
|
|
embeddingModel: 'test-embedding-model',
|
|
sandbox: false,
|
|
targetDir: tempDir,
|
|
debugMode: false,
|
|
fileFilteringRespectGitIgnore: false, // CI might need to see all files
|
|
fileFilteringAllowBuildArtifacts: true,
|
|
};
|
|
|
|
const config = new Config(configParams);
|
|
|
|
expect(config.getFileFilteringRespectGitIgnore()).toBe(false);
|
|
expect(config.getFileFilteringAllowBuildArtifacts()).toBe(true);
|
|
});
|
|
});
|
|
});
|