import { describe, it, expect, vi, beforeEach } from 'vitest'; import { render, screen, fireEvent } from '@testing-library/react'; import { MedDetailModal } from '../../components/MedDetailModal'; import type { Medication, Coverage, StockThresholds, RefillEntry } from '../../types'; const defaultSettings: StockThresholds = { lowStockDays: 7, normalStockDays: 30, highStockDays: 90 }; const mockMedication: Medication = { id: 1, name: 'Test Med', genericName: 'Generic Name', packCount: 1, blistersPerPack: 1, pillsPerBlister: 30, looseTablets: 0, takenBy: ['John'], blisters: [{ usage: 1, every: 1, start: '2024-01-01T09:00:00' }], updatedAt: null, expiryDate: '2025-12-31', notes: 'Test notes' }; const mockCoverage: Coverage = { name: 'Test Med', medsLeft: 25, daysLeft: 25, depletionDate: '2024-04-01', depletionTime: Date.now() + 25 * 86400000, nextDose: null }; const defaultProps = { selectedMed: mockMedication, coverage: { all: [mockCoverage] }, settings: defaultSettings, showImageLightbox: false, showRefillModal: false, showEditStockModal: false, onClose: vi.fn(), onOpenImageLightbox: vi.fn(), onCloseImageLightbox: vi.fn(), onOpenRefillModal: vi.fn(), onCloseRefillModal: vi.fn(), onOpenEditStockModal: vi.fn(), onCloseEditStockModal: vi.fn(), refillPacks: 0, onRefillPacksChange: vi.fn(), refillLoose: 0, onRefillLooseChange: vi.fn(), refillSaving: false, refillHistory: [] as RefillEntry[], refillHistoryExpanded: false, onRefillHistoryExpandedChange: vi.fn(), onSubmitRefill: vi.fn(), editStockFullBlisters: 0, onEditStockFullBlistersChange: vi.fn(), editStockPartialBlisterPills: 0, onEditStockPartialBlisterPillsChange: vi.fn(), editStockSaving: false, onSubmitStockCorrection: vi.fn() }; describe('MedDetailModal', () => { beforeEach(() => { vi.clearAllMocks(); }); it('renders nothing when selectedMed is null', () => { render(); expect(screen.queryByText('Test Med')).not.toBeInTheDocument(); }); it('renders modal when medication is selected', () => { render(); expect(screen.getByText('Test Med')).toBeInTheDocument(); }); it('displays medication name', () => { render(); expect(screen.getByText('Test Med')).toBeInTheDocument(); }); it('displays generic name', () => { render(); expect(screen.getByText('Generic Name')).toBeInTheDocument(); }); it('renders close button', () => { render(); const closeBtn = screen.getByText('×'); expect(closeBtn).toBeInTheDocument(); }); it('calls onClose when close button clicked', () => { const onClose = vi.fn(); render(); const closeBtn = screen.getByText('×'); fireEvent.click(closeBtn); expect(onClose).toHaveBeenCalledTimes(1); }); it('calls onClose when overlay clicked', () => { const onClose = vi.fn(); render(); const overlay = document.querySelector('.modal-overlay'); if (overlay) { fireEvent.click(overlay); } expect(onClose).toHaveBeenCalledTimes(1); }); it('does not call onClose when modal content clicked', () => { const onClose = vi.fn(); render(); const content = document.querySelector('.modal-content'); if (content) { fireEvent.click(content); } expect(onClose).not.toHaveBeenCalled(); }); it('displays notes when available', () => { render(); expect(screen.getByText('Test notes')).toBeInTheDocument(); }); it('displays schedule information', () => { render(); // Should have schedule section const scheduleSection = document.querySelector('.med-detail-schedules'); expect(scheduleSection).toBeInTheDocument(); }); it('renders med detail header', () => { render(); const header = document.querySelector('.med-detail-header'); expect(header).toBeInTheDocument(); }); it('renders med detail body', () => { render(); const body = document.querySelector('.med-detail-body'); expect(body).toBeInTheDocument(); }); }); describe('MedDetailModal without coverage', () => { beforeEach(() => { vi.clearAllMocks(); }); it('works without coverage data', () => { render(); // Should still render the medication name expect(screen.getByText('Test Med')).toBeInTheDocument(); }); }); describe('MedDetailModal without optional fields', () => { beforeEach(() => { vi.clearAllMocks(); }); it('works without generic name', () => { const med = { ...mockMedication, genericName: null }; render(); expect(screen.getByText('Test Med')).toBeInTheDocument(); }); it('works without notes', () => { const med = { ...mockMedication, notes: null }; render(); expect(screen.getByText('Test Med')).toBeInTheDocument(); }); it('works without takenBy', () => { const med = { ...mockMedication, takenBy: [] }; render(); expect(screen.getByText('Test Med')).toBeInTheDocument(); }); it('works without expiryDate', () => { const med = { ...mockMedication, expiryDate: null }; render(); expect(screen.getByText('Test Med')).toBeInTheDocument(); }); });