import React from 'react';
import { render, screen, fireEvent } from '@testing-library/react';
import ProgramEnrollment from './program-enrollment.component';
import { useHeiOutcome } from '../hooks/useHeiOutcome';
jest.mock('react-i18next', () => ({
useTranslation: jest.fn(() => ({ t: (key: string) => key })),
}));
jest.mock('../hooks/useHeiOutcome', () => ({
useHeiOutcome: jest.fn(),
}));
const mockFormEntrySub = jest.fn();
describe('ProgramEnrollment Component', () => {
beforeEach(() => {
(useHeiOutcome as jest.Mock).mockReturnValue({ heiOutcome: { heiNumber: null } });
});
it('renders without crashing', () => {
render(
,
);
expect(screen.queryByText('EnrollmentDetails')).not.toBeInTheDocument();
});
it('renders enrollment history when data is present', () => {
const enrollments = [
{
enrollmentUuid: '1',
dateEnrolled: '01-Jan-2024',
programName: 'HIV',
firstEncounter: { changeReasons: ['Reason1', 'Reason2'] },
},
];
render(
,
);
expect(screen.getByText('Enrolled on')).toBeInTheDocument();
expect(screen.getByText('01-Jan-2024')).toBeInTheDocument();
});
it('shows "Edit" and "Discontinue" menu options when an enrollment is active', async () => {
const enrollments = [{ enrollmentUuid: '1', dateEnrolled: '2024-01-01', dateCompleted: null, programName: 'HIV' }];
render(
,
);
const overflowMenuTrigger = screen.getByRole('button', { hidden: true });
fireEvent.click(overflowMenuTrigger);
const editOption = await screen.findByText(/edit/i);
expect(editOption).toBeInTheDocument();
const discontinueOption = await screen.findByText(/Discontinue/i);
expect(discontinueOption).toBeInTheDocument();
});
it('hides menu options if enrollment is completed', () => {
const enrollments = [{ enrollmentUuid: '1', dateEnrolled: '2024-01-01', dateCompleted: '2024-02-01' }];
render(
,
);
expect(screen.queryByRole('button', { name: /edit/i })).not.toBeInTheDocument();
});
it('calls the handleEditEnrollment when "Edit" is clicked', async () => {
const enrollments = [{ enrollmentUuid: '1', dateEnrolled: '2024-01-01', programName: 'HIV' }];
render(
,
);
const overflowMenuTrigger = screen.getByRole('button', { hidden: true });
fireEvent.click(overflowMenuTrigger);
const editOption = await screen.findByText(/edit/i);
expect(editOption).toBeInTheDocument();
fireEvent.click(editOption);
});
it('displays fallback if no enrollments', () => {
render(
,
);
expect(screen.queryByText('EnrollmentDetails')).not.toBeInTheDocument();
});
});