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 @@
-
-
-
-
+ {{ $tr('forgotPasswordFailed') }}
+
+
-
-
+
+
@@ -35,29 +40,50 @@