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(); + }); }); });