From 3672528a521cad2683fe3659e0de2a28c3534f4e Mon Sep 17 00:00:00 2001 From: Mohsen Zamani Date: Wed, 28 Jan 2026 13:48:24 +0000 Subject: [PATCH] Complete sprint-3-stretch --- Sprint-3/4-stretch/card-validator.js | 30 ++++++++ Sprint-3/4-stretch/password-validator.js | 12 +++- Sprint-3/4-stretch/password-validator.test.js | 69 ++++++++++++++++--- 3 files changed, 100 insertions(+), 11 deletions(-) create mode 100644 Sprint-3/4-stretch/card-validator.js diff --git a/Sprint-3/4-stretch/card-validator.js b/Sprint-3/4-stretch/card-validator.js new file mode 100644 index 000000000..27e6a8db5 --- /dev/null +++ b/Sprint-3/4-stretch/card-validator.js @@ -0,0 +1,30 @@ +function creditCardValidator(cardNum) { + // Splits the cardNum into an array of characters + const cardNumArray = cardNum.split(""); + + // Checks if length is 16, otherwise return false + if (cardNumArray.length !== 16) return false; + + // checks if all digits are numbers + if ( + !cardNumArray.every( + (num) => num.charCodeAt(0) >= 48 && num.charCodeAt(0) <= 57 + ) + ) + return false; + + // Checks if there are at least two different digits + const count = cardNumArray.reduce((acc, curr) => { + acc[curr] = acc[curr] ? acc[curr] + 1 : 1; + return acc; + }, {}); + if (Object.keys(count).length < 2) return false; + + // Checks if the sum of all digits is greater than 16 + const sumOfDigits = cardNumArray.reduce((acc, curr) => acc + Number(curr), 0); + if (sumOfDigits <= 16) return false; + + //checks if last digit is even + if (cardNumArray[cardNumArray.length - 1] % 2 !== 0) return false; + return true; +} diff --git a/Sprint-3/4-stretch/password-validator.js b/Sprint-3/4-stretch/password-validator.js index b55d527db..c5862420c 100644 --- a/Sprint-3/4-stretch/password-validator.js +++ b/Sprint-3/4-stretch/password-validator.js @@ -1,6 +1,12 @@ +const previousPasswords = ["5B43n21"]; function passwordValidator(password) { - return password.length < 5 ? false : true -} + if (password.length < 5) return false; + if (previousPasswords.includes(password)) return false; + previousPasswords.push(password); + + const rules = [/[A-Z]/, /[a-z]/, /[0-9]/, /[!#$%.*&]/]; + return rules.every((rule) => rule.test(password)); +} -module.exports = passwordValidator; \ No newline at end of file +module.exports = passwordValidator; diff --git a/Sprint-3/4-stretch/password-validator.test.js b/Sprint-3/4-stretch/password-validator.test.js index 8fa3089d6..7fc179591 100644 --- a/Sprint-3/4-stretch/password-validator.test.js +++ b/Sprint-3/4-stretch/password-validator.test.js @@ -16,11 +16,64 @@ You must breakdown this problem in order to solve it. Find one test case first a */ const isValidPassword = require("./password-validator"); test("password has at least 5 characters", () => { - // Arrange - const password = "12345"; - // Act - const result = isValidPassword(password); - // Assert - expect(result).toEqual(true); -} -); \ No newline at end of file + // Arrange + const password = "A1b2"; + // Act + const result = isValidPassword(password); + // Assert + expect(result).toEqual(false); +}); + +test("password is not previously used", () => { + // Arrange + const password = "5B43n21"; + // Act + const result = isValidPassword(password); + // Assert + expect(result).toEqual(false); +}); + +test("password contains at least one uppercase English letter", () => { + // Arrange + const password = "1a2345"; + // Act + const result = isValidPassword(password); + // Assert + expect(result).toEqual(false); +}); + +test("password contains at least one uppercase English letter", () => { + // Arrange + const password = "1B2345"; + // Act + const result = isValidPassword(password); + // Assert + expect(result).toEqual(false); +}); + +test("password contains at least one number(0-9)", () => { + // Arrange + const password = "sdkerjJNGk"; + // Act + const result = isValidPassword(password); + // Assert + expect(result).toEqual(false); +}); + +test('password contains at least one of "!", "#", "$", "%", ".", "*", "&"', () => { + // Arrange + const password = "sdkerjJNG23k"; + // Act + const result = isValidPassword(password); + // Assert + expect(result).toEqual(false); +}); + +test("password meets all the condition for a valid password and passwordValidator returns true", () => { + // Arrange + const password = "sdkerjJNG23k&"; + // Act + const result = isValidPassword(password); + // Assert + expect(result).toEqual(true); +});