File size: 4,483 Bytes
60b6623
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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()
    })
  })
})