/** * @license * Copyright 2026 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import { renderWithProviders } from '../../test-utils/render.js'; import { DialogManager } from './DialogManager.js'; import { describe, it, expect, vi } from 'vitest'; import { Text } from 'ink'; import { type UIState } from '../contexts/UIStateContext.js'; import { type RestartReason } from '../hooks/useIdeTrustListener.js'; import { type IdeInfo } from '@google/gemini-cli-core'; // Mock child components vi.mock('../IdeIntegrationNudge.js', () => ({ IdeIntegrationNudge: () => IdeIntegrationNudge, })); vi.mock('./LoopDetectionConfirmation.js', () => ({ LoopDetectionConfirmation: () => LoopDetectionConfirmation, })); vi.mock('./FolderTrustDialog.js', () => ({ FolderTrustDialog: () => FolderTrustDialog, })); vi.mock('./ConsentPrompt.js', () => ({ ConsentPrompt: () => ConsentPrompt, })); vi.mock('./ThemeDialog.js', () => ({ ThemeDialog: () => ThemeDialog, })); vi.mock('./SettingsDialog.js', () => ({ SettingsDialog: () => SettingsDialog, })); vi.mock('../auth/AuthInProgress.js', () => ({ AuthInProgress: () => AuthInProgress, })); vi.mock('../auth/AuthDialog.js', () => ({ AuthDialog: () => AuthDialog, })); vi.mock('../auth/ApiAuthDialog.js', () => ({ ApiAuthDialog: () => ApiAuthDialog, })); vi.mock('./EditorSettingsDialog.js', () => ({ EditorSettingsDialog: () => EditorSettingsDialog, })); vi.mock('../privacy/PrivacyNotice.js', () => ({ PrivacyNotice: () => PrivacyNotice, })); vi.mock('./ProQuotaDialog.js', () => ({ ProQuotaDialog: () => ProQuotaDialog, })); vi.mock('./PermissionsModifyTrustDialog.js', () => ({ PermissionsModifyTrustDialog: () => PermissionsModifyTrustDialog, })); vi.mock('./ModelDialog.js', () => ({ ModelDialog: () => ModelDialog, })); vi.mock('./IdeTrustChangeDialog.js', () => ({ IdeTrustChangeDialog: () => IdeTrustChangeDialog, })); vi.mock('./AgentConfigDialog.js', () => ({ AgentConfigDialog: () => AgentConfigDialog, })); describe('DialogManager', () => { const defaultProps = { addItem: vi.fn(), terminalWidth: 100, }; const baseUiState = { constrainHeight: false, terminalHeight: 24, staticExtraHeight: 0, terminalWidth: 80, confirmUpdateExtensionRequests: [], showIdeRestartPrompt: false, quota: { userTier: undefined, stats: undefined, proQuotaRequest: null, validationRequest: null, }, shouldShowIdePrompt: false, isFolderTrustDialogOpen: false, loopDetectionConfirmationRequest: null, confirmationRequest: null, consentRequest: null, isThemeDialogOpen: false, isSettingsDialogOpen: false, isModelDialogOpen: false, isAuthenticating: false, isAwaitingApiKeyInput: false, isAuthDialogOpen: false, isEditorDialogOpen: false, showPrivacyNotice: false, isPermissionsDialogOpen: false, isAgentConfigDialogOpen: false, selectedAgentName: undefined, selectedAgentDisplayName: undefined, selectedAgentDefinition: undefined, }; it('renders nothing by default', async () => { const { lastFrame, waitUntilReady, unmount } = renderWithProviders( , { uiState: baseUiState as Partial as UIState }, ); await waitUntilReady(); expect(lastFrame({ allowEmpty: true })).toBe(''); unmount(); }); const testCases: Array<[Partial, string]> = [ [ { showIdeRestartPrompt: true, ideTrustRestartReason: 'update' as RestartReason, }, 'IdeTrustChangeDialog', ], [ { quota: { userTier: undefined, stats: undefined, proQuotaRequest: { failedModel: 'a', fallbackModel: 'b', message: 'c', isTerminalQuotaError: false, resolve: vi.fn(), }, validationRequest: null, }, }, 'ProQuotaDialog', ], [ { shouldShowIdePrompt: true, currentIDE: { name: 'vscode', version: '1.0' } as unknown as IdeInfo, }, 'IdeIntegrationNudge', ], [{ isFolderTrustDialogOpen: true }, 'FolderTrustDialog'], [ { loopDetectionConfirmationRequest: { onComplete: vi.fn() } }, 'LoopDetectionConfirmation', ], [ { commandConfirmationRequest: { prompt: 'foo', onConfirm: vi.fn() } }, 'ConsentPrompt', ], [ { authConsentRequest: { prompt: 'bar', onConfirm: vi.fn() } }, 'ConsentPrompt', ], [ { confirmUpdateExtensionRequests: [{ prompt: 'foo', onConfirm: vi.fn() }], }, 'ConsentPrompt', ], [{ isThemeDialogOpen: true }, 'ThemeDialog'], [{ isSettingsDialogOpen: true }, 'SettingsDialog'], [{ isModelDialogOpen: true }, 'ModelDialog'], [{ isAuthenticating: true }, 'AuthInProgress'], [{ isAwaitingApiKeyInput: true }, 'ApiAuthDialog'], [{ isAuthDialogOpen: true }, 'AuthDialog'], [{ isEditorDialogOpen: true }, 'EditorSettingsDialog'], [{ showPrivacyNotice: true }, 'PrivacyNotice'], [{ isPermissionsDialogOpen: true }, 'PermissionsModifyTrustDialog'], [ { isAgentConfigDialogOpen: true, selectedAgentName: 'test-agent', selectedAgentDisplayName: 'Test Agent', selectedAgentDefinition: { name: 'test-agent', kind: 'local', description: 'Test agent', inputConfig: { inputSchema: {} }, promptConfig: { systemPrompt: 'test' }, modelConfig: { model: 'inherit' }, runConfig: { maxTimeMinutes: 5 }, }, }, 'AgentConfigDialog', ], ]; it.each(testCases)( 'renders %s when state is %o', async (uiStateOverride, expectedComponent) => { const { lastFrame, waitUntilReady, unmount } = renderWithProviders( , { uiState: { ...baseUiState, ...uiStateOverride, } as Partial as UIState, }, ); await waitUntilReady(); expect(lastFrame()).toContain(expectedComponent); unmount(); }, ); });