Skip to content

Commit 6371128

Browse files
authored
Merge pull request #1226 from dacadeorg/test/profile-settings-popup
chore: implement email edit form test
2 parents f59ad6e + c65d957 commit 6371128

File tree

12 files changed

+1374
-1130
lines changed

12 files changed

+1374
-1130
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ jobs:
99
- uses: actions/checkout@v4
1010
- uses: actions/setup-node@v4
1111
with:
12-
node-version: "21.0.0"
12+
node-version: "20.0.0"
1313
cache: "yarn"
1414

1515
- name: Install dependencies
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import "@testing-library/jest-dom"
2+
import EmailForm from "@/components/popups/profile-settings/EmailForm";
3+
import { act, fireEvent, screen } from "@testing-library/react";
4+
import { renderWithRedux } from "@__mocks__/renderWithRedux";
5+
6+
jest.mock("next/router", () => ({
7+
useRouter: () => ({
8+
push: jest.fn(),
9+
events: {
10+
on: jest.fn(),
11+
off: jest.fn(),
12+
emit: jest.fn(),
13+
},
14+
isFallback: false,
15+
pathname: "mocked-pathname",
16+
}),
17+
}));
18+
19+
const handleClose = jest.fn()
20+
21+
const onSubmit = jest.fn()
22+
23+
const renderEmailEditForm = () => {
24+
renderWithRedux(<EmailForm show onClose={handleClose} />)
25+
}
26+
27+
beforeEach(() => {
28+
renderEmailEditForm()
29+
})
30+
31+
afterEach(() => {
32+
onSubmit.mockReset()
33+
})
34+
35+
describe("EmailEditForm", () => {
36+
it('should render the email edit form modal.', () => {
37+
expect(screen.getByTestId('profileModal')).toBeInTheDocument()
38+
})
39+
40+
it('should render a form', () => {
41+
const form = screen.getByTestId('edit-email-form')
42+
expect(form).toBeInTheDocument()
43+
})
44+
45+
it('should contain 2 inputs, and a close button', () => {
46+
const emailInput = screen.getByPlaceholderText('login-page.email.placeholder');
47+
const emailInputConfirm = screen.getByPlaceholderText('profile.settings.edit.email.confirm')
48+
const closeButton = screen.getByTestId('close-button')
49+
50+
expect(emailInput).toBeInTheDocument()
51+
expect(emailInputConfirm).toBeInTheDocument()
52+
expect(closeButton).toBeInTheDocument()
53+
})
54+
55+
it("should not modify user's input values", async () => {
56+
const emailInput = screen.getByPlaceholderText('login-page.email.placeholder');
57+
const emailInputConfirm = screen.getByPlaceholderText('profile.settings.edit.email.confirm')
58+
59+
act(() => {
60+
fireEvent.change(emailInput, { target: { value: "[email protected]" } });
61+
fireEvent.change(emailInputConfirm, { target: { value: "[email protected]" } });
62+
fireEvent.submit(screen.getByTestId("edit-email-form"));
63+
})
64+
});
65+
66+
it("should not submit the form when emails do not match", async () => {
67+
const emailInput = screen.getByPlaceholderText('login-page.email.placeholder');
68+
const emailInputConfirm = screen.getByPlaceholderText('profile.settings.edit.email.confirm');
69+
const form = screen.getByTestId('edit-email-form');
70+
71+
fireEvent.change(emailInput, { target: { value: "[email protected]" } });
72+
fireEvent.change(emailInputConfirm, { target: { value: "[email protected]" } });
73+
74+
await act(async () => {
75+
fireEvent.submit(form);
76+
});
77+
78+
expect(onSubmit).not.toHaveBeenCalled();
79+
expect(screen.queryByText("Emails should match.")).toBeInTheDocument();
80+
81+
})
82+
83+
it("it should close the modal when its open", () => {
84+
expect(screen.getByTestId('profileModal')).toBeInTheDocument()
85+
fireEvent.click(screen.getByTestId('close-button'))
86+
expect(handleClose).toHaveBeenCalled()
87+
})
88+
})
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import "@testing-library/jest-dom"
2+
import { renderWithRedux } from "../../../__mocks__/renderWithRedux"
3+
import EditProfile from "@/components/popups/profile-settings/NamesForm"
4+
import { fireEvent, screen } from "@testing-library/react"
5+
6+
jest.mock("next/router", () => ({
7+
useRouter: () => ({
8+
push: jest.fn(),
9+
events: {
10+
on: jest.fn(),
11+
off: jest.fn(),
12+
emit: jest.fn(),
13+
},
14+
isFallback: false,
15+
pathname: "mocked-pathname",
16+
}),
17+
}));
18+
const handleClose = jest.fn()
19+
beforeEach(() => {
20+
renderWithRedux(<EditProfile show onClose={handleClose} />)
21+
})
22+
describe("NamesForm", () => {
23+
it("should render the names edit form", () => {
24+
const form = screen.getByTestId('names-edit-form')
25+
expect(form).toBeInTheDocument()
26+
})
27+
28+
it("should render the form with 2 inputs", () => {
29+
const form = screen.getByTestId('names-edit-form')
30+
const firstNameInput = form.querySelectorAll("div [data-testid='first-name']")
31+
const lastNameInput = form.querySelectorAll("div [data-testid='last-name']")
32+
expect(firstNameInput).toHaveLength(1)
33+
expect(lastNameInput).toHaveLength(1)
34+
})
35+
36+
it("it should close the modal when its open", () => {
37+
expect(screen.getByTestId('names-edit-form')).toBeInTheDocument()
38+
fireEvent.click(screen.getByTestId('close-button'))
39+
expect(handleClose).toHaveBeenCalled()
40+
})
41+
})

package.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,11 @@
1919
"@sumsub/websdk": "^1.4.0",
2020
"@tailwindcss/aspect-ratio": "^0.4.2",
2121
"@tailwindcss/line-clamp": "^0.4.2",
22+
"@testing-library/jest-dom": "^6.4.2",
23+
"@testing-library/react": "^15.0.6",
24+
"@testing-library/user-event": "^14.5.2",
2225
"@types/axios": "^0.14.0",
26+
"@types/jest": "^29.5.12",
2327
"@types/react": "18.0.28",
2428
"@types/react-dom": "18.0.11",
2529
"@typescript-eslint/eslint-plugin": "^6.3.0",
@@ -40,6 +44,8 @@
4044
"hex-to-rgba": "^2.0.1",
4145
"highlightjs-solidity": "^2.0.6",
4246
"i18next": "^22.4.13",
47+
"jest": "^29.7.0",
48+
"jest-environment-jsdom": "^29.7.0",
4349
"lodash": "^4.17.21",
4450
"lodash.debounce": "^4.0.8",
4551
"lodash.uniqby": "^4.7.0",

public/locales/bg/common.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,7 @@
295295
"profile.settings.edit.name.update": "Update your Name",
296296
"profile.settings.edit.email": "Email",
297297
"profile.settings.edit.email.update": "Update your Email",
298+
"profile.settings.edit.email.error": "Имейлите трябва да съвпадат",
298299
"profile.settings.edit.email.confirm": "Confirm email",
299300
"profile.settings.edit.discord": "Discord",
300301
"profile.settings.edit.discord.connect": "connect",

public/locales/en/common.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@
300300
"profile.settings.edit.email": "Email",
301301
"profile.settings.edit.email.update": "Update your Email",
302302
"profile.settings.edit.email.confirm": "Confirm email",
303+
"profile.settings.edit.email.error": "Emails should match",
303304
"profile.settings.discord.disconnect.confirm": "Do you want to disconnect from Discord?",
304305
"profile.settings.discord.disconnect": "Disconnect",
305306
"profile.settings.edit.discord": "Discord",

public/locales/es/common.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@
296296
"profile.settings.edit.email": "Correo electrónico",
297297
"profile.settings.edit.email.confirm": "Confirme correo electrónico",
298298
"profile.settings.edit.email.update": "Actualice su correo electrónico",
299+
"profile.settings.edit.email.error": "Los correos electrónicos deben coincidir",
299300
"profile.settings.edit.name.update": "Actualice su nombre",
300301
"profile.settings.edit.discord": "Discord",
301302
"profile.settings.edit.discord.connect": "conectar",

public/locales/hr/common.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@
296296
"profile.settings.edit.email": "Email",
297297
"profile.settings.edit.email.update": "Update your Email",
298298
"profile.settings.edit.email.confirm": "Confirm email",
299+
"profile.settings.edit.email.error": "E-pošte se trebaju podudarati",
299300
"profile.settings.edit.discord": "Discord",
300301
"profile.settings.edit.discord.connect": "connect",
301302
"profile.settings.edit.discord.connected": "connected",

src/components/popups/profile-settings/EmailForm.tsx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export default function EditEmail({ show, onClose }: EditProfileProps): ReactEle
4747
const [loading, setLoading] = useState(false);
4848
const { t } = useTranslation();
4949
const {
50+
watch,
5051
register,
5152
handleSubmit,
5253
formState: { errors },
@@ -55,8 +56,7 @@ export default function EditEmail({ show, onClose }: EditProfileProps): ReactEle
5556
const onSave = async (form: FormValues) => {
5657
setLoading(true);
5758
try {
58-
const { email, emailConfirm } = form;
59-
if (email !== emailConfirm) return;
59+
const { email } = form;
6060
await dispatch(updateUserEmail({ email }));
6161
await dispatch(logout());
6262
onClose();
@@ -69,9 +69,9 @@ export default function EditEmail({ show, onClose }: EditProfileProps): ReactEle
6969

7070
return (
7171
<Modal show={show} onClose={onClose}>
72-
<div className="px-6 pt-6 relative">
72+
<div className="px-6 pt-6 relative" data-testid="profileModal">
7373
<h1 className="text-.5xl leading-none font-medium mb-12">{t("profile.settings.edit.email.update")}</h1>
74-
<form onSubmit={handleSubmit(onSave)}>
74+
<form onSubmit={handleSubmit(onSave)} data-testid="edit-email-form">
7575
<div className="mb-2.5">
7676
<Input
7777
id="email"
@@ -96,7 +96,8 @@ export default function EditEmail({ show, onClose }: EditProfileProps): ReactEle
9696
<div className="mb-8">
9797
<Input
9898
label={`${t("profile.settings.edit.email.confirm")}`}
99-
error={errors.email?.message}
99+
error={errors.emailConfirm?.message}
100+
placeholder={`${t("profile.settings.edit.email.confirm")}`}
100101
type="emailConfirm"
101102
{...register("emailConfirm", {
102103
required: "This field is required",
@@ -108,11 +109,14 @@ export default function EditEmail({ show, onClose }: EditProfileProps): ReactEle
108109
value: 2,
109110
message: "This must be a valid email address",
110111
},
112+
validate: (val: string) => {
113+
if (watch('email') !== val) return "Emails should match."
114+
},
111115
})}
112116
/>
113117
</div>
114118
<div className="flex pb-2 items-center justify-between">
115-
<span className="cursor-pointer text-sm font-medium text-brand" onClick={onClose}>
119+
<span className="cursor-pointer text-sm font-medium text-brand" onClick={onClose} data-testid="close-button">
116120
{t("profile.edit.close")}
117121
</span>
118122
<ArrowButton loading={loading} disabled={loading} variant="outline-primary">

src/components/popups/profile-settings/NamesForm.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,10 @@ export default function EditProfile({ show, onClose }: EditProfileProps): ReactE
6767
<Modal show={show} onClose={onClose}>
6868
<div className="px-6 pt-6 relative">
6969
<h1 className="text-.5xl leading-none font-medium mb-12">{t("profile.settings.edit.name.update")}</h1>
70-
<form onSubmit={handleSubmit(onSave)}>
70+
<form onSubmit={handleSubmit(onSave)} data-testid="names-edit-form">
7171
<div className="mb-2.5">
7272
<Input
73+
testId="first-name"
7374
label={`${t("profile.edit.label.fist-name")}`}
7475
error={errors.firstName?.message}
7576
type="firstName"
@@ -85,6 +86,7 @@ export default function EditProfile({ show, onClose }: EditProfileProps): ReactE
8586
</div>
8687
<div className="mb-8">
8788
<Input
89+
testId="last-name"
8890
label={`${t("profile.edit.label.last-name")}`}
8991
error={errors.lastName?.message}
9092
type="lastName"
@@ -98,7 +100,7 @@ export default function EditProfile({ show, onClose }: EditProfileProps): ReactE
98100
/>
99101
</div>
100102
<div className="flex pb-2 items-center justify-between">
101-
<span className="cursor-pointer text-sm font-medium text-brand" onClick={onClose}>
103+
<span className="cursor-pointer text-sm font-medium text-primary" onClick={onClose} data-testid="close-button">
102104
{t("profile.edit.close")}
103105
</span>
104106
<ArrowButton loading={loading} disabled={loading} variant="outline-primary">

0 commit comments

Comments
 (0)