import { render, screen, fireEvent } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' import ExportModal from '../../components/ExportModal' describe('ExportModal', () => { const mockProps = { isOpen: true, onClose: vi.fn(), onExport: vi.fn(), filteredCount: 150, totalCount: 200, hasFilters: true, crisisMapsCount: 100, droneImagesCount: 50, isLoading: false, variant: 'bulk' as const, onNavigateToList: vi.fn(), onNavigateAndExport: vi.fn(), } beforeEach(() => { vi.clearAllMocks() }) describe('Bulk Export Mode', () => { it('renders when open', () => { render() expect(screen.getByText('Export Dataset')).toBeInTheDocument() }) it('does not render when closed', () => { render() expect(screen.queryByText('Export Dataset')).not.toBeInTheDocument() }) it('displays export mode options', () => { render() expect(screen.getByText('Standard')).toBeInTheDocument() expect(screen.getByText('Fine-tuning')).toBeInTheDocument() }) it('shows dataset split configuration for fine-tuning mode', () => { render() // Switch to fine-tuning mode const fineTuningOption = screen.getByText('Fine-tuning') fireEvent.click(fineTuningOption) expect(screen.getByText('Dataset Split Configuration')).toBeInTheDocument() expect(screen.getByLabelText('Train (%)')).toBeInTheDocument() expect(screen.getByLabelText('Test (%)')).toBeInTheDocument() expect(screen.getByLabelText('Val (%)')).toBeInTheDocument() }) it('displays image type checkboxes with counts', () => { render() expect(screen.getByText('Crisis Maps (100 images)')).toBeInTheDocument() expect(screen.getByText('Drone Images (50 images)')).toBeInTheDocument() }) it('calls onClose when cancel button is clicked', () => { render() const cancelButton = screen.getByRole('button', { name: /cancel/i }) fireEvent.click(cancelButton) expect(mockProps.onClose).toHaveBeenCalled() }) it('calls onExport when export button is clicked', () => { render() const exportButton = screen.getByRole('button', { name: /export selected/i }) fireEvent.click(exportButton) expect(mockProps.onExport).toHaveBeenCalledWith('standard', ['crisis_map', 'drone_image']) }) }) describe('Single Export Mode', () => { const singleProps = { ...mockProps, variant: 'single' as const } it('renders single export UI when variant is single', () => { render() expect(screen.getByText('Export Single Item')).toBeInTheDocument() }) it('shows single export message', () => { render() expect(screen.getByText('This only exports the 1 item currently on display.')).toBeInTheDocument() }) it('displays navigate to list button', () => { render() expect(screen.getByRole('button', { name: /navigate to list view/i })).toBeInTheDocument() }) it('calls onNavigateAndExport when navigate button is clicked', () => { render() const navigateButton = screen.getByRole('button', { name: /navigate to list view/i }) fireEvent.click(navigateButton) expect(mockProps.onNavigateAndExport).toHaveBeenCalled() }) it('calls onExport when continue button is clicked', () => { render() const continueButton = screen.getByRole('button', { name: /continue/i }) fireEvent.click(continueButton) expect(mockProps.onExport).toHaveBeenCalledWith('standard', ['crisis_map', 'drone_image']) }) }) describe('Loading State', () => { it('disables checkboxes when loading', () => { render() const crisisMapsCheckbox = screen.getByRole('checkbox', { name: /crisis maps/i }) const droneImagesCheckbox = screen.getByRole('checkbox', { name: /drone images/i }) expect(crisisMapsCheckbox).toBeDisabled() expect(droneImagesCheckbox).toBeDisabled() }) }) })