import React from 'react'; import { vi, describe, it, expect, beforeEach } from 'vitest'; import { render, screen } from '@testing-library/react'; import { usePagination } from '@openmrs/esm-framework'; import { usePatientConditions } from './conditions.resource'; import PatientConditions from './conditions.component'; vi.mock('./conditions.resource', () => ({ usePatientConditions: vi.fn(), pageSizesOptions: [3, 5, 10], })); const mockUsePatientConditions = vi.mocked(usePatientConditions); const mockUsePagination = vi.mocked(usePagination); const mockPatientUuid = 'test-patient-uuid'; describe('PatientConditions', () => { beforeEach(() => { mockUsePagination.mockReturnValue({ results: [], currentPage: 1, goTo: vi.fn(), goToNext: vi.fn(), goToPrevious: vi.fn(), paginated: false, showNextButton: false, showPreviousButton: false, totalPages: 1, }); }); it('renders loading skeleton while fetching conditions', () => { mockUsePatientConditions.mockReturnValue({ conditions: [], error: undefined, isLoading: true, mutate: vi.fn(), }); render(); // DataTableSkeleton renders a table with skeleton rows expect(screen.getByRole('table')).toBeInTheDocument(); }); it('renders error state when fetching fails', () => { const errorMessage = 'Failed to fetch conditions'; mockUsePatientConditions.mockReturnValue({ conditions: [], error: new Error(errorMessage), isLoading: false, mutate: vi.fn(), }); render(); expect(screen.getByText(/error/i)).toBeInTheDocument(); }); it('renders empty state when no conditions exist', () => { mockUsePatientConditions.mockReturnValue({ conditions: [], error: undefined, isLoading: false, mutate: vi.fn(), }); render(); // Verify EmptyCard is rendered with correct header title expect(screen.getByTestId('empty-card')).toBeInTheDocument(); expect(screen.getByRole('heading', { level: 4, name: 'Active conditions' })).toBeInTheDocument(); }); it('renders conditions table with data', () => { const conditions = [ { id: 'condition-1', display: 'Hypertension', onsetDateTime: '15-Jan-2024', patient: 'Test Patient', recordedDate: '2024-01-15', recorder: 'Dr. Smith', status: 'active' as const, }, { id: 'condition-2', display: 'Diabetes', onsetDateTime: '10-Dec-2023', patient: 'Test Patient', recordedDate: '2023-12-10', recorder: 'Dr. Jones', status: 'active' as const, }, ]; mockUsePatientConditions.mockReturnValue({ conditions, error: undefined, isLoading: false, mutate: vi.fn(), }); mockUsePagination.mockReturnValue({ results: conditions, currentPage: 1, goTo: vi.fn(), goToNext: vi.fn(), goToPrevious: vi.fn(), paginated: false, showNextButton: false, showPreviousButton: false, totalPages: 1, }); render(); expect(screen.getByText('Active conditions')).toBeInTheDocument(); expect(screen.getByText('Hypertension')).toBeInTheDocument(); expect(screen.getByText('Diabetes')).toBeInTheDocument(); expect(screen.getByText('15-Jan-2024')).toBeInTheDocument(); expect(screen.getByText('10-Dec-2023')).toBeInTheDocument(); }); it('displays double dash for missing onset date', () => { const conditions = [ { id: 'condition-1', display: 'Headache', onsetDateTime: null, patient: 'Test Patient', recordedDate: '2024-01-15', recorder: 'Dr. Smith', status: 'active' as const, }, ]; mockUsePatientConditions.mockReturnValue({ conditions, error: undefined, isLoading: false, mutate: vi.fn(), }); mockUsePagination.mockReturnValue({ results: conditions, currentPage: 1, goTo: vi.fn(), goToNext: vi.fn(), goToPrevious: vi.fn(), paginated: false, showNextButton: false, showPreviousButton: false, totalPages: 1, }); render(); expect(screen.getByText('Headache')).toBeInTheDocument(); expect(screen.getByText('--')).toBeInTheDocument(); }); it('renders table headers correctly', () => { const conditions = [ { id: 'condition-1', display: 'Test Condition', onsetDateTime: '01-Jan-2024', patient: 'Test Patient', recordedDate: '2024-01-01', recorder: 'Dr. Test', status: 'active' as const, }, ]; mockUsePatientConditions.mockReturnValue({ conditions, error: undefined, isLoading: false, mutate: vi.fn(), }); mockUsePagination.mockReturnValue({ results: conditions, currentPage: 1, goTo: vi.fn(), goToNext: vi.fn(), goToPrevious: vi.fn(), paginated: false, showNextButton: false, showPreviousButton: false, totalPages: 1, }); render(); expect(screen.getByText('Condition')).toBeInTheDocument(); expect(screen.getByText('Onset date')).toBeInTheDocument(); }); });