diff --git a/src/validateRegisterForm.js b/src/validateRegisterForm.js index 751cb14..b8f147b 100644 --- a/src/validateRegisterForm.js +++ b/src/validateRegisterForm.js @@ -1,40 +1,63 @@ 'use strict'; /** - * @param {string} email - * * @param {string} password - * + * @param {string} email * @returns {object} */ -function validateRegisterForm(email, password) { - // eslint-disable-next-line max-len - const validPassword = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9])(?!.*\s).{8,16}$/; +function validateRegisterForm(password, email) { + // Password regex + const n = '(?=.*\\d)'; + const l = '(?=.*[a-zA-Z\u0400-\u04FF])'; + const u = '(?=.*[A-Z\u0400-\u04FF])'; + const s = '(?=.*[^\\da-zA-Z\u0400-\u04FF])'; + const ns = '(?!.*\\s)'; + const len = '.{8,16}'; + + const pwdPattern = '^' + n + l + u + s + ns + len + '$'; + const validPassword = new RegExp(pwdPattern, 'u'); + + // Email regex (local-part + domain) + const localChars = "[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+"; + const loc = '(' + localChars + '(?:\\.' + localChars + ')*)'; + const domLabel = '[A-Za-z0-9-]+'; + const dom = '(' + domLabel + '(?:\\.' + domLabel + ')+)'; + const at = '@'; + const validEmailMask = new RegExp('^' + loc + at + dom + '$', 'i'); - // eslint-disable-next-line max-len - const validEmailMask = new RegExp(/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\./i); + const isEmailValid = validEmailMask.test(email); + const isPasswordValid = validPassword.test(password); - if (!email.match(validEmailMask) && password.match(validPassword)) { - return { - code: 422, message: 'Email is invalid.', - }; + // Extra dot rules + let emailExtraValid = true; + if (isEmailValid) { + const parts = email.split('@'); + const local = parts[0]; + const domain = parts[1]; + + const localInvalid = local.startsWith('.'); + const domainInvalid = domain.startsWith('.'); + const dotsInvalid = email.includes('..'); + + if (localInvalid || domainInvalid || dotsInvalid) { + emailExtraValid = false; + } } - if (email.match(validEmailMask) && !password.match(validPassword)) { - return { - code: 422, message: 'Password is invalid.', - }; + // Result mapping + if (!isEmailValid || !emailExtraValid) { + if (isPasswordValid) { + return { code: 422, message: 'Email is invalid.' }; + } + return { code: 500, message: 'Password and email are invalid.' }; } - if (!email.match(validEmailMask) && !password.match(validPassword)) { - return { - code: 500, message: 'Password and email are invalid.', - }; + if (!isPasswordValid) { + return { code: 422, message: 'Password is invalid.' }; } - return { - code: 200, message: 'Email and password are valid.', - }; + return { code: 200, message: 'Email and password are valid.' }; } module.exports = validateRegisterForm; + diff --git a/src/validateRegisterForm.test.js b/src/validateRegisterForm.test.js index 6d86ab9..e0a047e 100644 --- a/src/validateRegisterForm.test.js +++ b/src/validateRegisterForm.test.js @@ -8,23 +8,72 @@ describe(`Function 'validateRegisterForm':`, () => { }); it(`should return object`, () => { - expect(typeof validateRegisterForm('test@mail.com', 'P@ssword1!')) - .toBe('object'); + const pwd = 'P@ssword1!'; + const email = 'test@mail.com'; + const result = validateRegisterForm(pwd, email); + expect(typeof result).toBe('object'); }); - it(`should return success message for the valid input`, () => { - const isValid = validateRegisterForm('test@mail.com', 'P@ssword1!'); + it(`should return 200 for valid password and email`, () => { + const result = validateRegisterForm('P@ssword1!', 'test@mail.com'); + expect(result.code).toBe(200); + expect(result.message).toBe('Email and password are valid.'); + }); + + it(`should return 422 for valid email but password missing digit`, () => { + const result = validateRegisterForm('P@ssword', 'test@mail.com'); + expect(result.code).toBe(422); + expect(result.message).toBe('Password is invalid.'); + }); + + it(`should return 422 for invalid email and valid password`, () => { + const result = validateRegisterForm('P@ssword1!', 'test@com'); + expect(result.code).toBe(422); + expect(result.message).toBe('Email is invalid.'); + }); + + it(`should return 500 for invalid password and email`, () => { + const result = validateRegisterForm('ssword1', 'test@com'); + expect(result.code).toBe(500); + expect(result.message) + .toBe('Password and email are invalid.'); + }); - expect(isValid.code).toBe(200); - expect(isValid.message).toBe('Email and password are valid.'); + it(`should return 422 if password too short`, () => { + const result = validateRegisterForm('Aa1!', 'valid@mail.com'); + expect(result.code).toBe(422); + expect(result.message).toBe('Password is invalid.'); }); - it(`should return error for valid email and password without number`, () => { - const invalidPassword = validateRegisterForm('test@mail.com', 'P@ssword'); + it(`should return 422 if password too long`, () => { + const longPwd = 'A1!aaaaaaaaaaaaaaa'; + const result = validateRegisterForm(longPwd, 'valid@mail.com'); + expect(result.code).toBe(422); + expect(result.message).toBe('Password is invalid.'); + }); + + it(`should return 422 if email missing '@' symbol`, () => { + const result = validateRegisterForm('P@ssword1!', 'invalidmail.com'); + expect(result.code).toBe(422); + expect(result.message).toBe('Email is invalid.'); + }); - expect(invalidPassword.code).toBe(422); - expect(invalidPassword.message).toBe('Password is invalid.'); + it(`should return 422 if email starts with dot`, () => { + const result = validateRegisterForm('P@ssword1!', '.test@mail.com'); + expect(result.code).toBe(422); + expect(result.message).toBe('Email is invalid.'); }); - // write more tests here + it(`should return 422 if email has double dots`, () => { + const result = validateRegisterForm('P@ssword1!', 'test..mail@mail.com'); + expect(result.code).toBe(422); + expect(result.message).toBe('Email is invalid.'); + }); + + it(`should return 422 if top-level domain starts with dot`, () => { + const result = validateRegisterForm('P@ssword1!', 'test@mail..com'); + expect(result.code).toBe(422); + expect(result.message).toBe('Email is invalid.'); + }); }); +