fix: 补查重 API enqueue 单测 + 修复 duplication_check 无限重试 bug #1681

Closed
xiaoxia wants to merge 2 commits from fix/dedup-coverage-and-retry-bug into develop
Owner

修复内容

1. 新增单测提升 diff 覆盖率

新增 tests/unit/test_duplication_api_enqueue.py,覆盖 #1679 新增的三处未覆盖代码:

  • test_upload_enqueue_calls_celery_task — POST /duplication/upload 成功后调用 send_task
  • test_retry_enqueue_calls_celery_task — POST /records/{id}/retry 重置后调用 send_task
  • test_repository_update_calls_session_commit — duplication_repository.update 正确调用 session.commit

2. 修复 duplication_check.py 无限重试 bug

原代码 raise self.retry(exc=e, countdown=60) from e 在 except 最外层无条件执行,即使已达到 max_retries 也会继续重试,mark_failed 逻辑永远无法触达。

修复:仅在 self.request.retries < self.max_retries 时调用 retry,超过上限直接 raise 终止。

3. 同步更新测试辅助函数

test_duplication_check_worker.py 的 _run 辅助函数增加 except Exception 捕获,兼容修复后超过重试上限时抛原始异常的行为。

## 修复内容 ### 1. 新增单测提升 diff 覆盖率 新增 `tests/unit/test_duplication_api_enqueue.py`,覆盖 #1679 新增的三处未覆盖代码: - `test_upload_enqueue_calls_celery_task` — POST /duplication/upload 成功后调用 send_task - `test_retry_enqueue_calls_celery_task` — POST /records/{id}/retry 重置后调用 send_task - `test_repository_update_calls_session_commit` — duplication_repository.update 正确调用 session.commit ### 2. 修复 duplication_check.py 无限重试 bug 原代码 `raise self.retry(exc=e, countdown=60) from e` 在 except 最外层无条件执行,即使已达到 max_retries 也会继续重试,mark_failed 逻辑永远无法触达。 修复:仅在 `self.request.retries < self.max_retries` 时调用 retry,超过上限直接 raise 终止。 ### 3. 同步更新测试辅助函数 test_duplication_check_worker.py 的 _run 辅助函数增加 `except Exception` 捕获,兼容修复后超过重试上限时抛原始异常的行为。
xiaoxia added 1 commit 2026-09-04 11:32:40 +08:00
fix: 补查重 API enqueue 单测 + 修复 duplication_check 无限重试 bug
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 2s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
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 / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 24s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 24s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Unit Tests (pull_request) Successful in 1m26s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m42s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m45s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 2m6s
CI/CD Pipeline / Validate - Style (pull_request) Failing after 2m18s
CI/CD Pipeline / Validate - Security (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 / 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
64f2f8ab3d
- 新增 test_duplication_api_enqueue.py(3 个测试):
  - 上传接口成功 enqueue celery task
  - 重试接口成功 enqueue celery task
  - repository.update 调用 session.commit
- 修复 duplication_check.py 中 retry 无条件执行导致的无限重试:
  仅在 retries < max_retries 时 retry,超限后直接 raise
- 同步更新 test_duplication_check_worker.py 的 _run 辅助函数
  以兼容新增的非 retry 异常路径

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1681 | | 预览链接 | [https://pr-1681.preview.xiaoxiajianji.com](https://pr-1681.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
auto-approve-bot added 1 commit 2026-09-04 11:35:01 +08:00
style: auto-format with black + isort + prettier [skip ci-format-check]
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
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 / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 3s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 25s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 26s
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Unit Tests (pull_request) Successful in 1m29s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m35s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m43s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 2m0s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 2m9s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m50s
AI Code Review / AI Code Review (pull_request) Successful in 3m43s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 7m24s
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 / CI Gate (pull_request) Successful in 11s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 8m8s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 16s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 26s
481f8776b8
Collaborator

代码审查结果 - PR #1681

⚠️ 问题(0个需要修改)

💡 建议(1个可选)

  1. tests/unit/test_duplication_check_worker.py Mock对象设置:在 _run 函数中,mock_self = MagicMock() 创建的对象,其 max_retries 属性默认也是一个 MagicMock。在进行 self.request.retries < self.max_retries 比较时,MagicMock 的富比较行为可能返回 True(因为 Mock 对象真值通常为 True),导致测试可能无法覆盖“超过最大重试次数”的分支。建议在 mock_self 初始化后显式设置 mock_self.max_retries = 3(或其他预期值),以确保测试逻辑的确定性和覆盖率。

格式检查通过 | 逻辑审查通过 | 性能良好


🤖 由 AI 代码审查机器人自动生成 | 2026-09-04 03:38:45 | 模型:

## 代码审查结果 - PR #1681 ### ⚠️ 问题(0个需要修改) 无 ### 💡 建议(1个可选) 1. **tests/unit/test_duplication_check_worker.py Mock对象设置**:在 `_run` 函数中,`mock_self = MagicMock()` 创建的对象,其 `max_retries` 属性默认也是一个 `MagicMock`。在进行 `self.request.retries < self.max_retries` 比较时,`MagicMock` 的富比较行为可能返回 `True`(因为 Mock 对象真值通常为 True),导致测试可能无法覆盖“超过最大重试次数”的分支。建议在 `mock_self` 初始化后显式设置 `mock_self.max_retries = 3`(或其他预期值),以确保测试逻辑的确定性和覆盖率。 --- ✅ 格式检查通过 | ✅ 逻辑审查通过 | ✅ 性能良好 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-09-04 03:38:45 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
Collaborator

Auto merge skipped after multiple 405 errors: PR may have conflicts or unresolved checks. Please review manually. This is not a CI failure.

Auto merge skipped after multiple 405 errors: PR may have conflicts or unresolved checks. Please review manually. This is not a CI failure.
xiaoxia closed this pull request 2026-09-04 11:48:46 +08:00

🗑️ 预览环境已清理

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

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

🗑️ **预览环境已清理** PR #1681 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Some checks are pending
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
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 / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 3s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 25s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 26s
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Unit Tests (pull_request) Successful in 1m29s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m35s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m43s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 2m0s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 2m9s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m50s
AI Code Review / AI Code Review (pull_request) Successful in 3m43s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 7m24s
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 / CI Gate (pull_request) Successful in 11s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 8m8s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 16s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 26s

Pull request closed

Sign in to join this conversation.