/** @module @category UI */ import React from 'react'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import '@testing-library/jest-dom/vitest'; import { screen } from '@testing-library/react'; import { usePatient } from '@openmrs/esm-react-utils'; import { usePatientAttributes, usePatientContactAttributes } from './usePatientAttributes'; import { usePatientListsForPatient } from './usePatientListsForPatient'; import { useRelationships } from './useRelationships'; import { PatientBannerContactDetails } from './patient-banner-contact-details.component'; import { renderWithSwr } from '../../test-utils'; const mockUsePatient = vi.mocked(usePatient); const mockUsePatientAttributes = vi.mocked(usePatientAttributes); const mockUsePatientContactAttributes = vi.mocked(usePatientContactAttributes); const mockUsePatientListsForPatient = vi.mocked(usePatientListsForPatient); const mockUseRelationships = vi.mocked(useRelationships); const mockRelationships = [ { display: '100ADT - Amanda Robinson', name: 'Amanda Robinson', relationshipType: 'Sibling', relativeAge: 24, relativeUuid: '07006bcb-91d4-4c57-a5f7-49751899d9b5', uuid: '993bc79d-5ca5-4c76-b4b3-adf49e25bd0b', }, ]; const mockPersonAttributes = [ { display: 'Next of Kin Contact Phone Number = 0000000000', uuid: '1de1ac71-68e8-4a08-a7e2-5042093d4e46', value: '0700-000-000', attributeType: { uuid: 'a657a4f1-9c0f-444b-a1fd-445bb91dd12d', display: 'Next of Kin Contact Phone Number', }, }, { display: 'Phone number', uuid: 'asdflkjhasdf', value: '+0123456789', attributeType: { uuid: 'qweproiuqweproiu', display: 'Phone number', }, }, ]; const mockCohorts = [ { uuid: 'fdc95682-e206-421b-9534-e2a4010cc05d', name: 'List three', startDate: '2023-04-19T23:26:27.000+0000', endDate: null, }, { uuid: '1d48bec7-6aab-464c-ac16-687ba46e7812', name: ' Test patient List-47', startDate: '2023-04-24T23:28:49.000+0000', endDate: null, }, { uuid: '6ce81b61-387d-43ab-86fb-606fa16d39dd', name: ' Test patient List-41', startDate: '2023-04-24T23:28:49.000+0000', endDate: null, }, { uuid: '1361caf0-b3c3-4937-88e3-40074f7f3320', name: 'Potential Patients', startDate: '2023-06-07T15:40:00.000+0000', endDate: null, }, ]; vi.mock('./usePatientAttributes', () => ({ usePatientAttributes: vi.fn(), usePatientContactAttributes: vi.fn(), })); vi.mock('./usePatientListsForPatient', () => ({ usePatientListsForPatient: vi.fn(), })); vi.mock('./useRelationships', () => ({ useRelationships: vi.fn(), })); describe('ContactDetails', () => { beforeEach(() => { mockUsePatient.mockReturnValue({ isLoading: false, patient: { address: [ { city: 'Foo', country: 'Bar', id: '0000', postalCode: '00100', state: 'Quux', use: 'home', }, ], telecom: [{ system: 'Cellular', value: '+0123456789' }], }, patientUuid: '123e4567-e89b-12d3-a456-426614174000', error: null, }); mockUsePatientContactAttributes.mockReturnValue({ isLoading: false, contactAttributes: mockPersonAttributes, error: null, }); mockUsePatientListsForPatient.mockReturnValue({ isLoading: false, cohorts: mockCohorts, }); mockUseRelationships.mockReturnValue({ isLoading: false, data: mockRelationships, error: undefined, isValidating: false, }); }); it("renders the patient's address, contact details, patient lists, and relationships when available", async () => { renderWithSwr(); expect(screen.getByText(/address/i)).toBeInTheDocument(); expect(screen.getByText(/contact details/i)).toBeInTheDocument(); expect(screen.getByText(/relationships/i)).toBeInTheDocument(); expect(screen.getByText(/Amanda Robinson/)).toBeInTheDocument(); expect(screen.getByText(/Sibling/i)).toBeInTheDocument(); expect(screen.getByText(/24 yrs/i)).toBeInTheDocument(); expect(screen.getByText(/\+0123456789/i)).toBeInTheDocument(); expect(screen.getByText(/Next of Kin Contact Phone Number/i)).toBeInTheDocument(); expect(screen.getByText(/0700-000-000/)).toBeInTheDocument(); expect(screen.getByText(/patient lists/i)).toBeInTheDocument(); expect(screen.getByText(/Test patient List-47/)).toBeInTheDocument(); expect(screen.getByText(/List three/)).toBeInTheDocument(); }); it('patient related name should be a link', async () => { renderWithSwr(); const relationship = screen.getByRole('link', { name: /Amanda Robinson/ }); expect(relationship).toHaveAttribute('href', `/spa/patient/${mockRelationships[0].relativeUuid}/chart`); }); it('renders an empty state view when contact details, relations, patient lists and addresses are not available', async () => { mockUsePatient.mockReturnValue({ isLoading: false, patient: undefined, patientUuid: null, error: null, }); mockUsePatientAttributes.mockReturnValue({ isLoading: false, attributes: [], error: null, }); mockUsePatientContactAttributes.mockReturnValue({ isLoading: false, contactAttributes: [], error: null, }); mockUsePatientListsForPatient.mockReturnValue({ isLoading: false, cohorts: [], }); mockUseRelationships.mockReturnValue({ isLoading: false, data: [], error: undefined, isValidating: false, }); renderWithSwr(); expect(screen.getByText(/address/i)).toBeInTheDocument(); expect(screen.getByText(/relationships/i)).toBeInTheDocument(); expect(screen.getByText(/contact details/i)).toBeInTheDocument(); expect(screen.getByText(/patient lists/i)).toBeInTheDocument(); expect(screen.getAllByText('--').length).toBe(4); }); });