Skip to content
This repository has been archived by the owner on Mar 21, 2024. It is now read-only.

Commit

Permalink
Merge pull request #84 from FusionAuth/83-correct-component-tests-usa…
Browse files Browse the repository at this point in the history
…ge-of-testing-library-and-async

fixes usage of `waitFor` to render component tests
  • Loading branch information
dmackinn authored Feb 22, 2024
2 parents 5f0f4c0 + 4529d3a commit 68ad56e
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 80 deletions.
33 changes: 9 additions & 24 deletions src/__tests__/FusionAuthLoginButton.test.tsx
Original file line number Diff line number Diff line change
@@ -1,38 +1,23 @@
import React from 'react';
import { screen, render, fireEvent, waitFor } from '@testing-library/react';
import { screen, render, fireEvent } from '@testing-library/react';
import { FusionAuthLoginButton } from '../components/FusionAuthLoginButton';
import { FusionAuthProvider } from '../providers/FusionAuthProvider';
import { mockUseFusionAuth } from './mocks/mockUseFusionAuth';
import { TEST_CONFIG } from './mocks/testConfig';

describe('FusionAuthLoginButton', () => {
afterEach(() => {
jest.clearAllMocks();
});

test('Login buttons renders the correct text', async () => {
await renderProvider();
expect(await screen.findByText('Login')).toBeInTheDocument();
});

test('Login button will call the useFusionAuth hook', async () => {
test('Login button will call the useFusionAuth hook', () => {
const login = jest.fn();
mockUseFusionAuth({ login });

await renderProvider();
const stateValue = 'state-value-for-login';
render(
<FusionAuthProvider {...TEST_CONFIG}>
<FusionAuthLoginButton state={stateValue} />
</FusionAuthProvider>,
);

fireEvent.click(screen.getByText('Login'));

expect(login).toBeCalledWith('state');
expect(login).toHaveBeenCalledWith(stateValue);
});
});

const renderProvider = () => {
return waitFor(() =>
render(
<FusionAuthProvider {...TEST_CONFIG}>
<FusionAuthLoginButton state="state" />
</FusionAuthProvider>,
),
);
};
31 changes: 8 additions & 23 deletions src/__tests__/FusionAuthLogoutButton.test.tsx
Original file line number Diff line number Diff line change
@@ -1,38 +1,23 @@
import React from 'react';
import { screen, render, fireEvent, waitFor } from '@testing-library/react';
import { screen, render, fireEvent } from '@testing-library/react';
import { FusionAuthLogoutButton } from '../components/FusionAuthLogoutButton';
import { FusionAuthProvider } from '../providers/FusionAuthProvider';
import { mockUseFusionAuth } from './mocks/mockUseFusionAuth';
import { TEST_CONFIG } from './mocks/testConfig';

describe('FusionAuthLogoutButton', () => {
afterEach(() => {
jest.clearAllMocks();
});

test('Logout buttons renders the correct text', async () => {
await renderProvider();
expect(await screen.findByText('Logout')).toBeInTheDocument();
});

test('Logout button will call the useFusionAuth hook', async () => {
test('Logout button will call the useFusionAuth hook', () => {
const logout = jest.fn();
mockUseFusionAuth({ logout });

await renderProvider();
render(
<FusionAuthProvider {...TEST_CONFIG}>
<FusionAuthLogoutButton />
</FusionAuthProvider>,
);

fireEvent.click(screen.getByText('Logout'));

expect(logout).toBeCalledWith();
expect(logout).toHaveBeenCalled();
});
});

const renderProvider = () => {
return waitFor(() =>
render(
<FusionAuthProvider {...TEST_CONFIG}>
<FusionAuthLogoutButton />
</FusionAuthProvider>,
),
);
};
30 changes: 8 additions & 22 deletions src/__tests__/FusionAuthRegisterButton.test.tsx
Original file line number Diff line number Diff line change
@@ -1,38 +1,24 @@
import React from 'react';
import { screen, render, fireEvent, waitFor } from '@testing-library/react';
import { screen, render, fireEvent } from '@testing-library/react';
import { FusionAuthRegisterButton } from '../components/FusionAuthRegisterButton';
import { FusionAuthProvider } from '../providers/FusionAuthProvider';
import { mockUseFusionAuth } from './mocks/mockUseFusionAuth';
import { TEST_CONFIG } from './mocks/testConfig';

describe('FusionAuthRegisterButton', () => {
afterEach(() => {
jest.clearAllMocks();
});

test('Register buttons renders the correct text', async () => {
await renderProvider();
expect(await screen.findByText('Register Now')).toBeInTheDocument();
});

test('Register button will call the useFusionAuth hook', async () => {
const register = jest.fn();
mockUseFusionAuth({ register });

await renderProvider();
const stateValue = 'state-value-for-register';
render(
<FusionAuthProvider {...TEST_CONFIG}>
<FusionAuthRegisterButton state={stateValue} />
</FusionAuthProvider>,
);

fireEvent.click(screen.getByText('Register Now'));

expect(register).toBeCalledWith('state');
expect(register).toHaveBeenCalledWith(stateValue);
});
});

const renderProvider = () => {
return waitFor(() =>
render(
<FusionAuthProvider {...TEST_CONFIG}>
<FusionAuthRegisterButton state="state" />
</FusionAuthProvider>,
),
);
};
5 changes: 4 additions & 1 deletion src/__tests__/mocks/createContextMock.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
import { IFusionAuthContext } from '../../providers/FusionAuthProvider';

export const createContextMock = (context: Partial<IFusionAuthContext>) => ({
export const createContextMock = (
context: Partial<IFusionAuthContext>,
): IFusionAuthContext => ({
login: context.login ?? jest.fn(),
logout: context.logout ?? jest.fn(),
register: context.register ?? jest.fn(),
isAuthenticated: context.isAuthenticated ?? false,
user: context.user ?? {},
refreshToken: context.refreshToken ?? jest.fn(),
isLoading: context.isLoading ?? false,
});
18 changes: 8 additions & 10 deletions src/__tests__/withFusionAuth.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,19 @@ import {
withFusionAuth,
WithFusionAuthProps,
} from '../components/withFusionAuth';
import { waitFor, render } from '@testing-library/react';
import { render } from '@testing-library/react';
import {
FusionAuthContext,
IFusionAuthContext,
} from '../providers/FusionAuthProvider';
import { createContextMock } from '../__tests__/mocks/createContextMock';

describe('withFusionAuth', () => {
test('component wrapped in HOC receives context values', async () => {
test('component wrapped in HOC receives context values', () => {
const logout = jest.fn();
await renderWrappedComponent({ logout });
renderWrappedComponent({ logout });

expect(logout).toBeCalled();
expect(logout).toHaveBeenCalled();
});
});

Expand All @@ -33,11 +33,9 @@ const WithFusionAuth = withFusionAuth(WithoutFusionAuth);

const renderWrappedComponent = (context: Partial<IFusionAuthContext>) => {
const contextMock = createContextMock(context);
return waitFor(() =>
render(
<FusionAuthContext.Provider value={contextMock}>
<WithFusionAuth />
</FusionAuthContext.Provider>,
),
render(
<FusionAuthContext.Provider value={contextMock}>
<WithFusionAuth />
</FusionAuthContext.Provider>,
);
};

0 comments on commit 68ad56e

Please sign in to comment.