import React from 'react';
import { vi, describe, it, expect } from 'vitest';
import userEvent from '@testing-library/user-event';
import { screen } from '@testing-library/react';
import { type FetchResponse, openmrsFetch, showSnackbar } from '@openmrs/esm-framework';
import { mockQueues, mockQueueEntryAlice } from '__mocks__';
import { renderWithSwr } from 'tools';
import DeleteQueueEntryModal from './delete-queue-entry.modal';
import RemoveQueueEntryModal from './remove-queue-entry.modal';
import UndoTransitionQueueEntryModal from './undo-transition-queue-entry.modal';
const mockOpenmrsFetch = vi.mocked(openmrsFetch);
const mockMutateQueueEntries = vi.fn();
vi.mock('../hooks/useQueues', () => {
return {
useQueues: vi.fn().mockReturnValue({
queues: mockQueues,
}),
};
});
vi.mock('../hooks/useQueueEntries', () => ({
useMutateQueueEntries: () => ({
mutateQueueEntries: mockMutateQueueEntries,
}),
}));
describe('UndoTransitionQueueEntryModal', () => {
const queueEntry = mockQueueEntryAlice;
it('has a cancel button that closes the modal', async () => {
const closeModal = vi.fn();
const user = userEvent.setup();
renderWithSwr();
const cancelButton = screen.getByText('Cancel');
await user.click(cancelButton);
expect(closeModal).toHaveBeenCalled();
});
it('has an working submit button', async () => {
mockOpenmrsFetch.mockResolvedValue({
status: 200,
} as unknown as FetchResponse);
const user = userEvent.setup();
renderWithSwr( {}} />);
const submitButton = screen.getByRole('button', { name: /undo transition/i });
expect(submitButton).toBeEnabled();
await user.click(submitButton);
expect(showSnackbar).toHaveBeenCalledWith({
isLowContrast: true,
kind: 'success',
subtitle: 'Queue entry transition undo success',
title: 'Undo transition success',
});
});
});
describe('VoidQueueEntryModal', () => {
const queueEntry = mockQueueEntryAlice;
it('has a cancel button that closes the modal', async () => {
const closeModal = vi.fn();
const user = userEvent.setup();
renderWithSwr();
const cancelButton = screen.getByText('Cancel');
await user.click(cancelButton);
expect(closeModal).toHaveBeenCalled();
});
it('has an working submit button', async () => {
mockOpenmrsFetch.mockResolvedValue({
status: 200,
} as unknown as FetchResponse);
const user = userEvent.setup();
renderWithSwr( {}} />);
const submitButton = screen.getByRole('button', { name: /Delete queue entry/ });
expect(submitButton).toBeEnabled();
await user.click(submitButton);
expect(showSnackbar).toHaveBeenCalledWith({
isLowContrast: true,
kind: 'success',
subtitle: 'Queue entry deleted successfully',
title: 'Queue entry deleted successfully',
});
});
});
describe('EndQueueEntryModal', () => {
const queueEntry = mockQueueEntryAlice;
it('has a cancel button that closes the modal', async () => {
const closeModal = vi.fn();
const user = userEvent.setup();
renderWithSwr();
const cancelButton = screen.getByText('Cancel');
await user.click(cancelButton);
expect(closeModal).toHaveBeenCalled();
});
it('has an working submit button', async () => {
mockOpenmrsFetch.mockResolvedValue({
status: 200,
} as unknown as FetchResponse);
const user = userEvent.setup();
renderWithSwr( {}} />);
const submitButton = screen.getByRole('button', { name: /Remove/ });
expect(submitButton).toBeEnabled();
await user.click(submitButton);
expect(showSnackbar).toHaveBeenCalledWith({
isLowContrast: true,
kind: 'success',
subtitle: 'Patient removed from queue successfully',
title: 'Patient removed',
});
});
it('closes modal and shows warning when queue entry has already ended', async () => {
mockOpenmrsFetch.mockRejectedValue({
responseBody: {
error: {
message: 'Cannot transition a queue entry that has already ended',
},
},
});
const closeModal = vi.fn();
const user = userEvent.setup();
renderWithSwr();
const submitButton = screen.getByRole('button', { name: /Remove/ });
await user.click(submitButton);
expect(showSnackbar).toHaveBeenCalledWith(
expect.objectContaining({
kind: 'warning',
title: 'Queue entry is no longer active',
}),
);
expect(mockMutateQueueEntries).toHaveBeenCalled();
expect(closeModal).toHaveBeenCalled();
});
});