diff --git a/src/common-components/tests/ThirdPartyAuthAlert.test.jsx b/src/common-components/tests/ThirdPartyAuthAlert.test.jsx
index 426a8169..1d2ff061 100644
--- a/src/common-components/tests/ThirdPartyAuthAlert.test.jsx
+++ b/src/common-components/tests/ThirdPartyAuthAlert.test.jsx
@@ -1,7 +1,7 @@
import { IntlProvider } from '@openedx/frontend-base';
import renderer from 'react-test-renderer';
-import { REGISTER_PAGE } from '../../data/constants';
+import { PENDING_STATE, REGISTER_PAGE } from '../../data/constants';
import ThirdPartyAuthAlert from '../ThirdPartyAuthAlert';
describe('ThirdPartyAuthAlert', () => {
@@ -36,4 +36,19 @@ describe('ThirdPartyAuthAlert', () => {
).toJSON();
expect(tree).toMatchSnapshot();
});
+
+ it('renders skeleton for pending third-party auth', () => {
+ props = {
+ ...props,
+ thirdPartyAuthApiStatus: PENDING_STATE,
+ isThirdPartyAuthActive: true,
+ };
+
+ const tree = renderer.create(
+
+
+ ,
+ ).toJSON();
+ expect(tree).toMatchSnapshot();
+ });
});
diff --git a/src/common-components/tests/__snapshots__/ThirdPartyAuthAlert.test.jsx.snap b/src/common-components/tests/__snapshots__/ThirdPartyAuthAlert.test.jsx.snap
index b24d3d21..21925c8a 100644
--- a/src/common-components/tests/__snapshots__/ThirdPartyAuthAlert.test.jsx.snap
+++ b/src/common-components/tests/__snapshots__/ThirdPartyAuthAlert.test.jsx.snap
@@ -1,5 +1,25 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
+exports[`ThirdPartyAuthAlert renders skeleton for pending third-party auth 1`] = `
+
+
+
+
+ You have successfully signed into Google, but your Google account does not have a linked Test Site account. To link your accounts, sign in now using your Test Site password.
+
+
+
+
+`;
+
exports[`ThirdPartyAuthAlert should match login page third party auth alert message snapshot 1`] = `
{
);
});
+ it('should validate for full name length', () => {
+ const longName = `
+ 5cnx16mn7qTSbtiha1W473ZtV5prGBCEtNrfLkqizJirf
+ v5kbzBpLRbdh7FY5qujb8viQ9zPziE1fWnbFu5tj4FXaY5GDESvVwjQkE
+ txUPE3r9mk4HYcSfXVJPWAWRuK2LJZycZWDm0BMFLZ63YdyQAZhjyvjn7
+ SCqKjSHDx7mgwFp35PF4CxwtwNLxY11eqf5F88wQ9k2JQ9U8uKSFyTKCM
+ A456CGA5KjUugYdT1qKdvvnXtaQr8WA87m9jpe16
+ `;
+ const { container } = render(routerWrapper(reduxWrapper()));
+ const nameInput = container.querySelector('input#name');
+ fireEvent.blur(nameInput, { target: { value: longName, name: 'name' } });
+
+ expect(props.handleErrorChange).toHaveBeenCalledTimes(1);
+ expect(props.handleErrorChange).toHaveBeenCalledWith(
+ 'name',
+ messages['name.validation.length.message'].defaultMessage.replace('{limit}', MAX_FULL_NAME_LENGTH),
+ );
+ });
+
it('should clear error on focus', () => {
const { container } = render(routerWrapper(reduxWrapper()));
diff --git a/src/register/RegistrationFields/NameField/validator.js b/src/register/RegistrationFields/NameField/validator.js
index aefaedfb..cb4c2522 100644
--- a/src/register/RegistrationFields/NameField/validator.js
+++ b/src/register/RegistrationFields/NameField/validator.js
@@ -9,12 +9,16 @@ export const HTML_REGEX = /<|>/u;
// regex from backend
export const INVALID_NAME_REGEX = /https?:\/\/(?:[-\w.]|(?:%[\da-fA-F]{2}))*/g;
+export const MAX_FULL_NAME_LENGTH = 255;
+
const validateName = (value, formatMessage) => {
let fieldError = '';
if (!value.trim()) {
fieldError = formatMessage(messages['empty.name.field.error']);
} else if (URL_REGEX.test(value) || HTML_REGEX.test(value) || INVALID_NAME_REGEX.test(value)) {
fieldError = formatMessage(messages['name.validation.message']);
+ } else if (value && value.length > MAX_FULL_NAME_LENGTH) {
+ fieldError = formatMessage(messages['name.validation.length.message'], { limit: MAX_FULL_NAME_LENGTH });
}
return fieldError;
};
diff --git a/src/register/messages.jsx b/src/register/messages.jsx
index 4a9355ac..f6c4e275 100644
--- a/src/register/messages.jsx
+++ b/src/register/messages.jsx
@@ -126,6 +126,11 @@ const messages = defineMessages({
defaultMessage: 'Enter a valid name',
description: 'Validation message that appears when fullname contain URL',
},
+ 'name.validation.length.message': {
+ id: 'registration.name.validation.length.message',
+ defaultMessage: 'Full name cannot be longer than {limit} characters',
+ description: 'Validation message that appears when the full name exceeds the character limit',
+ },
'password.validation.message': {
id: 'password.validation.message',
defaultMessage: 'Password criteria has not been met',