Skip to content

Commit

Permalink
add test suite for useOrg hook and renderHookWithProviders mock
Browse files Browse the repository at this point in the history
  • Loading branch information
dpgraham4401 committed Aug 4, 2024
1 parent 596aea1 commit 97fd213
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 5 deletions.
2 changes: 1 addition & 1 deletion client/app/components/Org/OrgSelect.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { mockSiteEndpoints } from '~/mocks/handlers';
const server = setupServer(...mockSiteEndpoints);
afterEach(() => cleanup());
beforeAll(() => server.listen());
afterAll(() => server.close()); // Disable API mocking after the tests are done.
afterAll(() => server.close());

describe('OrgSelect Component', () => {
it('renders', () => {
Expand Down
43 changes: 43 additions & 0 deletions client/app/hooks/useOrg/useOrg.spec.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { useOrg } from './useOrg';
import { useSearchParams } from 'react-router-dom';
import { afterAll, afterEach, beforeAll, describe, expect, it, Mock, vi } from 'vitest';
import { setupServer } from 'msw/node';
import { mockSiteEndpoints } from '~/mocks/handlers';
import { cleanup, renderHookWithProviders as renderHook } from '~/mocks';
import { act } from '@testing-library/react';

const server = setupServer(...mockSiteEndpoints);
afterEach(() => cleanup());
beforeAll(() => server.listen());
afterAll(() => server.close());

describe('useOrg Hook', () => {
vi.mock('react-router-dom', async (importOriginal) => ({
...(await importOriginal<typeof import('react-router-dom')>()),
useSearchParams: vi.fn(),
}));
it('returns the initial orgId from search params', async () => {
const setSearchParams = vi.fn();
const searchParams = new URLSearchParams('org=myOrg');
(useSearchParams as Mock).mockReturnValue([searchParams, setSearchParams]);

const { result } = renderHook(() => useOrg());

expect(result.current.orgId).toBe('myOrg');
});

it('sets the orgId state and updates search params', () => {
const setSearchParams = vi.fn();
const searchParams = new URLSearchParams();
(useSearchParams as Mock).mockReturnValue([searchParams, setSearchParams]);

const { result } = renderHook(() => useOrg());

act(() => {
result.current.setOrgId('new-org');
});

expect(result.current.orgId).toBe('new-org');
expect(setSearchParams).toHaveBeenCalledWith(new URLSearchParams('org=new-org'));
});
});
4 changes: 1 addition & 3 deletions client/app/mocks/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,2 @@
import { renderWithProviders } from '~/mocks/render';

export { renderWithProviders };
export { renderWithProviders, renderHookWithProviders } from '~/mocks/render';
export * from '@testing-library/react';
24 changes: 23 additions & 1 deletion client/app/mocks/render.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { render, RenderOptions } from '@testing-library/react';
import { render, renderHook, RenderHookResult, RenderOptions } from '@testing-library/react';
import React, { PropsWithChildren, ReactElement } from 'react';
import { FormProvider, useForm, UseFormProps } from 'react-hook-form';
import { Provider } from 'react-redux';
Expand Down Expand Up @@ -50,3 +50,25 @@ export function renderWithProviders(

return { store, ...render(ui, { wrapper: Wrapper, ...renderOptions }) };
}

export function renderHookWithProviders<T>(
hook: () => T,
{
preloadedState = {},
store = setupStore(preloadedState),
useFormProps = {},
}: ExtendedRenderOptions = {}
): RenderHookResult<T, unknown> {
function Wrapper({ children }: PropsWithChildren<NonNullable<unknown>>): ReactElement {
const formMethods = useForm(useFormProps);
return (
<Provider store={store}>
<MemoryRouter>
<FormProvider {...formMethods}>{children}</FormProvider>
</MemoryRouter>
</Provider>
);
}

return { ...renderHook(hook, { wrapper: Wrapper }) };
}

0 comments on commit 97fd213

Please sign in to comment.