import { describe, it, expect, vi, beforeEach } from 'vitest'; import { render } from '../../test/utils'; import MainContent from './MainContent'; import { ModalProvider } from '../../contexts/ModalContext'; import { ThemeProvider } from '../../contexts/ThemeContext'; import { WorkspaceDataProvider } from '../../contexts/WorkspaceDataContext'; // Mock child components vi.mock('../editor/ContentView', () => ({ default: ({ activeTab, selectedFile, }: { activeTab: string; selectedFile: string | null; }) => (
Content View - {activeTab} - {selectedFile || 'No file'}
), })); vi.mock('../modals/file/CreateFileModal', () => ({ default: () =>
Create File Modal
, })); vi.mock('../modals/file/DeleteFileModal', () => ({ default: () =>
Delete File Modal
, })); vi.mock('../modals/git/CommitMessageModal', () => ({ default: () => (
Commit Message Modal
), })); // Mock contexts vi.mock('../../contexts/ThemeContext', () => ({ useTheme: () => ({ colorScheme: 'light', updateColorScheme: vi.fn(), }), ThemeProvider: ({ children }: { children: React.ReactNode }) => (
{children}
), })); vi.mock('../../contexts/WorkspaceDataContext', () => ({ useWorkspaceData: () => ({ currentWorkspace: { name: 'test-workspace', path: '/test' }, workspaces: [], settings: {}, loading: false, loadWorkspaces: vi.fn(), loadWorkspaceData: vi.fn(), setCurrentWorkspace: vi.fn(), }), WorkspaceDataProvider: ({ children }: { children: React.ReactNode }) => (
{children}
), })); // Mock hooks vi.mock('../../hooks/useFileContent', () => ({ useFileContent: vi.fn(), })); vi.mock('../../hooks/useFileOperations', () => ({ useFileOperations: vi.fn(), })); vi.mock('../../hooks/useGitOperations', () => ({ useGitOperations: vi.fn(), })); const TestWrapper = ({ children }: { children: React.ReactNode }) => ( {children} ); describe('MainContent', () => { const mockHandleFileSelect = vi.fn(); const mockLoadFileList = vi.fn(); const mockHandleContentChange = vi.fn(); const mockSetHasUnsavedChanges = vi.fn(); const mockHandleSave = vi.fn(); const mockHandleCreate = vi.fn(); const mockHandleDelete = vi.fn(); const mockHandleUpload = vi.fn(); const mockHandleMove = vi.fn(); const mockHandleRename = vi.fn(); const mockHandleCommitAndPush = vi.fn(); beforeEach(async () => { vi.clearAllMocks(); const { useFileContent } = await import('../../hooks/useFileContent'); vi.mocked(useFileContent).mockReturnValue({ content: 'Test content', setContent: vi.fn(), hasUnsavedChanges: false, setHasUnsavedChanges: mockSetHasUnsavedChanges, loadFileContent: vi.fn(), handleContentChange: mockHandleContentChange, }); const { useFileOperations } = await import('../../hooks/useFileOperations'); vi.mocked(useFileOperations).mockReturnValue({ handleSave: mockHandleSave, handleCreate: mockHandleCreate, handleDelete: mockHandleDelete, handleUpload: mockHandleUpload, handleMove: mockHandleMove, handleRename: mockHandleRename, }); const { useGitOperations } = await import('../../hooks/useGitOperations'); vi.mocked(useGitOperations).mockReturnValue({ handlePull: vi.fn(), handleCommitAndPush: mockHandleCommitAndPush, }); }); it('shows breadcrumbs for selected file', () => { const { getByText } = render( ); expect(getByText('docs')).toBeInTheDocument(); expect(getByText('guide.md')).toBeInTheDocument(); }); it('shows unsaved changes indicator when file has changes', async () => { const { useFileContent } = await import('../../hooks/useFileContent'); vi.mocked(useFileContent).mockReturnValue({ content: 'Test content', setContent: vi.fn(), hasUnsavedChanges: true, setHasUnsavedChanges: mockSetHasUnsavedChanges, loadFileContent: vi.fn(), handleContentChange: mockHandleContentChange, }); const { container } = render( ); // Should show unsaved changes indicator (yellow dot) const indicator = container.querySelector('svg[style*="yellow"]'); expect(indicator).toBeInTheDocument(); }); it('renders all modal components', () => { const { getByTestId } = render( ); expect(getByTestId('create-file-modal')).toBeInTheDocument(); expect(getByTestId('delete-file-modal')).toBeInTheDocument(); expect(getByTestId('commit-message-modal')).toBeInTheDocument(); }); it('handles no selected file', () => { const { getByTestId } = render( ); const contentView = getByTestId('content-view'); expect(contentView).toHaveTextContent('Content View - source - No file'); }); });