import React from 'react';
import { vi, describe, it, expect, beforeAll } from 'vitest';
import { screen, render, renderHook } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { useFeatureFlag, useLayoutType } from '@openmrs/esm-framework';
import { type OrderBasketItem, useOrderBasket } from '@openmrs/esm-patient-common-lib';
import { mockPatient } from 'tools';
import { orderBasketStore } from '@openmrs/esm-patient-common-lib/src/orders/store';
import OrderBasketActionButton from './order-basket-action-button.component';
const mockUseLayoutType = vi.mocked(useLayoutType);
// This pattern of mocking seems to be required: defining the mocked function here and
// then assigning it with an arrow function wrapper in vi.mock. It is very particular.
// I think it is related to this: https://github.com/swc-project/jest/issues/14#issuecomment-1238621942
const mockLaunchStartVisitPrompt = vi.fn();
const mockUseSystemVisitSetting = vi.fn();
vi.mock('@openmrs/esm-patient-common-lib/src/useSystemVisitSetting', () => {
return {
useSystemVisitSetting: () => mockUseSystemVisitSetting(),
};
});
vi.mock('@openmrs/esm-patient-common-lib/src/launchStartVisitPrompt', () => {
return { launchStartVisitPrompt: () => mockLaunchStartVisitPrompt() };
});
mockUseSystemVisitSetting.mockReturnValue({ systemVisitEnabled: false });
const mockedUseFeatureFlag = vi.mocked(useFeatureFlag);
describe('', () => {
beforeAll(() => {
orderBasketStore.setState({
items: {
[mockPatient.id]: {
medications: [{ name: 'order-01', uuid: 'some-uuid' } as unknown as OrderBasketItem],
},
},
});
});
it('should display tablet view action button', async () => {
const user = userEvent.setup();
mockUseLayoutType.mockReturnValue('tablet');
render(
,
);
const orderBasketButton = screen.getByRole('button', { name: /Order Basket/i });
expect(orderBasketButton).toBeInTheDocument();
});
it('should display desktop view action button', async () => {
const user = userEvent.setup();
mockUseLayoutType.mockReturnValue('small-desktop');
render(
,
);
const orderBasketButton = screen.getByRole('button', { name: /order basket/i });
expect(orderBasketButton).toBeInTheDocument();
});
it('should prompt user to start visit if no currentVisit found', async () => {
mockedUseFeatureFlag.mockReturnValue(false);
const user = userEvent.setup();
mockUseLayoutType.mockReturnValue('small-desktop');
mockUseSystemVisitSetting.mockReturnValue({ systemVisitEnabled: true });
render(
,
);
const orderBasketButton = screen.getByRole('button', { name: /order basket/i });
expect(orderBasketButton).toBeInTheDocument();
});
it('should display a count tag when orders are present on the desktop view', () => {
mockUseLayoutType.mockReturnValue('small-desktop');
const { result } = renderHook(() => useOrderBasket(mockPatient));
expect(result.current.orders).toHaveLength(1); // sanity check
render(
,
);
expect(screen.getByText(/order basket/i)).toBeInTheDocument();
expect(screen.getByText(/1/i)).toBeInTheDocument();
});
it('should display the count tag when orders are present on the tablet view', () => {
mockUseLayoutType.mockReturnValue('tablet');
render(
,
);
expect(screen.getByRole('button', { name: /1 order basket/i })).toBeInTheDocument();
});
});