test_password_policy.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. """密码复杂度策略纯逻辑测试(不连接数据库)。"""
  2. from __future__ import annotations
  3. import pytest
  4. from dms.security.passwords import validate_password_policy
  5. def test_strong_passwords_with_three_or_more_classes_pass():
  6. validate_password_policy("Initial@2026") # 四类
  7. validate_password_policy("Password123") # 三类(大写/小写/数字)
  8. validate_password_policy("password123!") # 三类(小写/数字/特殊)
  9. validate_password_policy("ABcd!@#$") # 三类(大写/小写/特殊)
  10. def test_length_bounds_enforced():
  11. with pytest.raises(ValueError, match="密码长度"):
  12. validate_password_policy("Ab1!x") # 过短(5字符)
  13. with pytest.raises(ValueError, match="密码长度"):
  14. validate_password_policy("Aa1!" * 20) # 过长(80字符)
  15. def test_only_short_password_rejected_by_length():
  16. with pytest.raises(ValueError, match="密码长度"):
  17. validate_password_policy("Ab1!") # 4字符,长度先于复杂度失败
  18. def test_two_classes_rejected():
  19. with pytest.raises(ValueError, match="至少三类"):
  20. validate_password_policy("password123") # 仅小写+数字
  21. with pytest.raises(ValueError, match="至少三类"):
  22. validate_password_policy("PASSWORD123") # 仅大写+数字
  23. with pytest.raises(ValueError, match="至少三类"):
  24. validate_password_policy("abcdefgh") # 仅小写
  25. with pytest.raises(ValueError, match="至少三类"):
  26. validate_password_policy("AbcdEfgh") # 仅大小写两类
  27. def test_exact_boundary_lengths_accepted():
  28. validate_password_policy("Aa1!bcde") # 恰8字符,三类
  29. validate_password_policy("Aa1!" + "x" * 60) # 恰64字符,三类