Spaces:
Running
Running
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(<ExportModal {...mockProps} />) | |
expect(screen.getByText('Export Dataset')).toBeInTheDocument() | |
}) | |
it('does not render when closed', () => { | |
render(<ExportModal {...mockProps} isOpen={false} />) | |
expect(screen.queryByText('Export Dataset')).not.toBeInTheDocument() | |
}) | |
it('displays export mode options', () => { | |
render(<ExportModal {...mockProps} />) | |
expect(screen.getByText('Standard')).toBeInTheDocument() | |
expect(screen.getByText('Fine-tuning')).toBeInTheDocument() | |
}) | |
it('shows dataset split configuration for fine-tuning mode', () => { | |
render(<ExportModal {...mockProps} />) | |
// 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(<ExportModal {...mockProps} />) | |
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(<ExportModal {...mockProps} />) | |
const cancelButton = screen.getByRole('button', { name: /cancel/i }) | |
fireEvent.click(cancelButton) | |
expect(mockProps.onClose).toHaveBeenCalled() | |
}) | |
it('calls onExport when export button is clicked', () => { | |
render(<ExportModal {...mockProps} />) | |
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(<ExportModal {...singleProps} />) | |
expect(screen.getByText('Export Single Item')).toBeInTheDocument() | |
}) | |
it('shows single export message', () => { | |
render(<ExportModal {...singleProps} />) | |
expect(screen.getByText('This only exports the 1 item currently on display.')).toBeInTheDocument() | |
}) | |
it('displays navigate to list button', () => { | |
render(<ExportModal {...singleProps} />) | |
expect(screen.getByRole('button', { name: /navigate to list view/i })).toBeInTheDocument() | |
}) | |
it('calls onNavigateAndExport when navigate button is clicked', () => { | |
render(<ExportModal {...singleProps} />) | |
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(<ExportModal {...singleProps} />) | |
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(<ExportModal {...mockProps} isLoading={true} />) | |
const crisisMapsCheckbox = screen.getByRole('checkbox', { name: /crisis maps/i }) | |
const droneImagesCheckbox = screen.getByRole('checkbox', { name: /drone images/i }) | |
expect(crisisMapsCheckbox).toBeDisabled() | |
expect(droneImagesCheckbox).toBeDisabled() | |
}) | |
}) | |
}) | |