import React from 'react';
import { vi, describe, expect, test, beforeEach } from 'vitest';
import { screen, within } from '@testing-library/react';
import { useConfig } from '@openmrs/esm-framework';
import { ErrorState } from '@openmrs/esm-patient-common-lib';
import { mockVisitNotes, ConfigMock } from '__mocks__';
import { mockPatient, patientChartBasePath, renderWithSwr } from 'tools';
import { useVisitNotes } from './visit-notes.resource';
import NotesOverview from './notes-overview.extension';
const testProps = {
basePath: patientChartBasePath,
patient: mockPatient,
patientUuid: mockPatient.id,
};
const mockUseVisitNotes = vi.mocked(useVisitNotes);
const mockUseConfig = vi.mocked(useConfig);
vi.mock('./visit-notes.resource', () => {
return { useVisitNotes: vi.fn().mockReturnValue([{}]) };
});
describe('NotesOverview', () => {
beforeEach(() => {
mockUseConfig.mockReturnValue(ConfigMock);
});
test('renders an empty state view if visit note data is unavailable', async () => {
mockUseVisitNotes.mockReturnValueOnce({
visitNotes: [],
error: null,
isLoading: false,
isValidating: false,
mutateVisitNotes: vi.fn(),
});
renderWithSwr();
expect(screen.queryByRole('table')).not.toBeInTheDocument();
expect(screen.getByRole('heading', { name: /notes/i })).toBeInTheDocument();
expect(screen.getByText(/There are no visit notes to display for this patient/i)).toBeInTheDocument();
expect(screen.getByText(/Record visit notes/i)).toBeInTheDocument();
});
test('renders an error state view if there is a problem fetching visit note data', async () => {
const error = {
name: 'Error',
message: 'You are not logged in',
response: {
status: 401,
statusText: 'Unauthorized',
},
};
mockUseVisitNotes.mockReturnValueOnce({
visitNotes: [],
error: error,
isLoading: false,
isValidating: false,
mutateVisitNotes: vi.fn(),
});
renderWithSwr();
expect(screen.queryByRole('table')).not.toBeInTheDocument();
expect(ErrorState).toHaveBeenCalledWith(expect.objectContaining({ error, headerTitle: 'Visit notes' }), {});
});
test("renders a tabular overview of the patient's visit notes when present", async () => {
mockUseVisitNotes.mockReturnValueOnce({
visitNotes: mockVisitNotes,
error: null,
isLoading: false,
isValidating: false,
mutateVisitNotes: vi.fn(),
});
renderWithSwr();
expect(screen.queryByRole('progressbar')).not.toBeInTheDocument();
expect(screen.getByRole('heading', { name: /notes/i })).toBeInTheDocument();
const table = screen.getByRole('table');
const expectedColumnHeaders = [/Date/, /Diagnoses/];
expectedColumnHeaders.forEach((header) => {
expect(screen.getByRole('columnheader', { name: new RegExp(header, 'i') })).toBeInTheDocument();
});
const expectedTableRows = [
/27 — Jan — 2022 Malaria, Primary respiratory tuberculosis, confirmed/,
/14 — Jan — 2022 Visit Diagnoses: Presumed diagnosis, Malaria, Primary/,
/14 — Jan — 2022 Visit Diagnoses: Presumed diagnosis, Hemorrhage in early pregnancy, Primary/,
];
expectedTableRows.map((row) =>
expect(within(table).getByRole('row', { name: new RegExp(row, 'i') })).toBeInTheDocument(),
);
});
});