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()
})
})
})