2026-02-03 14:53:31 -08:00
|
|
|
/**
|
|
|
|
|
* @license
|
|
|
|
|
* Copyright 2025 Google LLC
|
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
import { vi } from 'vitest';
|
2026-03-13 14:11:51 -07:00
|
|
|
import { NoopSandboxManager } from '@google/gemini-cli-core';
|
2026-02-03 14:53:31 -08:00
|
|
|
import type { Config } from '@google/gemini-cli-core';
|
2026-03-11 23:20:42 +05:30
|
|
|
import {
|
|
|
|
|
createTestMergedSettings,
|
|
|
|
|
type LoadedSettings,
|
|
|
|
|
type Settings,
|
|
|
|
|
} from '../config/settings.js';
|
2026-02-03 14:53:31 -08:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Creates a mocked Config object with default values and allows overrides.
|
|
|
|
|
*/
|
|
|
|
|
export const createMockConfig = (overrides: Partial<Config> = {}): Config =>
|
|
|
|
|
({
|
|
|
|
|
getSandbox: vi.fn(() => undefined),
|
|
|
|
|
getQuestion: vi.fn(() => ''),
|
|
|
|
|
isInteractive: vi.fn(() => false),
|
2026-02-11 20:49:30 -05:00
|
|
|
isInitialized: vi.fn(() => true),
|
2026-02-03 14:53:31 -08:00
|
|
|
setTerminalBackground: vi.fn(),
|
|
|
|
|
storage: {
|
|
|
|
|
getProjectTempDir: vi.fn().mockReturnValue('/tmp/gemini-test'),
|
2026-02-06 13:33:13 -08:00
|
|
|
initialize: vi.fn().mockResolvedValue(undefined),
|
2026-02-03 14:53:31 -08:00
|
|
|
},
|
|
|
|
|
getDebugMode: vi.fn(() => false),
|
|
|
|
|
getProjectRoot: vi.fn(() => '/'),
|
|
|
|
|
refreshAuth: vi.fn().mockResolvedValue(undefined),
|
|
|
|
|
getRemoteAdminSettings: vi.fn(() => undefined),
|
|
|
|
|
initialize: vi.fn().mockResolvedValue(undefined),
|
|
|
|
|
getPolicyEngine: vi.fn(() => ({})),
|
|
|
|
|
getMessageBus: vi.fn(() => ({ subscribe: vi.fn() })),
|
|
|
|
|
getHookSystem: vi.fn(() => ({
|
|
|
|
|
fireSessionEndEvent: vi.fn().mockResolvedValue(undefined),
|
|
|
|
|
fireSessionStartEvent: vi.fn().mockResolvedValue(undefined),
|
|
|
|
|
})),
|
2026-04-01 22:05:31 -07:00
|
|
|
isMemoryManagerEnabled: vi.fn(() => false),
|
2026-02-03 14:53:31 -08:00
|
|
|
getListExtensions: vi.fn(() => false),
|
|
|
|
|
getExtensions: vi.fn(() => []),
|
|
|
|
|
getListSessions: vi.fn(() => false),
|
|
|
|
|
getDeleteSession: vi.fn(() => undefined),
|
|
|
|
|
setSessionId: vi.fn(),
|
|
|
|
|
getSessionId: vi.fn().mockReturnValue('mock-session-id'),
|
2026-03-20 15:01:12 -04:00
|
|
|
getWorktreeSettings: vi.fn(() => undefined),
|
2026-02-03 14:53:31 -08:00
|
|
|
getContentGeneratorConfig: vi.fn(() => ({ authType: 'google' })),
|
2026-03-05 14:57:28 -05:00
|
|
|
getAcpMode: vi.fn(() => false),
|
2026-02-03 14:53:31 -08:00
|
|
|
isBrowserLaunchSuppressed: vi.fn(() => false),
|
|
|
|
|
setRemoteAdminSettings: vi.fn(),
|
|
|
|
|
isYoloModeDisabled: vi.fn(() => false),
|
|
|
|
|
isPlanEnabled: vi.fn(() => false),
|
2026-02-24 19:15:14 -05:00
|
|
|
getPlanModeRoutingEnabled: vi.fn().mockResolvedValue(true),
|
|
|
|
|
getApprovedPlanPath: vi.fn(() => undefined),
|
2026-02-03 14:53:31 -08:00
|
|
|
getCoreTools: vi.fn(() => []),
|
|
|
|
|
getAllowedTools: vi.fn(() => []),
|
|
|
|
|
getApprovalMode: vi.fn(() => 'default'),
|
|
|
|
|
getFileFilteringRespectGitIgnore: vi.fn(() => true),
|
|
|
|
|
getOutputFormat: vi.fn(() => 'text'),
|
|
|
|
|
getUsageStatisticsEnabled: vi.fn(() => true),
|
|
|
|
|
getScreenReader: vi.fn(() => false),
|
|
|
|
|
getGeminiMdFileCount: vi.fn(() => 0),
|
|
|
|
|
getDeferredCommand: vi.fn(() => undefined),
|
|
|
|
|
getFileSystemService: vi.fn(() => ({})),
|
|
|
|
|
clientVersion: '1.0.0',
|
|
|
|
|
getModel: vi.fn().mockReturnValue('gemini-pro'),
|
|
|
|
|
getWorkingDir: vi.fn().mockReturnValue('/mock/cwd'),
|
|
|
|
|
getToolRegistry: vi.fn().mockReturnValue({
|
|
|
|
|
getTools: vi.fn().mockReturnValue([]),
|
|
|
|
|
getAllTools: vi.fn().mockReturnValue([]),
|
|
|
|
|
}),
|
|
|
|
|
getAgentRegistry: vi.fn().mockReturnValue({}),
|
|
|
|
|
getPromptRegistry: vi.fn().mockReturnValue({}),
|
|
|
|
|
getResourceRegistry: vi.fn().mockReturnValue({}),
|
|
|
|
|
getSkillManager: vi.fn().mockReturnValue({
|
|
|
|
|
isAdminEnabled: vi.fn().mockReturnValue(false),
|
|
|
|
|
}),
|
|
|
|
|
getFileService: vi.fn().mockReturnValue({}),
|
|
|
|
|
getGitService: vi.fn().mockResolvedValue({}),
|
|
|
|
|
getUserMemory: vi.fn().mockReturnValue(''),
|
2026-03-17 13:20:32 -07:00
|
|
|
getSystemInstructionMemory: vi.fn().mockReturnValue(''),
|
|
|
|
|
getSessionMemory: vi.fn().mockReturnValue(''),
|
2026-02-03 14:53:31 -08:00
|
|
|
getGeminiMdFilePaths: vi.fn().mockReturnValue([]),
|
|
|
|
|
getShowMemoryUsage: vi.fn().mockReturnValue(false),
|
|
|
|
|
getAccessibility: vi.fn().mockReturnValue({}),
|
|
|
|
|
getTelemetryEnabled: vi.fn().mockReturnValue(false),
|
|
|
|
|
getTelemetryLogPromptsEnabled: vi.fn().mockReturnValue(false),
|
|
|
|
|
getTelemetryOtlpEndpoint: vi.fn().mockReturnValue(''),
|
|
|
|
|
getTelemetryOtlpProtocol: vi.fn().mockReturnValue('grpc'),
|
|
|
|
|
getTelemetryTarget: vi.fn().mockReturnValue(''),
|
|
|
|
|
getTelemetryOutfile: vi.fn().mockReturnValue(undefined),
|
|
|
|
|
getTelemetryUseCollector: vi.fn().mockReturnValue(false),
|
|
|
|
|
getTelemetryUseCliAuth: vi.fn().mockReturnValue(false),
|
|
|
|
|
getGeminiClient: vi.fn().mockReturnValue({
|
|
|
|
|
isInitialized: vi.fn().mockReturnValue(true),
|
|
|
|
|
}),
|
|
|
|
|
updateSystemInstructionIfInitialized: vi.fn().mockResolvedValue(undefined),
|
|
|
|
|
getModelRouterService: vi.fn().mockReturnValue({}),
|
|
|
|
|
getModelAvailabilityService: vi.fn().mockReturnValue({}),
|
|
|
|
|
getEnableRecursiveFileSearch: vi.fn().mockReturnValue(true),
|
|
|
|
|
getFileFilteringEnableFuzzySearch: vi.fn().mockReturnValue(true),
|
|
|
|
|
getFileFilteringRespectGeminiIgnore: vi.fn().mockReturnValue(true),
|
|
|
|
|
getFileFilteringOptions: vi.fn().mockReturnValue({}),
|
|
|
|
|
getCustomExcludes: vi.fn().mockReturnValue([]),
|
|
|
|
|
getCheckpointingEnabled: vi.fn().mockReturnValue(false),
|
|
|
|
|
getProxy: vi.fn().mockReturnValue(undefined),
|
|
|
|
|
getBugCommand: vi.fn().mockReturnValue(undefined),
|
|
|
|
|
getExtensionManagement: vi.fn().mockReturnValue(true),
|
|
|
|
|
getExtensionLoader: vi.fn().mockReturnValue({}),
|
|
|
|
|
getEnabledExtensions: vi.fn().mockReturnValue([]),
|
|
|
|
|
getEnableExtensionReloading: vi.fn().mockReturnValue(false),
|
|
|
|
|
getDisableLLMCorrection: vi.fn().mockReturnValue(false),
|
|
|
|
|
getNoBrowser: vi.fn().mockReturnValue(false),
|
|
|
|
|
getAgentsSettings: vi.fn().mockReturnValue({}),
|
|
|
|
|
getSummarizeToolOutputConfig: vi.fn().mockReturnValue(undefined),
|
|
|
|
|
getIdeMode: vi.fn().mockReturnValue(false),
|
|
|
|
|
getFolderTrust: vi.fn().mockReturnValue(true),
|
|
|
|
|
isTrustedFolder: vi.fn().mockReturnValue(true),
|
|
|
|
|
getCompressionThreshold: vi.fn().mockResolvedValue(undefined),
|
|
|
|
|
getUserCaching: vi.fn().mockResolvedValue(false),
|
|
|
|
|
getNumericalRoutingEnabled: vi.fn().mockResolvedValue(false),
|
|
|
|
|
getClassifierThreshold: vi.fn().mockResolvedValue(undefined),
|
|
|
|
|
getBannerTextNoCapacityIssues: vi.fn().mockResolvedValue(''),
|
|
|
|
|
getBannerTextCapacityIssues: vi.fn().mockResolvedValue(''),
|
|
|
|
|
isInteractiveShellEnabled: vi.fn().mockReturnValue(false),
|
2026-03-13 16:02:09 -07:00
|
|
|
getDisableAlwaysAllow: vi.fn().mockReturnValue(false),
|
2026-02-03 14:53:31 -08:00
|
|
|
isSkillsSupportEnabled: vi.fn().mockReturnValue(false),
|
|
|
|
|
reloadSkills: vi.fn().mockResolvedValue(undefined),
|
|
|
|
|
reloadAgents: vi.fn().mockResolvedValue(undefined),
|
|
|
|
|
getUseRipgrep: vi.fn().mockReturnValue(false),
|
|
|
|
|
getEnableInteractiveShell: vi.fn().mockReturnValue(false),
|
|
|
|
|
getSkipNextSpeakerCheck: vi.fn().mockReturnValue(false),
|
|
|
|
|
getContinueOnFailedApiCall: vi.fn().mockReturnValue(false),
|
2026-03-10 23:33:50 -04:00
|
|
|
getRetryFetchErrors: vi.fn().mockReturnValue(true),
|
2026-02-03 14:53:31 -08:00
|
|
|
getEnableShellOutputEfficiency: vi.fn().mockReturnValue(true),
|
|
|
|
|
getShellToolInactivityTimeout: vi.fn().mockReturnValue(300000),
|
2026-04-07 18:35:04 -04:00
|
|
|
getRequestTimeoutMs: vi.fn().mockReturnValue(undefined),
|
2026-03-13 14:11:51 -07:00
|
|
|
getShellExecutionConfig: vi.fn().mockReturnValue({
|
|
|
|
|
sandboxManager: new NoopSandboxManager(),
|
|
|
|
|
sanitizationConfig: {
|
|
|
|
|
allowedEnvironmentVariables: [],
|
|
|
|
|
blockedEnvironmentVariables: [],
|
|
|
|
|
enableEnvironmentVariableRedaction: false,
|
|
|
|
|
},
|
|
|
|
|
}),
|
2026-02-03 14:53:31 -08:00
|
|
|
setShellExecutionConfig: vi.fn(),
|
|
|
|
|
getEnableToolOutputTruncation: vi.fn().mockReturnValue(true),
|
|
|
|
|
getTruncateToolOutputThreshold: vi.fn().mockReturnValue(1000),
|
|
|
|
|
getTruncateToolOutputLines: vi.fn().mockReturnValue(100),
|
|
|
|
|
getNextCompressionTruncationId: vi.fn().mockReturnValue(1),
|
|
|
|
|
getUseWriteTodos: vi.fn().mockReturnValue(false),
|
|
|
|
|
getFileExclusions: vi.fn().mockReturnValue({}),
|
|
|
|
|
getEnableHooks: vi.fn().mockReturnValue(true),
|
|
|
|
|
getEnableHooksUI: vi.fn().mockReturnValue(true),
|
|
|
|
|
getMcpClientManager: vi.fn().mockReturnValue({
|
|
|
|
|
getMcpInstructions: vi.fn().mockReturnValue(''),
|
|
|
|
|
getMcpServers: vi.fn().mockReturnValue({}),
|
2026-02-27 15:04:36 -05:00
|
|
|
getLastError: vi.fn().mockReturnValue(undefined),
|
2026-02-03 14:53:31 -08:00
|
|
|
}),
|
2026-02-27 15:04:36 -05:00
|
|
|
setUserInteractedWithMcp: vi.fn(),
|
|
|
|
|
emitMcpDiagnostic: vi.fn(),
|
2026-02-03 14:53:31 -08:00
|
|
|
getEnableEventDrivenScheduler: vi.fn().mockReturnValue(false),
|
|
|
|
|
getAdminSkillsEnabled: vi.fn().mockReturnValue(false),
|
|
|
|
|
getDisabledSkills: vi.fn().mockReturnValue([]),
|
|
|
|
|
getExperimentalJitContext: vi.fn().mockReturnValue(false),
|
2026-03-27 14:51:32 -07:00
|
|
|
getMemoryBoundaryMarkers: vi.fn().mockReturnValue(['.git']),
|
2026-02-03 14:53:31 -08:00
|
|
|
getTerminalBackground: vi.fn().mockReturnValue(undefined),
|
|
|
|
|
getEmbeddingModel: vi.fn().mockReturnValue('embedding-model'),
|
|
|
|
|
getQuotaErrorOccurred: vi.fn().mockReturnValue(false),
|
|
|
|
|
getMaxSessionTurns: vi.fn().mockReturnValue(100),
|
|
|
|
|
getExcludeTools: vi.fn().mockReturnValue(new Set()),
|
|
|
|
|
getAllowedMcpServers: vi.fn().mockReturnValue([]),
|
|
|
|
|
getBlockedMcpServers: vi.fn().mockReturnValue([]),
|
|
|
|
|
getExperiments: vi.fn().mockReturnValue(undefined),
|
|
|
|
|
getHasAccessToPreviewModel: vi.fn().mockReturnValue(false),
|
2026-02-09 12:24:28 -08:00
|
|
|
validatePathAccess: vi.fn().mockReturnValue(null),
|
2026-02-27 07:55:02 -08:00
|
|
|
getUseAlternateBuffer: vi.fn().mockReturnValue(false),
|
2026-04-02 17:39:49 -07:00
|
|
|
getUseTerminalBuffer: vi.fn().mockReturnValue(false),
|
|
|
|
|
getUseRenderProcess: vi.fn().mockReturnValue(false),
|
2026-02-03 14:53:31 -08:00
|
|
|
...overrides,
|
|
|
|
|
}) as unknown as Config;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Creates a mocked LoadedSettings object for tests.
|
|
|
|
|
*/
|
|
|
|
|
export function createMockSettings(
|
|
|
|
|
overrides: Record<string, unknown> = {},
|
|
|
|
|
): LoadedSettings {
|
|
|
|
|
const merged = createTestMergedSettings(
|
|
|
|
|
(overrides['merged'] as Partial<Settings>) || {},
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
system: { settings: {} },
|
|
|
|
|
systemDefaults: { settings: {} },
|
|
|
|
|
user: { settings: {} },
|
|
|
|
|
workspace: { settings: {} },
|
|
|
|
|
errors: [],
|
2026-03-30 16:43:29 -07:00
|
|
|
subscribe: vi.fn().mockReturnValue(() => {}),
|
|
|
|
|
getSnapshot: vi.fn().mockReturnValue({
|
|
|
|
|
system: { settings: {} },
|
|
|
|
|
systemDefaults: { settings: {} },
|
|
|
|
|
user: { settings: {} },
|
|
|
|
|
workspace: { settings: {} },
|
|
|
|
|
isTrusted: true,
|
|
|
|
|
errors: [],
|
|
|
|
|
merged,
|
|
|
|
|
}),
|
|
|
|
|
setValue: vi.fn(),
|
2026-02-03 14:53:31 -08:00
|
|
|
...overrides,
|
|
|
|
|
merged,
|
|
|
|
|
} as unknown as LoadedSettings;
|
|
|
|
|
}
|