From 7902e92df2270bd618aba279f78948dd2b495b49 Mon Sep 17 00:00:00 2001 From: Yasiu1376 Date: Sat, 7 Oct 2023 11:39:43 +0330 Subject: [PATCH] CFE-12 complete change password test and mock for handle api --- mocks/handler.js | 21 +- .../__test__/index.test.js | 185 ++++++++---------- src/core/data/apiRoutes.js | 2 +- 3 files changed, 100 insertions(+), 108 deletions(-) diff --git a/mocks/handler.js b/mocks/handler.js index 49e0f99..65f5398 100644 --- a/mocks/handler.js +++ b/mocks/handler.js @@ -1,8 +1,17 @@ -import {GET_USER_ROUTE} from "@/core/data/apiRoutes"; +import {GET_USER_ROUTE, SET_USER_PASSWORD} from "@/core/data/apiRoutes"; import {rest} from "msw"; -export const handler = [rest.get(GET_USER_ROUTE, (req, res, ctx) => { - return res(ctx.json({ - id: 10 - })) -})] \ No newline at end of file +export const handler = [ + rest.get(GET_USER_ROUTE, (req, res, ctx) => { + return res(ctx.json({ + data:{ + id: 10 + } + })) + }), + rest.post(SET_USER_PASSWORD, (req, res, ctx) => { + return res( + ctx.status(200), + ); + }), +] \ No newline at end of file diff --git a/src/components/dashboard/change-password/change-password-form/__test__/index.test.js b/src/components/dashboard/change-password/change-password-form/__test__/index.test.js index 4a63240..503b571 100644 --- a/src/components/dashboard/change-password/change-password-form/__test__/index.test.js +++ b/src/components/dashboard/change-password/change-password-form/__test__/index.test.js @@ -1,6 +1,10 @@ import { render, screen, waitFor, fireEvent , act } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; import MockAppWithProviders from "../../../../../../mocks/AppWithProvider"; import ChangePasswordForm from "@/components/dashboard/change-password/change-password-form"; +import {SET_USER_PASSWORD} from "@/core/data/apiRoutes"; +import {server} from "../../../../../../mocks/server"; +import {rest} from "msw"; describe('Change Password Form Component From Change Password Page', () => { describe('Rendering', () => { @@ -11,17 +15,17 @@ describe('Change Password Form Component From Change Password Page', () => { }); it('Should see the label for current password field', () => { render(); - const currentPasswordLabel = screen.getByLabelText('رمز عبور فعلی'); + const currentPasswordLabel = screen.queryByLabelText('رمز عبور فعلی'); expect(currentPasswordLabel).toBeInTheDocument(); }); it('Should see the label for new password field', () => { render(); - const newPasswordLabel = screen.getByLabelText('رمز عبور جدید'); + const newPasswordLabel = screen.queryByLabelText('رمز عبور جدید'); expect(newPasswordLabel).toBeInTheDocument(); }); it('Should see the label for confirm password field', () => { render(); - const confirmPasswordLabel = screen.getByLabelText('تکرار رمز عبور جدید'); + const confirmPasswordLabel = screen.queryByLabelText('تکرار رمز عبور جدید'); expect(confirmPasswordLabel).toBeInTheDocument(); }); it('Should see the submit button with the submit label and should be disable', () => { @@ -32,9 +36,9 @@ describe('Change Password Form Component From Change Password Page', () => { }); it('Should have empty input fields and not see any validation error for current password, new password, and confirm password', () => { render(); - const currentPasswordInput = screen.getByLabelText('رمز عبور فعلی'); - const newPasswordInput = screen.getByLabelText('رمز عبور جدید'); - const confirmPasswordInput = screen.getByLabelText('تکرار رمز عبور جدید'); + const currentPasswordInput = screen.queryByLabelText('رمز عبور فعلی'); + const newPasswordInput = screen.queryByLabelText('رمز عبور جدید'); + const confirmPasswordInput = screen.queryByLabelText('تکرار رمز عبور جدید'); expect(currentPasswordInput).toHaveValue(''); expect(newPasswordInput).toHaveValue(''); @@ -47,10 +51,10 @@ describe('Change Password Form Component From Change Password Page', () => { }); }); describe("Behavior", ()=>{ - it('Should fill the current password field', async () => { + it('Should fill the current password field and not see any error while its not empty', async () => { render(); - const currentPasswordInput = screen.getByLabelText('رمز عبور فعلی'); + const currentPasswordInput = screen.queryByLabelText('رمز عبور فعلی'); // Simulate typing something in the current password input fireEvent.change(currentPasswordInput, { target: { value: 'witel@fani0' } }); @@ -60,10 +64,10 @@ describe('Change Password Form Component From Change Password Page', () => { expect(currentPasswordInput).toHaveValue('witel@fani0'); }); }); - it('Should fill the new password field', async () => { + it('Should fill the new password field and not see any error while its not empty', async () => { render(); - const newPasswordInput = screen.getByLabelText('رمز عبور جدید'); + const newPasswordInput = screen.queryByLabelText('رمز عبور جدید'); // Simulate typing something in the new password input fireEvent.change(newPasswordInput, { target: { value: 'witel@fani1' } }); @@ -73,10 +77,10 @@ describe('Change Password Form Component From Change Password Page', () => { expect(newPasswordInput).toHaveValue('witel@fani1'); }); }); - it('Should fill the confirm new password field', async () => { + it('Should fill the confirm new password field and not see any error while its not empty', async () => { render(); - const confirmPasswordInput = screen.getByLabelText('تکرار رمز عبور جدید'); + const confirmPasswordInput = screen.queryByLabelText('تکرار رمز عبور جدید'); // Simulate typing something in the confirmation new password input fireEvent.change(confirmPasswordInput, { target: { value: 'witel@fani1' } }); @@ -88,12 +92,11 @@ describe('Change Password Form Component From Change Password Page', () => { }); }); describe("Validation", ()=>{ - it('Should see error while current password is empty on submit click or on blur event and not see any error while its not empty', async () => { + it('Should see error while current password is empty on blur event', async () => { render(); // Simulate blur event on the current password input - const currentPasswordInput = screen.getByLabelText('رمز عبور فعلی'); - const submitButton = screen.getByRole('button', { name: 'ثبت' }); + const currentPasswordInput = screen.queryByLabelText('رمز عبور فعلی'); // Clear the input field fireEvent.change(currentPasswordInput, { target: { value: '' } }); @@ -103,20 +106,12 @@ describe('Change Password Form Component From Change Password Page', () => { await waitFor(()=>{ expect(screen.queryByText("وارد کردن رمز عبور فعلی الزامیست!")).toBeInTheDocument() }); - - // Simulate clicking the submit button - fireEvent.click(submitButton); - - await waitFor(() => { - expect(screen.queryByText("وارد کردن رمز عبور فعلی الزامیست!")).toBeInTheDocument(); - }); }); - it('Should see error while new password is empty on submit click or on blur event and not see any error while its not empty', async () => { + it('Should see error while new password is empty on blur event', async () => { render(); // Simulate blur event on the new password input - const newPasswordInput = screen.getByLabelText('رمز عبور جدید'); - const submitButton = screen.getByRole('button', { name: 'ثبت' }); + const newPasswordInput = screen.queryByLabelText('رمز عبور جدید'); // Clear the input field fireEvent.change(newPasswordInput, { target: { value: '' } }); @@ -126,20 +121,12 @@ describe('Change Password Form Component From Change Password Page', () => { await waitFor(()=>{ expect(screen.queryByText("وارد کردن رمز عبور جدید الزامیست!")).toBeInTheDocument() }); - - // Simulate clicking the submit button - fireEvent.click(submitButton); - - await waitFor(() => { - expect(screen.queryByText("وارد کردن رمز عبور جدید الزامیست!")).toBeInTheDocument(); - }); }); - it('Should see error while confirm new password is empty on submit click or on blur event and not see any error while its not empty', async () => { + it('Should see error while confirm new password is empty on blur event', async () => { render(); // Simulate blur event on the new password input - const confirmPasswordInput = screen.getByLabelText('تکرار رمز عبور جدید'); - const submitButton = screen.getByRole('button', { name: 'ثبت' }); + const confirmPasswordInput = screen.queryByLabelText('تکرار رمز عبور جدید'); // Clear the input field fireEvent.change(confirmPasswordInput, { target: { value: '' } }); @@ -149,18 +136,11 @@ describe('Change Password Form Component From Change Password Page', () => { await waitFor(()=>{ expect(screen.queryByText("وارد کردن تکرار رمز عبور جدید الزامیست!")).toBeInTheDocument() }); - - // Simulate clicking the submit button - fireEvent.click(submitButton); - - await waitFor(() => { - expect(screen.queryByText("وارد کردن تکرار رمز عبور جدید الزامیست!")).toBeInTheDocument(); - }); }); it('Should see error when new password is less than 8 characters', async () => { render(); - const newPasswordInput = screen.getByLabelText('رمز عبور جدید'); + const newPasswordInput = screen.queryByLabelText('رمز عبور جدید'); const submitButton = screen.getByRole('button', { name: 'ثبت' }); // Simulate entering a short new password @@ -168,20 +148,20 @@ describe('Change Password Form Component From Change Password Page', () => { fireEvent.blur(newPasswordInput); await waitFor(() => { - expect(screen.getByText("رمز عبور باید حداقل 8 کاراکتر باشد.")).toBeInTheDocument(); + expect(screen.queryByText("رمز عبور باید حداقل 8 کاراکتر باشد.")).toBeInTheDocument(); }); // Simulate clicking the submit button fireEvent.click(submitButton); await waitFor(() => { - expect(screen.getByText("رمز عبور باید حداقل 8 کاراکتر باشد.")).toBeInTheDocument(); + expect(screen.queryByText("رمز عبور باید حداقل 8 کاراکتر باشد.")).toBeInTheDocument(); }); }); it('Should not see error when new password are 8 or more characters', async () => { render(); - const newPasswordInput = screen.getByLabelText('رمز عبور جدید'); + const newPasswordInput = screen.queryByLabelText('رمز عبور جدید'); const submitButton = screen.getByRole('button', { name: 'ثبت' }); // Simulate entering a valid new password @@ -202,8 +182,8 @@ describe('Change Password Form Component From Change Password Page', () => { it('Should see error when new password and confirm password do not match on blur event and submit click', async () => { render(); - const newPasswordInput = screen.getByLabelText('رمز عبور جدید'); - const confirmPasswordInput = screen.getByLabelText('تکرار رمز عبور جدید'); + const newPasswordInput = screen.queryByLabelText('رمز عبور جدید'); + const confirmPasswordInput = screen.queryByLabelText('تکرار رمز عبور جدید'); const submitButton = screen.getByRole('button', { name: 'ثبت' }); // Simulate entering a valid new password @@ -215,21 +195,21 @@ describe('Change Password Form Component From Change Password Page', () => { fireEvent.blur(confirmPasswordInput); await waitFor(() => { - expect(screen.getByText("پسورد و تکرار رمز عبور باید یکسان باشد")).toBeInTheDocument(); + expect(screen.queryByText("پسورد و تکرار رمز عبور باید یکسان باشد")).toBeInTheDocument(); }); // Simulate clicking the submit button fireEvent.click(submitButton); await waitFor(() => { - expect(screen.getByText("پسورد و تکرار رمز عبور باید یکسان باشد")).toBeInTheDocument(); + expect(screen.queryByText("پسورد و تکرار رمز عبور باید یکسان باشد")).toBeInTheDocument(); }); }); it('Should not see error when new password and confirm password match on blur event and submit click', async () => { render(); - const newPasswordInput = screen.getByLabelText('رمز عبور جدید'); - const confirmPasswordInput = screen.getByLabelText('تکرار رمز عبور جدید'); + const newPasswordInput = screen.queryByLabelText('رمز عبور جدید'); + const confirmPasswordInput = screen.queryByLabelText('تکرار رمز عبور جدید'); const submitButton = screen.getByRole('button', { name: 'ثبت' }); // Simulate entering a valid new password @@ -259,9 +239,9 @@ describe('Change Password Form Component From Change Password Page', () => { const submitButton = screen.getByRole('button', { name: 'ثبت' }); // Simulate entering valid values in the form fields - const currentPasswordInput = screen.getByLabelText('رمز عبور فعلی'); - const newPasswordInput = screen.getByLabelText('رمز عبور جدید'); - const confirmPasswordInput = screen.getByLabelText('تکرار رمز عبور جدید'); + const currentPasswordInput = screen.queryByLabelText('رمز عبور فعلی'); + const newPasswordInput = screen.queryByLabelText('رمز عبور جدید'); + const confirmPasswordInput = screen.queryByLabelText('تکرار رمز عبور جدید'); fireEvent.change(currentPasswordInput, { target: { value: 'Witel@fani0' } }); fireEvent.change(newPasswordInput, { target: { value: 'Witel@fani1' } }); @@ -272,51 +252,54 @@ describe('Change Password Form Component From Change Password Page', () => { expect(submitButton).not.toBeDisabled(); }); }); - // it('Should submit the form and reset it on success', async () => { - // server.use([rest.get(SET_USER_PASSWORD, (req, res, ctx) => { - // return res(ctx.status(200),) - // })]) - // render(); - // - // // Mock the requestServer function to simulate a successful API response - // const originalRequestServer = global.requestServer; - // global.requestServer = jest.fn().mockResolvedValue({}); - // - // const submitButton = screen.getByRole('button', { name: 'ثبت' }); - // - // // Simulate entering valid values in the form fields - // const currentPasswordInput = screen.getByLabelText('رمز عبور فعلی'); - // const newPasswordInput = screen.getByLabelText('رمز عبور جدید'); - // const confirmPasswordInput = screen.getByLabelText('تکرار رمز عبور جدید'); - // - // fireEvent.change(currentPasswordInput, { target: { value: 'Witel@fani0' } }); - // fireEvent.change(newPasswordInput, { target: { value: 'Witel@fani1' } }); - // fireEvent.change(confirmPasswordInput, { target: { value: 'Witel@fani1' } }); - // - // // Check if the submit button is enabled - // await waitFor(() => { - // expect(submitButton).not.toBeDisabled(); - // }); - // - // // Simulate form submission - // fireEvent.click(submitButton); - // - // // Wait for success message - // await waitFor(() => { - // // const successMessage = screen.getByText("Password changed successfully"); - // // expect(successMessage).toBeInTheDocument(); - // // Check if the form is reset - // - // }); - // - // expect(currentPasswordInput).toHaveValue(''); - // expect(newPasswordInput).toHaveValue(''); - // expect(confirmPasswordInput).toHaveValue(''); - // - // - // - // // Restore the original requestServer function - // global.requestServer = originalRequestServer; - // }); + it('Should request to api and resetform in success response', async () => { + // Render the component + render(); + + // Fill in the form fields + const currentPasswordInput = screen.queryByLabelText('رمز عبور فعلی'); + const newPasswordInput = screen.queryByLabelText('رمز عبور جدید'); + const confirmPasswordInput = screen.queryByLabelText('تکرار رمز عبور جدید'); + + fireEvent.change(currentPasswordInput, { target: { value: 'Witel@fani0' } }); + fireEvent.change(newPasswordInput, { target: { value: 'Witel@fani1' } }); + fireEvent.change(confirmPasswordInput, { target: { value: 'Witel@fani1' } }); + + // Submit the form + const submitButton = screen.getByRole('button', { name: 'ثبت' }); + await userEvent.click(submitButton); + + await waitFor(() => { + expect(currentPasswordInput).toHaveValue(''); + expect(newPasswordInput).toHaveValue(''); + expect(confirmPasswordInput).toHaveValue(''); + }); + }); + it('Should request to api and not resetform in error response', async () => { + // Render the component + render(); + server.use([rest.get(SET_USER_PASSWORD, (req, res, ctx) => { + return res(ctx.status(422)) + })]) + + // Fill in the form fields wrong + const currentPasswordInput = screen.queryByLabelText('رمز عبور فعلی'); + const newPasswordInput = screen.queryByLabelText('رمز عبور جدید'); + const confirmPasswordInput = screen.queryByLabelText('تکرار رمز عبور جدید'); + + fireEvent.change(currentPasswordInput, { target: { value: 'incorrect' } }); + fireEvent.change(newPasswordInput, { target: { value: 'Witel@fani1' } }); + fireEvent.change(confirmPasswordInput, { target: { value: 'Witel@fani1' } }); + + // Submit the form + const submitButton = screen.getByRole('button', { name: 'ثبت' }); + await userEvent.click(submitButton); + + await waitFor(() => { + expect(currentPasswordInput.value).toBe('incorrect'); + expect(newPasswordInput.value).toBe('Witel@fani1'); + expect(confirmPasswordInput.value).toBe('Witel@fani1'); + }); + }); }); }) \ No newline at end of file diff --git a/src/core/data/apiRoutes.js b/src/core/data/apiRoutes.js index 06dd4e9..4d2d8c0 100644 --- a/src/core/data/apiRoutes.js +++ b/src/core/data/apiRoutes.js @@ -5,7 +5,7 @@ export const GET_USER_TOKEN = BASE_URL + "/dashboard/login"; //end login //change password -export const SET_USER_PASSWORD = BASE_URL + "/dashboard/profile/change_password"; +export const SET_USER_PASSWORD = BASE_URL + "/api/profile/change_password"; //end change password //user data