/** * @license * Copyright 2026 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import { describe, it, expect, vi } from 'vitest'; import { render } from '../../../test-utils/render.js'; import { Text } from 'ink'; import { McpProgressIndicator, ToolInfo } from './ToolShared.js'; import { CoreToolCallStatus } from '@google/gemini-cli-core'; vi.mock('../GeminiRespondingSpinner.js', () => ({ GeminiRespondingSpinner: () => MockSpinner, })); describe('McpProgressIndicator', () => { it('renders determinate progress at 50%', async () => { const { lastFrame } = await render( , ); const output = lastFrame(); expect(output).toMatchSnapshot(); expect(output).toContain('50%'); }); it('renders complete progress at 100%', async () => { const { lastFrame } = await render( , ); const output = lastFrame(); expect(output).toMatchSnapshot(); expect(output).toContain('100%'); }); it('renders indeterminate progress with raw count', async () => { const { lastFrame } = await render( , ); const output = lastFrame(); expect(output).toMatchSnapshot(); expect(output).toContain('7'); expect(output).not.toContain('%'); }); it('renders progress with a message', async () => { const { lastFrame } = await render( , ); const output = lastFrame(); expect(output).toMatchSnapshot(); expect(output).toContain('Downloading...'); }); it('clamps progress exceeding total to 100%', async () => { const { lastFrame } = await render( , ); const output = lastFrame(); expect(output).toContain('100%'); expect(output).not.toContain('150%'); }); }); describe('ToolInfo', () => { const longDescription = 'long '.repeat(50); it('truncates description by default', async () => { const { lastFrame } = await render( , ); const output = lastFrame(); // In Ink, a single line Box with wrap="truncate" will be truncated. // Since we don't know the exact terminal width in this test, we check if it is short. expect(output.trim().split('\n').length).toBe(1); }); it('wraps description when isExpanded is true', async () => { const { lastFrame } = await render( , ); const output = lastFrame(); // When expanded, it should wrap into multiple lines. expect(output.trim().split('\n').length).toBeGreaterThan(1); }); });