import React from 'react'; import { vi, describe, it, expect, test, beforeEach } from 'vitest'; import { screen } from '@testing-library/react'; import OrderPriceDetailsComponent from './order-price-details.component'; import { useOrderPrice } from '../hooks/useOrderPrice'; import { renderWithSwr } from 'tools'; import { mockOrderPriceData } from '__mocks__'; import { getLocale } from '@openmrs/esm-framework'; const mockGetLocale = vi.mocked(getLocale); const mockUseOrderPrice = vi.mocked(useOrderPrice); vi.mock('../hooks/useOrderPrice', () => ({ useOrderPrice: vi.fn(), })); describe('OrderPriceDetailsComponent', () => { const mockOrderItemUuid = 'test-uuid'; beforeEach(() => { vi.resetAllMocks(); mockGetLocale.mockReturnValue('en-US'); }); it('renders loading skeleton when data is loading', () => { mockUseOrderPrice.mockReturnValue({ data: null, isLoading: true, error: null, }); renderWithSwr(); expect(screen.getByRole('paragraph')).toBeInTheDocument(); }); it('renders nothing when amount is null', () => { mockUseOrderPrice.mockReturnValue({ data: { ...mockOrderPriceData, entry: [], }, isLoading: false, error: null, }); const { container } = renderWithSwr(); expect(container).toBeEmptyDOMElement(); }); it('renders price correctly with USD currency', () => { mockUseOrderPrice.mockReturnValue({ data: mockOrderPriceData, isLoading: false, error: null, }); renderWithSwr(); expect(screen.getByText('Price:')).toBeInTheDocument(); expect(screen.getByText('$99.99')).toBeInTheDocument(); }); it('formats price correctly for different locales', () => { mockUseOrderPrice.mockReturnValue({ data: mockOrderPriceData, isLoading: false, error: null, }); // Change to German locale for this test mockGetLocale.mockReturnValue('de-DE'); renderWithSwr(); expect(screen.getByText('99,99 $')).toBeInTheDocument(); }); it('handles invalid currency codes gracefully', () => { const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); mockUseOrderPrice.mockReturnValue({ data: { ...mockOrderPriceData, entry: [ { resource: { ...mockOrderPriceData.entry[0].resource, propertyGroup: [ { priceComponent: [ { type: 'base', amount: { value: 99.99, currency: 'INVALID' }, }, ], }, ], }, }, ], }, isLoading: false, error: null, }); renderWithSwr(); expect(screen.getByText('Price:')).toBeInTheDocument(); expect(screen.getByText('99.99 INVALID')).toBeInTheDocument(); expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Invalid currency code: INVALID')); consoleSpy.mockRestore(); }); it('displays tooltip with price disclaimer', () => { mockUseOrderPrice.mockReturnValue({ data: mockOrderPriceData, isLoading: false, error: null, }); renderWithSwr(); expect(screen.getByRole('button')).toBeInTheDocument(); expect(screen.getByLabelText(/This price is indicative/)).toBeInTheDocument(); }); });