diff --git a/packages/cli/src/ui/components/GeminiSpinner.test.tsx b/packages/cli/src/ui/components/GeminiSpinner.test.tsx
index db715a99b1..5f0e98d5fd 100644
--- a/packages/cli/src/ui/components/GeminiSpinner.test.tsx
+++ b/packages/cli/src/ui/components/GeminiSpinner.test.tsx
@@ -4,9 +4,10 @@
* SPDX-License-Identifier: Apache-2.0
*/
+import { act } from 'react';
import { renderWithProviders } from '../../test-utils/render.js';
import { GeminiSpinner } from './GeminiSpinner.js';
-import { describe, it, expect, vi, afterEach } from 'vitest';
+import { describe, it, expect, vi, afterEach, beforeEach } from 'vitest';
import { useIsScreenReaderEnabled } from 'ink';
vi.mock('ink', async () => {
@@ -18,24 +19,55 @@ vi.mock('ink', async () => {
});
describe('', () => {
+ beforeEach(() => {
+ vi.useFakeTimers();
+ });
+
afterEach(() => {
vi.restoreAllMocks();
+ vi.useRealTimers();
});
it('should render CircularSpinner when screen reader is disabled', async () => {
vi.mocked(useIsScreenReaderEnabled).mockReturnValue(false);
- const { lastFrame, unmount } = await renderWithProviders();
- // Component renders immediately. The interval updates state, but we don't need to wait for it.
+
+ // We wrap render in act to handle the initial effect
+ let renderResult;
+ await act(async () => {
+ renderResult = await renderWithProviders();
+ });
+
+ const { lastFrame, unmount } = renderResult!;
+
+ // Advance timers to trigger at least one state update
+ await act(async () => {
+ vi.advanceTimersByTime(30);
+ });
+
+ // Component renders immediately.
expect(lastFrame()).toBeTruthy();
- unmount();
+
+ await act(async () => {
+ unmount();
+ });
});
it('should render altText when screen reader is enabled', async () => {
vi.mocked(useIsScreenReaderEnabled).mockReturnValue(true);
- const { lastFrame, unmount } = await renderWithProviders(
- ,
- );
+
+ let renderResult;
+ await act(async () => {
+ renderResult = await renderWithProviders(
+ ,
+ );
+ });
+
+ const { lastFrame, unmount } = renderResult!;
+
expect(lastFrame()?.trim()).toBe('Custom Loading');
- unmount();
+
+ await act(async () => {
+ unmount();
+ });
});
});