diff --git a/contentcuration/contentcuration/frontend/accounts/pages/__tests__/forgotPassword.spec.js b/contentcuration/contentcuration/frontend/accounts/pages/__tests__/forgotPassword.spec.js index ca34fa905f..18a2a195b2 100644 --- a/contentcuration/contentcuration/frontend/accounts/pages/__tests__/forgotPassword.spec.js +++ b/contentcuration/contentcuration/frontend/accounts/pages/__tests__/forgotPassword.spec.js @@ -1,6 +1,7 @@ import { render, screen, fireEvent, waitFor } from '@testing-library/vue'; import VueRouter from 'vue-router'; import ForgotPassword from '../resetPassword/ForgotPassword'; +import commonStrings from 'shared/translator'; const sendPasswordResetLinkMock = jest.fn(() => Promise.resolve()); @@ -40,11 +41,17 @@ describe('ForgotPassword', () => { expect(screen.getByText('Reset your password')).toBeInTheDocument(); expect(screen.getByLabelText('Email')).toBeInTheDocument(); expect(screen.getByRole('button', { name: 'Submit' })).toBeInTheDocument(); + expect(screen.queryByTestId('error-banner')).not.toBeInTheDocument(); }); it('should not submit form with empty email', async () => { renderComponent(); await fireEvent.click(screen.getByRole('button', { name: 'Submit' })); + await waitFor(() => { + expect(screen.getByTestId('email-field')).toHaveTextContent( + commonStrings.$tr('fieldRequired'), + ); + }); expect(sendPasswordResetLinkMock).not.toHaveBeenCalled(); }); @@ -52,9 +59,34 @@ describe('ForgotPassword', () => { renderComponent(); await fireEvent.update(screen.getByLabelText(/email/i), 'invalid-email'); await fireEvent.click(screen.getByRole('button', { name: 'Submit' })); + await waitFor(() => { + expect(screen.getByTestId('email-field')).toHaveTextContent( + ForgotPassword.$trs.emailValidationMessage, + ); + }); expect(sendPasswordResetLinkMock).not.toHaveBeenCalled(); }); + it('should not show validation error while typing', async () => { + renderComponent(); + await fireEvent.update(screen.getByLabelText(/email/i), 'invalid-email'); + expect(screen.getByTestId('email-field')).not.toHaveTextContent( + ForgotPassword.$trs.emailValidationMessage, + ); + }); + + it('should show validation error on blur', async () => { + renderComponent(); + const emailInput = screen.getByLabelText(/email/i); + await fireEvent.update(emailInput, 'invalid-email'); + await fireEvent.blur(emailInput); + await waitFor(() => { + expect(screen.getByTestId('email-field')).toHaveTextContent( + ForgotPassword.$trs.emailValidationMessage, + ); + }); + }); + it('should submit form with valid email and navigate to success page', async () => { sendPasswordResetLinkMock.mockResolvedValue({}); const { router } = renderComponent(); @@ -74,6 +106,8 @@ describe('ForgotPassword', () => { renderComponent(); await fireEvent.update(screen.getByLabelText(/email/i), 'test@test.com'); await fireEvent.click(screen.getByRole('button', { name: 'Submit' })); - expect(await screen.findByTestId('error-banner')).toBeInTheDocument(); + expect(await screen.findByTestId('error-banner')).toHaveTextContent( + ForgotPassword.$trs.forgotPasswordFailed, + ); }); }); diff --git a/contentcuration/contentcuration/frontend/accounts/pages/resetPassword/ForgotPassword.vue b/contentcuration/contentcuration/frontend/accounts/pages/resetPassword/ForgotPassword.vue index c6581cd722..1c2cce67be 100644 --- a/contentcuration/contentcuration/frontend/accounts/pages/resetPassword/ForgotPassword.vue +++ b/contentcuration/contentcuration/frontend/accounts/pages/resetPassword/ForgotPassword.vue @@ -1,24 +1,29 @@ @@ -35,29 +40,50 @@