Skip to main content
Glama
App.test.tsx3.52 kB
// SPDX-FileCopyrightText: Copyright Orangebot, Inc. and Medplum contributors // SPDX-License-Identifier: Apache-2.0 import { MantineProvider } from '@mantine/core'; import { MockClient } from '@medplum/mock'; import { MedplumProvider } from '@medplum/react'; import { MemoryRouter } from 'react-router'; import { App } from './App'; import type { UserEvent } from './test-utils/render'; import { act, render, screen, userEvent } from './test-utils/render'; const navigateMock = jest.fn(); async function setup(url = '/'): Promise<UserEvent> { const user = userEvent.setup({ advanceTimers: jest.advanceTimersByTime }); await act(async () => { render( <MemoryRouter initialEntries={[url]} initialIndex={0}> <MedplumProvider medplum={new MockClient()} navigate={navigateMock}> <MantineProvider> <App /> </MantineProvider> </MedplumProvider> </MemoryRouter> ); }); return user; } describe('App', () => { beforeEach(() => { jest.useFakeTimers(); }); afterEach(async () => { await act(async () => { jest.runOnlyPendingTimers(); }); jest.useRealTimers(); }); test('Click logo', async () => { const user = await setup(); await openNav(user); expect(screen.getByText('Patients')).toBeInTheDocument(); expect(screen.getByText('Settings')).toBeInTheDocument(); expect(screen.getByText('Security')).toBeInTheDocument(); }); test('Click profile', async () => { const user = await setup(); await openMenu(user); await user.click(screen.getByText('Account settings')); }); test('Change profile', async () => { const user = await setup(); await openMenu(user); await user.click(screen.getByText('Switch to another project')); }); test('Click sign out', async () => { const user = await setup(); await openMenu(user); await user.click(screen.getByText('Sign out')); }); test('Active link', async () => { const user = await setup('/ServiceRequest?status=active'); await openNav(user); const activeLink = screen.getByText('Active Orders'); expect(activeLink.parentElement?.dataset?.['active']).toEqual('true'); const completedLink = screen.getByText('Completed Orders'); expect(completedLink.parentElement?.dataset?.['active']).toBeUndefined(); }); test('Resource Type Search', async () => { const user = await setup(); await openNav(user); const input = (await screen.findByPlaceholderText('Resource Type')) as HTMLInputElement; // Enter random text await user.type(input, 'Different'); await user.type(input, 'Test'); // Wait for the drop down await act(async () => { jest.advanceTimersByTime(1000); }); // Press the down arrow await user.keyboard('{ArrowDown}'); // Press "Enter" await user.keyboard('{Enter}'); expect(navigateMock).toHaveBeenCalledWith('/test-code'); }); }); function isNavOpen(): boolean { return screen.getByTitle('Medplum Logo').closest('button')?.getAttribute('aria-expanded') === 'true'; } async function openNav(user: UserEvent): Promise<void> { if (!isNavOpen()) { await user.click(screen.getByTitle('Medplum Logo')); } } function isMenuOpen(): boolean { return !!screen.queryByText('Sign out'); } async function openMenu(user: UserEvent): Promise<void> { if (!isMenuOpen()) { await user.click(screen.getByRole('button', { name: 'User menu' })); await screen.findByText('Sign out'); } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/medplum/medplum'

If you have feedback or need assistance with the MCP directory API, please join our Discord server