test(wave208): 密码哈希与验证模块单测 +50测 #1175

Merged
xiaoxia merged 2 commits from test/wave208-password-auth into develop 2026-07-30 01:13:58 +08:00
Owner

变更内容

覆盖密码认证相关3个模块,共50测:

PasswordValidator(24测)

  • 基础验证: 有效密码/空密码/None处理
  • 长度校验: 过短/刚好达标/自定义最小长度
  • 大小写校验: 无大写/无小写/禁用要求
  • 数字校验: 无数字/禁用要求
  • 特殊字符校验: 非必须场景/必须场景/28种特殊字符全验证
  • 边界: 全部禁用仅长度/空密码特殊处理

PasswordHasher(18测)

  • 哈希生成: 返回字符串/bcrypt前缀/rounds格式/不同salt/空密码异常/unicode/长密码
  • 密码验证: 正确/错误/空密码/空哈希/无效格式/None哈希/unicode
  • needs_rehash: 相同rounds/低转高/高转低/无效格式/空哈希
  • 初始化边界: rounds<4报错/rounds>31报错/最小最大值

PasswordHandler(8测)

  • 哈希验证往返/needs_rehash/强度验证/空密码异常
  • 全局实例: get返回实例/configure配置生效

测试统计

  • 新增测试: 50个
  • 本地验证: pytest全绿 + black + ruff通过
## 变更内容 覆盖密码认证相关3个模块,共50测: ### PasswordValidator(24测) - 基础验证: 有效密码/空密码/None处理 - 长度校验: 过短/刚好达标/自定义最小长度 - 大小写校验: 无大写/无小写/禁用要求 - 数字校验: 无数字/禁用要求 - 特殊字符校验: 非必须场景/必须场景/28种特殊字符全验证 - 边界: 全部禁用仅长度/空密码特殊处理 ### PasswordHasher(18测) - 哈希生成: 返回字符串/bcrypt前缀/rounds格式/不同salt/空密码异常/unicode/长密码 - 密码验证: 正确/错误/空密码/空哈希/无效格式/None哈希/unicode - needs_rehash: 相同rounds/低转高/高转低/无效格式/空哈希 - 初始化边界: rounds<4报错/rounds>31报错/最小最大值 ### PasswordHandler(8测) - 哈希验证往返/needs_rehash/强度验证/空密码异常 - 全局实例: get返回实例/configure配置生效 ## 测试统计 - 新增测试: 50个 - 本地验证: pytest全绿 + black + ruff通过

🚀 预览环境已部署

项目 详情
PR号 #1175
预览链接 https://pr-1175.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1175 | | 预览链接 | [https://pr-1175.preview.xiaoxiajianji.com](https://pr-1175.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia added 1 commit 2026-07-30 00:43:15 +08:00
test(wave208): 密码哈希与验证模块单测 +50测
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 17s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m25s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m22s
CI/CD Pipeline / Validate - Code Quality (pull_request) Has been cancelled
CI/CD Pipeline / Unit Tests (pull_request) Has been cancelled
CI/CD Pipeline / Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / Frontend Lint (pull_request) Has been cancelled
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been cancelled
CI/CD Pipeline / PR Build API Image (pull_request) Has been cancelled
CI/CD Pipeline / PR Build Web Image (pull_request) Has been cancelled
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been cancelled
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been cancelled
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
AI Code Review / AI Code Review (pull_request) Has been cancelled
PR Automation / Auto Approve on CI Green (pull_request) Has been cancelled
PR Automation / Auto Merge on CI Green + Approved (pull_request) Has been cancelled
Preview Deploy / Deploy Preview Environment (pull_request) Has been cancelled
5eb1213041
- PasswordValidator: 24测(长度/大小写/数字/特殊字符/各种配置组合)
- PasswordHasher: 18测(哈希/验证/needs_rehash/rounds边界)
- PasswordHandler: 8测(委托层/全局实例配置)
xiaoxia force-pushed test/wave208-password-auth from 996cce3ae9 to 5eb1213041 2026-07-30 00:43:15 +08:00 Compare
auto-approve-bot added 1 commit 2026-07-30 00:46:37 +08:00
style: auto-format with black + isort + prettier [skip ci-format-check]
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 44s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m30s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m22s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 54s
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m17s
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 1m53s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m39s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m28s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m28s
AI Code Review / AI Code Review (pull_request) Successful in 3m56s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 2m57s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m51s
CI/CD Pipeline / CI Gate (pull_request) Successful in 6s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Has been cancelled
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 12s
70c8bb7022
Collaborator

【阻塞级判定】

  • 是否存在阻塞级问题:否
  • 阻塞级问题数量:0 个

📊 审查概览

  • 整体评价:通过
  • 建议级问题数量:1 个

🔴 阻塞级问题(必须修复)

💡 改进建议(不阻塞合并)

  1. [tests/unit/test_password_auth.py: 252] 避免直接修改模块私有变量
    • 具体内容:在 test_get_password_handler_returns_instance 测试中,代码直接导入了 password_handler 模块并设置了 ph._default_handler = None。这种做法破坏了封装性,使得测试代码强依赖于被测模块的私有实现细节(变量名 _default_handler)。如果未来重构 password_handler 内部变量名,该测试将直接失败。
    • 修改建议:推荐使用 pytestmonkeypatch fixture 来模拟或修改模块状态,或者确保 password_handler 模块暴露了一个公开的 reset() 方法供测试环境使用。例如:
      def test_get_password_handler_returns_instance(self, monkeypatch):
          # 使用 monkeypatch 修改私有变量,更符合测试规范
          import packages.application.auth.password_handler as ph
          monkeypatch.setattr(ph, '_default_handler', None)
          handler = get_password_handler()
          assert isinstance(handler, PasswordHandler)
      

良好实践

  • 测试覆盖全面:测试用例覆盖了正常流程、边界条件(如空密码、None值、超长密码)、异常情况(无效哈希格式)以及各种配置组合,体现了高质量的测试设计。
  • 性能优化意识:在 TestPasswordHasher 的 fixture 中显式设置 rounds=4 以加速测试运行,同时注释说明了原因,这是单元测试中的良好实践。
  • 清晰的测试结构:使用了嵌套的 class 结构(如 TestMinLength, TestUppercase)将不同维度的测试分组,提高了代码的可读性和可维护性。
  • 安全性测试:包含了对 Unicode 密码和特殊字符的测试,确保了密码处理模块的国际化字符支持能力。

🤖 由 AI 代码审查机器人自动生成 | 2026-07-29 16:51:26 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:否 - 阻塞级问题数量:0 个 ### 📊 审查概览 - 整体评价:通过 - 建议级问题数量:1 个 ### 🔴 阻塞级问题(必须修复) 无 ### 💡 改进建议(不阻塞合并) 1. **[tests/unit/test_password_auth.py: 252] 避免直接修改模块私有变量** - 具体内容:在 `test_get_password_handler_returns_instance` 测试中,代码直接导入了 `password_handler` 模块并设置了 `ph._default_handler = None`。这种做法破坏了封装性,使得测试代码强依赖于被测模块的私有实现细节(变量名 `_default_handler`)。如果未来重构 `password_handler` 内部变量名,该测试将直接失败。 - 修改建议:推荐使用 `pytest` 的 `monkeypatch` fixture 来模拟或修改模块状态,或者确保 `password_handler` 模块暴露了一个公开的 `reset()` 方法供测试环境使用。例如: ```python def test_get_password_handler_returns_instance(self, monkeypatch): # 使用 monkeypatch 修改私有变量,更符合测试规范 import packages.application.auth.password_handler as ph monkeypatch.setattr(ph, '_default_handler', None) handler = get_password_handler() assert isinstance(handler, PasswordHandler) ``` ### ✅ 良好实践 - **测试覆盖全面**:测试用例覆盖了正常流程、边界条件(如空密码、None值、超长密码)、异常情况(无效哈希格式)以及各种配置组合,体现了高质量的测试设计。 - **性能优化意识**:在 `TestPasswordHasher` 的 fixture 中显式设置 `rounds=4` 以加速测试运行,同时注释说明了原因,这是单元测试中的良好实践。 - **清晰的测试结构**:使用了嵌套的 `class` 结构(如 `TestMinLength`, `TestUppercase`)将不同维度的测试分组,提高了代码的可读性和可维护性。 - **安全性测试**:包含了对 Unicode 密码和特殊字符的测试,确保了密码处理模块的国际化字符支持能力。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-29 16:51:26 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia reviewed 2026-07-30 01:13:14 +08:00
xiaoxia left a comment
Author
Owner

LGTM

LGTM
xiaoxia merged commit 2273fb329f into develop 2026-07-30 01:13:58 +08:00

🗑️ 预览环境已清理

PR #1175 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #1175 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.