From 34e66de8b35d89616daaef3edd888b2667829c38 Mon Sep 17 00:00:00 2001 From: Adrian Bonpin Date: Wed, 27 May 2026 02:42:34 +0800 Subject: [PATCH] test: add password strength tests (Task 2) --- lib/auth/__tests__/password-strength.test.ts | 63 ++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 lib/auth/__tests__/password-strength.test.ts diff --git a/lib/auth/__tests__/password-strength.test.ts b/lib/auth/__tests__/password-strength.test.ts new file mode 100644 index 0000000..edb20cd --- /dev/null +++ b/lib/auth/__tests__/password-strength.test.ts @@ -0,0 +1,63 @@ +import { describe, it, expect } from "vitest" +import { checkPasswordStrength } from "../password-strength" + +describe("checkPasswordStrength", () => { + it("returns weak (score 0) for empty string", () => { + const result = checkPasswordStrength("") + expect(result.level).toBe("weak") + expect(result.score).toBe(0) + expect(result.feedback).toContain("Enter a password") + }) + + it("returns fair for 'password' (common pattern penalty)", () => { + const result = checkPasswordStrength("password") + expect(result.level).toBe("fair") + expect(result.feedback).toContain("Avoid common passwords") + }) + + it("returns fair for short password with only letters", () => { + const result = checkPasswordStrength("abc") + expect(result.level).toBe("fair") + }) + + it("returns good for 10-char lowercase-only password", () => { + const result = checkPasswordStrength("abcdefghij") + expect(result.level).toBe("good") + }) + + it("returns good for 10-char mixed case + numbers", () => { + const result = checkPasswordStrength("AbcDef1234") + expect(["good", "strong", "excellent"]).toContain(result.level) + }) + + it("returns strong for 14-char with all character types", () => { + const result = checkPasswordStrength("MyP@ssw0rd!2024") + expect(["strong", "excellent"]).toContain(result.level) + }) + + it("returns excellent for 18+ char complex password", () => { + const result = checkPasswordStrength("C0mpl3x!P@ssw0rd#2024") + expect(result.level).toBe("excellent") + }) + + it("flags repeated characters", () => { + const result = checkPasswordStrength("aaaBBB111@@@") + expect(result.feedback).toContain("Avoid repeated characters") + }) + + it("flags common patterns like 'letmein'", () => { + const result = checkPasswordStrength("letmein1234") + expect(result.feedback).toContain("Avoid common passwords") + }) + + it("gives positive feedback for excellent passwords", () => { + const result = checkPasswordStrength("Tr0ub4dor&3X7r3m3ly!") + expect(result.feedback).toContain("Great password!") + }) + + it("handles unicode characters", () => { + const result = checkPasswordStrength("パスワード1234Abc!") + expect(result.level).toBeDefined() + expect(result.score).toBeGreaterThan(0) + }) +}) \ No newline at end of file