diff --git a/packages/cli/src/test-utils/mockSpinner.tsx b/packages/cli/src/test-utils/mockSpinner.tsx new file mode 100644 index 0000000000..c27c7a8707 --- /dev/null +++ b/packages/cli/src/test-utils/mockSpinner.tsx @@ -0,0 +1,23 @@ +/** + * @license + * Copyright 2026 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import { vi } from 'vitest'; +import type { SpinnerName } from 'cli-spinners'; + +export function mockInkSpinner() { + vi.mock('ink-spinner', async () => { + const { Text } = await import('ink'); + const cliSpinners = (await import('cli-spinners')).default; + + return { + default: function MockSpinner({ type = 'dots' }: { type?: SpinnerName }) { + const spinner = cliSpinners[type]; + const frame = spinner ? spinner.frames[0] : '⠋'; + return {frame}; + }, + }; + }); +} diff --git a/packages/cli/src/ui/components/messages/SubagentProgressDisplay.test.tsx b/packages/cli/src/ui/components/messages/SubagentProgressDisplay.test.tsx index caed091b2b..fcafa4ed28 100644 --- a/packages/cli/src/ui/components/messages/SubagentProgressDisplay.test.tsx +++ b/packages/cli/src/ui/components/messages/SubagentProgressDisplay.test.tsx @@ -8,11 +8,6 @@ import { render, cleanup } from '../../../test-utils/render.js'; import { SubagentProgressDisplay } from './SubagentProgressDisplay.js'; import type { SubagentProgress } from '@google/gemini-cli-core'; import { describe, it, expect, vi, afterEach } from 'vitest'; -import { Text } from 'ink'; - -vi.mock('ink-spinner', () => ({ - default: () => , -})); describe('', () => { afterEach(() => { diff --git a/packages/cli/test-setup.ts b/packages/cli/test-setup.ts index f2e1bd4586..1f95bfbfeb 100644 --- a/packages/cli/test-setup.ts +++ b/packages/cli/test-setup.ts @@ -8,6 +8,10 @@ import { vi, beforeEach, afterEach } from 'vitest'; import { format } from 'node:util'; import { coreEvents } from '@google/gemini-cli-core'; import { themeManager } from './src/ui/themes/theme-manager.js'; +import { mockInkSpinner } from './src/test-utils/mockSpinner.js'; + +// Globally mock ink-spinner to prevent non-deterministic snapshot/act flakes. +mockInkSpinner(); // Unset CI environment variable so that ink renders dynamically as it does in a real terminal if (process.env.CI !== undefined) {