/** * @license * Copyright 2025 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import { describe, it, expect, vi } from 'vitest'; import { render } from 'ink-testing-library'; import { Text } from 'ink'; import { App } from './App.js'; import { UIStateContext, type UIState } from './contexts/UIStateContext.js'; import { StreamingState } from './types.js'; // Mock components to isolate App component testing vi.mock('./components/MainContent.js', () => ({ MainContent: () => MainContent, })); vi.mock('./components/DialogManager.js', () => ({ DialogManager: () => DialogManager, })); vi.mock('./components/Composer.js', () => ({ Composer: () => Composer, })); vi.mock('./components/Notifications.js', () => ({ Notifications: () => Notifications, })); vi.mock('./components/QuittingDisplay.js', () => ({ QuittingDisplay: () => Quitting..., })); describe('App', () => { const mockUIState: Partial = { streamingState: StreamingState.Idle, quittingMessages: null, dialogsVisible: false, mainControlsRef: { current: null }, }; it('should render main content and composer when not quitting', () => { const { lastFrame } = render( , ); expect(lastFrame()).toContain('MainContent'); expect(lastFrame()).toContain('Notifications'); expect(lastFrame()).toContain('Composer'); }); it('should render quitting display when quittingMessages is set', () => { const quittingUIState = { ...mockUIState, quittingMessages: [{ id: 1, type: 'user', text: 'test' }], } as UIState; const { lastFrame } = render( , ); expect(lastFrame()).toContain('Quitting...'); }); it('should render dialog manager when dialogs are visible', () => { const dialogUIState = { ...mockUIState, dialogsVisible: true, } as UIState; const { lastFrame } = render( , ); expect(lastFrame()).toContain('MainContent'); expect(lastFrame()).toContain('Notifications'); expect(lastFrame()).toContain('DialogManager'); }); });