summaryrefslogtreecommitdiff
path: root/packages/cli/src
diff options
context:
space:
mode:
authorScott Densmore <[email protected]>2025-06-22 22:52:25 -0700
committerGitHub <[email protected]>2025-06-22 22:52:25 -0700
commit99d521569d392e660f8dbbb9a50cad9c9062b75b (patch)
tree302cfaa71b326ab4eb3ea345bcab7a7c2c731f60 /packages/cli/src
parent156feff5b19f98dc097603abc408a86f82f6d149 (diff)
Scotdensmore/first run auth fix (#1322)
Diffstat (limited to 'packages/cli/src')
-rw-r--r--packages/cli/src/ui/components/AuthDialog.test.tsx76
-rw-r--r--packages/cli/src/ui/components/AuthDialog.tsx7
2 files changed, 82 insertions, 1 deletions
diff --git a/packages/cli/src/ui/components/AuthDialog.test.tsx b/packages/cli/src/ui/components/AuthDialog.test.tsx
index a5f46d93..8d56e96a 100644
--- a/packages/cli/src/ui/components/AuthDialog.test.tsx
+++ b/packages/cli/src/ui/components/AuthDialog.test.tsx
@@ -5,11 +5,14 @@
*/
import { render } from 'ink-testing-library';
+import { describe, it, expect, vi } from 'vitest';
import { AuthDialog } from './AuthDialog.js';
-import { LoadedSettings } from '../../config/settings.js';
+import { LoadedSettings, SettingScope } from '../../config/settings.js';
import { AuthType } from '@gemini-cli/core';
describe('AuthDialog', () => {
+ const wait = (ms = 50) => new Promise((resolve) => setTimeout(resolve, ms));
+
it('should show an error if the initial auth type is invalid', () => {
const settings: LoadedSettings = new LoadedSettings(
{
@@ -38,4 +41,75 @@ describe('AuthDialog', () => {
'GEMINI_API_KEY environment variable not found',
);
});
+
+ it('should prevent exiting when no auth method is selected and show error message', async () => {
+ const onSelect = vi.fn();
+ const settings: LoadedSettings = new LoadedSettings(
+ {
+ settings: {
+ selectedAuthType: undefined,
+ },
+ path: '',
+ },
+ {
+ settings: {},
+ path: '',
+ },
+ [],
+ );
+
+ const { lastFrame, stdin, unmount } = render(
+ <AuthDialog
+ onSelect={onSelect}
+ onHighlight={() => {}}
+ settings={settings}
+ />,
+ );
+ await wait();
+
+ // Simulate pressing escape key
+ stdin.write('\u001b'); // ESC key
+ await wait();
+
+ // Should show error message instead of calling onSelect
+ expect(lastFrame()).toContain(
+ 'You must select an auth method to proceed. Press Ctrl+C twice to exit.',
+ );
+ expect(onSelect).not.toHaveBeenCalled();
+ unmount();
+ });
+
+ it('should allow exiting when auth method is already selected', async () => {
+ const onSelect = vi.fn();
+ const settings: LoadedSettings = new LoadedSettings(
+ {
+ settings: {
+ selectedAuthType: AuthType.USE_GEMINI,
+ },
+ path: '',
+ },
+ {
+ settings: {},
+ path: '',
+ },
+ [],
+ );
+
+ const { stdin, unmount } = render(
+ <AuthDialog
+ onSelect={onSelect}
+ onHighlight={() => {}}
+ settings={settings}
+ />,
+ );
+ await wait();
+
+ // Simulate pressing escape key
+ stdin.write('\u001b'); // ESC key
+ await wait();
+
+ // Should call onSelect with undefined to exit
+ expect(onSelect).toHaveBeenCalledWith(undefined, SettingScope.User);
+ unmount();
+ });
});
diff --git a/packages/cli/src/ui/components/AuthDialog.tsx b/packages/cli/src/ui/components/AuthDialog.tsx
index 7ae8b7ee..c0e5d4f8 100644
--- a/packages/cli/src/ui/components/AuthDialog.tsx
+++ b/packages/cli/src/ui/components/AuthDialog.tsx
@@ -78,6 +78,13 @@ export function AuthDialog({
useInput((_input, key) => {
if (key.escape) {
+ if (settings.merged.selectedAuthType === undefined) {
+ // Prevent exiting if no auth method is set
+ setErrorMessage(
+ 'You must select an auth method to proceed. Press Ctrl+C twice to exit.',
+ );
+ return;
+ }
onSelect(undefined, SettingScope.User);
}
});