From 99d521569d392e660f8dbbb9a50cad9c9062b75b Mon Sep 17 00:00:00 2001
From: Scott Densmore <scottdensmore@mac.com>
Date: Sun, 22 Jun 2025 22:52:25 -0700
Subject: Scotdensmore/first run auth fix (#1322)

---
 packages/cli/src/ui/components/AuthDialog.test.tsx | 76 +++++++++++++++++++++-
 1 file changed, 75 insertions(+), 1 deletion(-)

(limited to 'packages/cli/src/ui/components/AuthDialog.test.tsx')

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();
+  });
 });
-- 
cgit v1.2.3

