import React from 'react';
import dayjs from 'dayjs';
import userEvent from '@testing-library/user-event';
import { render, screen, act } from '@testing-library/react';
import { useConfig } from '@openmrs/esm-framework';
import { usePatientSummary } from '../hooks/usePatientSummary';
import { mockPatient } from '../../../../__mocks__/patient-summary.mock';
import PatientSummary from './patient-summary.component';
jest.mock('../hooks/usePatientSummary');
const mockedUseConfig = useConfig as jest.Mock;
const mockedUsePatientSummary = usePatientSummary as jest.Mock;
// Mock window.open and window.print
const mockOpen = jest.fn();
const mockPrint = jest.fn();
const mockClose = jest.fn();
Object.defineProperty(window, 'open', {
writable: true,
value: mockOpen,
});
Object.defineProperty(window, 'print', {
writable: true,
value: mockPrint,
});
describe('PatientSummary', () => {
beforeEach(() => {
mockedUsePatientSummary.mockReturnValue({
data: null,
error: false,
isLoading: true,
});
// Reset mocks
mockOpen.mockClear();
mockPrint.mockClear();
mockClose.mockClear();
});
afterEach(() => jest.clearAllMocks());
it('renders a skeleton loader when loading', () => {
render();
const skeletonLoader = document.querySelector('.cds--skeleton');
expect(skeletonLoader).toBeInTheDocument();
});
it('renders an error message when data retrieval fails', () => {
const mockError = {
message: 'You are not logged in',
response: {
status: 401,
statusText: 'Unauthorized',
},
};
mockedUsePatientSummary.mockReturnValue({
data: null,
error: mockError,
isLoading: false,
});
render();
const errorMessage = screen.getByText('Error loading patient summary');
expect(errorMessage).toBeInTheDocument();
});
it('renders patient summary data when loaded', () => {
mockedUsePatientSummary.mockReturnValue({
data: mockPatient,
error: null,
isLoading: false,
});
render();
expect(screen.getByText(mockPatient.patientName)).toBeInTheDocument();
expect(screen.getByText(mockPatient.birthDate)).toBeInTheDocument();
expect(screen.getByText(mockPatient.reportDate)).toBeInTheDocument();
expect(screen.getByText(mockPatient.age)).toBeInTheDocument();
expect(screen.getByText(mockPatient.maritalStatus)).toBeInTheDocument();
expect(screen.getByText(mockPatient.mflCode)).toBeInTheDocument();
expect(screen.getByText(mockPatient.clinicName)).toBeInTheDocument();
expect(screen.getByText(mockPatient.nationalUniquePatientIdentifier)).toBeInTheDocument();
expect(screen.getByText(mockPatient.weight)).toBeInTheDocument();
expect(screen.getByText(mockPatient.height)).toBeInTheDocument();
expect(screen.getByText(mockPatient.bmi)).toBeInTheDocument();
expect(screen.getByText(`${mockPatient.bloodPressure}/${mockPatient.bpDiastolic}`)).toBeInTheDocument();
expect(screen.getByText(mockPatient.oxygenSaturation)).toBeInTheDocument();
expect(screen.getByText(mockPatient.pulseRate)).toBeInTheDocument();
expect(screen.getByText(mockPatient.familyProtection)).toBeInTheDocument();
expect(screen.getByText(mockPatient.respiratoryRate)).toBeInTheDocument();
expect(screen.getByText(mockPatient.tbScreeningOutcome)).toBeInTheDocument();
// TODO: Extend the test to check all the values
});
it('triggers print when print button is clicked', async () => {
const user = userEvent.setup();
mockedUsePatientSummary.mockReturnValue({
data: mockPatient,
error: null,
isLoading: false,
});
mockedUseConfig.mockReturnValue({ logo: {} });
// Mock the print window
const mockPrintWindow = {
document: {
write: jest.fn(),
close: jest.fn(),
},
focus: jest.fn(),
print: jest.fn(),
close: jest.fn(),
};
mockOpen.mockReturnValue(mockPrintWindow);
render();
const printButton = screen.getByRole('button', { name: /print/i });
expect(printButton).toBeInTheDocument();
await screen.findByText(/patient summary/i);
await user.click(printButton);
// Wait for the print functionality to be triggered
await act(async () => {
await new Promise((resolve) => setTimeout(resolve, 150));
});
// Verify that window.open was called
expect(mockOpen).toHaveBeenCalledWith('', '_blank');
});
});