import React from 'react';
import { vi, describe, expect, test } from 'vitest';
import { render, screen } from '@testing-library/react';
import { mockPatient } from 'tools';
import FormRenderer from './form-renderer.component';
import useFormSchema from '../hooks/useFormSchema';
const mockUseFormSchema = vi.mocked(useFormSchema);
vi.mock('@openmrs/esm-form-engine-lib', () => ({
FormEngine: vi
.fn()
.mockImplementation(() => React.createElement('div', { 'data-testid': 'openmrs form' }, 'FORM ENGINE LIB')),
}));
vi.mock('../hooks/useFormSchema', () => ({
default: vi.fn(),
}));
describe('FormRenderer', () => {
const defaultProps = {
formUuid: 'test-form-uuid',
patientUuid: mockPatient.id,
patient: mockPatient,
closeWorkspace: vi.fn(),
closeWorkspaceWithSavedChanges: vi.fn(),
promptBeforeClosing: vi.fn(),
setTitle: vi.fn(),
visitContext: null,
mutateVisitContext: null,
};
test('renders FormError component when there is an error', () => {
mockUseFormSchema.mockReturnValue({ schema: null, isLoading: false, error: new Error('test error') });
render();
expect(screen.getByText(/There was an error with this form/i)).toBeInTheDocument();
});
test('renders InlineLoading component when loading', () => {
mockUseFormSchema.mockReturnValue({ schema: null, isLoading: true, error: null });
render();
expect(screen.getByText('Loading ...')).toBeInTheDocument();
});
test('renders a form preview from the engine when a schema is available', async () => {
mockUseFormSchema.mockReturnValue({ schema: { uuid: 'test-schema' }, isLoading: false, error: null } as ReturnType<
typeof useFormSchema
>);
render();
await expect(screen.getByText(/form engine lib/i)).toBeInTheDocument();
expect(mockUseFormSchema).toHaveBeenCalledWith('test-form-uuid');
});
});