import React from 'react'; import { vi, describe, it, expect, beforeEach } from 'vitest'; import userEvent from '@testing-library/user-event'; import { render, screen } from '@testing-library/react'; import { useLayoutType, isDesktop } from '@openmrs/esm-framework'; import Overlay from './overlay.component'; const mockUseLayoutType = vi.mocked(useLayoutType); const mockIsDesktop = vi.mocked(isDesktop); /** * Helper to render Overlay component. */ function renderOverlay( close = vi.fn(), header = 'Test Header', buttonsGroup?: React.ReactElement, children?: React.ReactNode, ) { return render(); } describe('Overlay component', () => { const mockClose = vi.fn(); beforeEach(() => { mockIsDesktop.mockReturnValue(true); mockUseLayoutType.mockReturnValue('desktop' as any); }); describe('Desktop layout', () => { it('renders header text', () => { renderOverlay(mockClose, 'Test Header'); expect(screen.getByText('Test Header')).toBeInTheDocument(); }); it('renders close button with icon', () => { renderOverlay(mockClose, 'Test Header'); const closeButton = screen.getByRole('button', { name: /close overlay/i }); expect(closeButton).toBeInTheDocument(); }); it('calls close when close button is clicked', async () => { const user = userEvent.setup(); renderOverlay(mockClose, 'Test Header'); const closeButton = screen.getByRole('button', { name: /close overlay/i }); await user.click(closeButton); expect(mockClose).toHaveBeenCalledTimes(1); }); it('renders children content', () => { renderOverlay(mockClose, 'Test Header', undefined,
Test Content
); expect(screen.getByText('Test Content')).toBeInTheDocument(); }); it('renders buttonsGroup when provided', () => { const buttonsGroup = (
); renderOverlay(mockClose, 'Test Header', buttonsGroup); expect(screen.getByRole('button', { name: /save/i })).toBeInTheDocument(); expect(screen.getByRole('button', { name: /cancel/i })).toBeInTheDocument(); }); }); describe('Tablet layout', () => { beforeEach(() => { mockIsDesktop.mockReturnValue(false); mockUseLayoutType.mockReturnValue('tablet' as any); }); it('renders header with back arrow button', () => { renderOverlay(mockClose, 'Test Header'); const backButton = screen.getByRole('button', { name: /close overlay/i }); expect(backButton).toBeInTheDocument(); expect(screen.getByText('Test Header')).toBeInTheDocument(); }); it('calls close when back button is clicked', async () => { const user = userEvent.setup(); renderOverlay(mockClose, 'Test Header'); const backButton = screen.getByRole('button', { name: /close overlay/i }); await user.click(backButton); expect(mockClose).toHaveBeenCalledTimes(1); }); it('renders children content in tablet layout', () => { renderOverlay(mockClose, 'Test Header', undefined,
Tablet Content
); expect(screen.getByText('Tablet Content')).toBeInTheDocument(); }); }); });