import React from 'react'; import { vi, describe, it, expect } from 'vitest'; import userEvent from '@testing-library/user-event'; import { render, screen } from '@testing-library/react'; import { mockPatient } from 'tools'; import { showSnackbar, type FetchResponse } from '@openmrs/esm-framework'; import DeleteProcedureModal from './delete-procedure.modal'; import { deleteProcedure } from '../../procedures.resource'; const mockDeleteProcedure = vi.mocked(deleteProcedure); const mockShowSnackbar = vi.mocked(showSnackbar); vi.mock('../../procedures.resource', async () => ({ ...(await vi.importActual('../../procedures.resource')), deleteProcedure: vi.fn(), useMutatePatientProcedures: vi.fn().mockReturnValue(vi.fn()), })); const defaultProps = { closeDeleteModal: vi.fn(), procedureUuid: '123e4567-e89b-12d3-a456-426614174000', patientUuid: mockPatient.id, }; describe('', () => { it('renders a modal with the correct elements', () => { render(); expect(screen.getByRole('heading', { name: /delete procedure/i })).toBeInTheDocument(); expect(screen.getByText(/are you sure you want to delete this procedure/i)).toBeInTheDocument(); expect(screen.getByRole('button', { name: /close/i })).toBeInTheDocument(); expect(screen.getByRole('button', { name: /cancel/i })).toBeInTheDocument(); expect(screen.getByRole('button', { name: /delete/i })).toBeInTheDocument(); }); it('clicking the Cancel button closes the modal', async () => { const user = userEvent.setup(); render(); const cancelButton = screen.getByRole('button', { name: /cancel/i }); await user.click(cancelButton); expect(defaultProps.closeDeleteModal).toHaveBeenCalled(); }); it('clicking the Delete button deletes the procedure', async () => { const user = userEvent.setup(); mockDeleteProcedure.mockResolvedValue({ status: 200, data: {} } as unknown as FetchResponse); render(); const deleteButton = screen.getByRole('button', { name: /delete/i }); await user.click(deleteButton); expect(mockDeleteProcedure).toHaveBeenCalledTimes(1); expect(mockDeleteProcedure).toHaveBeenCalledWith(defaultProps.procedureUuid); expect(mockShowSnackbar).toHaveBeenCalledTimes(1); expect(mockShowSnackbar).toHaveBeenCalledWith({ isLowContrast: true, kind: 'success', title: 'Procedure deleted', }); }); it('renders an error message if the delete operation fails', async () => { const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); const user = userEvent.setup(); mockDeleteProcedure.mockRejectedValue({ message: 'Internal server error', status: 500 }); render(); const deleteButton = screen.getByRole('button', { name: /delete/i }); await user.click(deleteButton); expect(mockDeleteProcedure).toHaveBeenCalledTimes(1); expect(mockDeleteProcedure).toHaveBeenCalledWith(defaultProps.procedureUuid); expect(mockShowSnackbar).toHaveBeenCalledTimes(1); expect(mockShowSnackbar).toHaveBeenCalledWith({ isLowContrast: false, kind: 'error', title: 'Error deleting procedure', subtitle: 'Internal server error', }); expect(deleteButton).toBeEnabled(); consoleSpy.mockRestore(); }); });