Skip to content

Commit 69317da

Browse files
committed
feat: update tests and components to use the user event API
1 parent 0ab85c6 commit 69317da

File tree

10 files changed

+139
-132
lines changed

10 files changed

+139
-132
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@
8989
"@dev-plugins/react-query": "^0.0.7",
9090
"@expo/config": "~9.0.2",
9191
"@testing-library/jest-dom": "^6.5.0",
92-
"@testing-library/react-native": "^12.6.0",
92+
"@testing-library/react-native": "^12.7.2",
9393
"@types/i18n-js": "^3.8.9",
9494
"@types/jest": "^29.5.12",
9595
"@types/lodash.memoize": "^4.1.9",

pnpm-lock.yaml

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/login-form.test.tsx

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from 'react';
22

3-
import { cleanup, fireEvent, render, screen, waitFor } from '@/core/test-utils';
3+
import { cleanup, screen, setup, waitFor } from '@/core/test-utils';
44

55
import type { LoginFormProps } from './login-form';
66
import { LoginForm } from './login-form';
@@ -11,55 +11,55 @@ const onSubmitMock: jest.Mock<LoginFormProps['onSubmit']> = jest.fn();
1111

1212
describe('LoginForm Form ', () => {
1313
it('renders correctly', async () => {
14-
render(<LoginForm />);
14+
setup(<LoginForm />);
1515
expect(await screen.findByText(/Sign in/i)).toBeOnTheScreen();
1616
});
1717

1818
it('should display required error when values are empty', async () => {
19-
render(<LoginForm />);
19+
const { user } = setup(<LoginForm />);
2020

2121
const button = screen.getByTestId('login-button');
2222
expect(screen.queryByText(/Email is required/i)).not.toBeOnTheScreen();
23-
fireEvent.press(button);
23+
await user.press(button);
2424
expect(await screen.findByText(/Email is required/i)).toBeOnTheScreen();
2525
expect(screen.getByText(/Password is required/i)).toBeOnTheScreen();
2626
});
2727

2828
it('should display matching error when email is invalid', async () => {
29-
render(<LoginForm />);
29+
const { user } = setup(<LoginForm />);
3030

3131
const button = screen.getByTestId('login-button');
3232
const emailInput = screen.getByTestId('email-input');
3333
const passwordInput = screen.getByTestId('password-input');
3434

35-
fireEvent.changeText(emailInput, 'yyyyy');
36-
fireEvent.changeText(passwordInput, 'test');
37-
fireEvent.press(button);
35+
await user.type(emailInput, 'yyyyy');
36+
await user.type(passwordInput, 'test');
37+
await user.press(button);
3838

39-
expect(screen.queryByText(/Email is required/i)).not.toBeOnTheScreen();
4039
expect(await screen.findByText(/Invalid Email Format/i)).toBeOnTheScreen();
40+
expect(screen.queryByText(/Email is required/i)).not.toBeOnTheScreen();
4141
});
4242

4343
it('Should call LoginForm with correct values when values are valid', async () => {
44-
render(<LoginForm onSubmit={onSubmitMock} />);
44+
const { user } = setup(<LoginForm onSubmit={onSubmitMock} />);
4545

4646
const button = screen.getByTestId('login-button');
4747
const emailInput = screen.getByTestId('email-input');
4848
const passwordInput = screen.getByTestId('password-input');
4949

50-
fireEvent.changeText(emailInput, '[email protected]');
51-
fireEvent.changeText(passwordInput, 'password');
52-
fireEvent.press(button);
50+
await user.type(emailInput, '[email protected]');
51+
await user.type(passwordInput, 'password');
52+
await user.press(button);
5353
await waitFor(() => {
5454
expect(onSubmitMock).toHaveBeenCalledTimes(1);
5555
});
56-
// undefined because we don't use second argument of the SubmitHandler
56+
// expect.objectContaining({}) because we don't want to test the target event we are receiving from the onSubmit function
5757
expect(onSubmitMock).toHaveBeenCalledWith(
5858
{
5959
6060
password: 'password',
6161
},
62-
undefined
62+
expect.objectContaining({}),
6363
);
6464
});
6565
});

src/ui/button.test.tsx

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import React from 'react';
33
import { Text } from 'react-native';
44

5-
import { cleanup, fireEvent, render, screen } from '@/core/test-utils';
5+
import { cleanup, render, screen, setup } from '@/core/test-utils';
66

77
import { Button } from './button';
88

@@ -17,7 +17,7 @@ describe('Button component ', () => {
1717
render(
1818
<Button testID="button">
1919
<Text> Custom child </Text>
20-
</Button>
20+
</Button>,
2121
);
2222
expect(screen.getByText('Custom child')).toBeOnTheScreen();
2323
});
@@ -31,48 +31,48 @@ describe('Button component ', () => {
3131
expect(screen.getByTestId('button')).toBeOnTheScreen();
3232
expect(screen.getByTestId('button-activity-indicator')).toBeOnTheScreen();
3333
});
34-
it('should call onClick handler when clicked', () => {
34+
it('should call onClick handler when clicked', async () => {
3535
const onClick = jest.fn();
36-
render(
37-
<Button testID="button" label="Click the button" onPress={onClick} />
36+
const { user } = setup(
37+
<Button testID="button" label="Click the button" onPress={onClick} />,
3838
);
3939
expect(screen.getByTestId('button')).toBeOnTheScreen();
40-
fireEvent.press(screen.getByTestId('button'));
40+
await user.press(screen.getByTestId('button'));
4141
expect(onClick).toHaveBeenCalledTimes(1);
4242
});
43-
it('should be disabled when loading', () => {
43+
it('should be disabled when loading', async () => {
4444
const onClick = jest.fn();
45-
render(
45+
const { user } = setup(
4646
<Button
4747
testID="button"
4848
loading={true}
4949
label="Click the button"
5050
onPress={onClick}
51-
/>
51+
/>,
5252
);
5353
expect(screen.getByTestId('button')).toBeOnTheScreen();
5454
expect(screen.getByTestId('button-activity-indicator')).toBeOnTheScreen();
5555
expect(screen.getByTestId('button')).toBeDisabled();
56-
fireEvent.press(screen.getByTestId('button'));
56+
await user.press(screen.getByTestId('button'));
5757
expect(onClick).toHaveBeenCalledTimes(0);
5858
});
5959
it('should be disabled when disabled prop is true', () => {
6060
render(<Button testID="button" disabled={true} />);
6161
expect(screen.getByTestId('button')).toBeDisabled();
6262
});
63-
it("shouldn't call onClick when disabled", () => {
63+
it("shouldn't call onClick when disabled", async () => {
6464
const onClick = jest.fn();
65-
render(
65+
const { user } = setup(
6666
<Button
6767
testID="button"
6868
label="Click the button"
6969
disabled={true}
7070
onPress={onClick}
7171
variant="secondary"
72-
/>
72+
/>,
7373
);
7474
expect(screen.getByTestId('button')).toBeOnTheScreen();
75-
fireEvent.press(screen.getByTestId('button'));
75+
await user.press(screen.getByTestId('button'));
7676

7777
expect(screen.getByTestId('button')).toBeDisabled();
7878

0 commit comments

Comments
 (0)