test(wave98): 31 unit tests for preset_bgm domain module #961

Closed
xiaoxia wants to merge 0 commits from test/wave98-preset-bgm into develop
Owner

变更内容

  • 新增 31 个单元测试,覆盖 preset_bgm.py 纯逻辑
  • 覆盖 PresetBGM 数据类、预设库清单、风格字典、查询函数

测试分布

  • PresetBGM 数据类 (7 tests): 构造 / frozen 不可变 / 相等性 / list字段不可哈希
  • 预设库完整性 (6 tests): 非空 / ID唯一 / 风格合法 / 时长正数
  • BGM_STYLES (2 tests): 6种风格键 + 中文名
  • get_preset_bgm (4 tests): 存在 / 不存在 / 空字符串 / 同一实例
  • list_preset_bgm_by_style (6 tests): 4种风格 + 空风格 + 顺序保持
  • search_preset_bgm (8 tests): 按名称/描述/标签搜索 + 大小写不敏感 + 空关键词 + 去重

测试结果

本地 31 passed

## 变更内容 - 新增 31 个单元测试,覆盖 preset_bgm.py 纯逻辑 - 覆盖 PresetBGM 数据类、预设库清单、风格字典、查询函数 ## 测试分布 - **PresetBGM 数据类 (7 tests)**: 构造 / frozen 不可变 / 相等性 / list字段不可哈希 - **预设库完整性 (6 tests)**: 非空 / ID唯一 / 风格合法 / 时长正数 - **BGM_STYLES (2 tests)**: 6种风格键 + 中文名 - **get_preset_bgm (4 tests)**: 存在 / 不存在 / 空字符串 / 同一实例 - **list_preset_bgm_by_style (6 tests)**: 4种风格 + 空风格 + 顺序保持 - **search_preset_bgm (8 tests)**: 按名称/描述/标签搜索 + 大小写不敏感 + 空关键词 + 去重 ## 测试结果 本地 31 passed
xiaoxia force-pushed test/wave98-preset-bgm from 20c0a5f519 to d57a0e7738 2026-07-26 20:12:12 +08:00 Compare

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #961 | | 预览链接 | [https://pr-961.preview.xiaoxiajianji.com](https://pr-961.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
Collaborator

📊 审查概览

  • 整体评价:需修改
  • 严重问题数量:2 个
  • 一般建议数量:1 个

需修改的问题(严重)

  1. [packages/domain/media_validation.py: 87] safe_parse_fps 函数对 None 输入缺乏容错

    • 问题描述:函数内部直接使用 if "/" in fps_str: 进行判断。当传入的 fps_strNone(例如 ffprobe 未返回该字段导致 metadata.get 返回 None)时,会引发 TypeError,导致 Worker 任务崩溃。虽然函数名包含 safe 且捕获了 ValueError,但未覆盖 TypeError
    • 修改建议:在函数入口处增加非空检查,例如:
      if not fps_str:
          return 0.0
      
  2. [packages/domain/media_validation.py: 101] is_valid_media 函数类型转换不安全

    • 问题描述:代码直接使用 int()float() 强制转换元数据值(如 size = int(metadata.get("size_bytes", 0)))。如果 ffprobe 返回的元数据中包含非数字字符串(如 "N/A"),或者值为 None 且未设置默认值(虽然代码中设置了默认值,但如果元数据被篡改或格式异常),将导致 ValueErrorTypeError。作为校验函数,应当对脏数据具有防御性,返回 False 而非抛出异常。
    • 修改建议:封装一个安全的类型转换辅助函数,或者在转换时使用 try-except 块,捕获异常后返回 False

💡 改进建议(一般)

  1. [packages/domain/media_validation.py: 110] 非白名单编码的日志记录移除
    • 具体内容:在旧代码中,检测到非白名单视频编码时会记录 logger.info。重构后的代码(第 110-113 行)将此逻辑替换为 pass,注释称“调用方负责日志”。请务必确认调用方(ingest_asset)已同步更新逻辑来记录此类情况,否则会导致系统对非标准编码格式的上传失去监控可见性。

良好实践

  • 常量优化:将 SUPPORTED_VIDEO_CODECSset 改为 frozenset,利用不可变性提升安全性和哈希性能。
  • 代码重构:将媒体校验逻辑从 Worker 任务中剥离到 packages.domain,符合领域驱动设计(DDD)原则,提升了代码的可测试性和复用性。
  • 测试覆盖:新增了单元测试文件,覆盖了 Domain Entities 和 Media Validation 逻辑,有助于保障重构后的正确性。

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

### 📊 审查概览 - **整体评价**:需修改 - **严重问题数量**:2 个 - **一般建议数量**:1 个 ### ❌ 需修改的问题(严重) 1. **[packages/domain/media_validation.py: 87] `safe_parse_fps` 函数对 None 输入缺乏容错** - **问题描述**:函数内部直接使用 `if "/" in fps_str:` 进行判断。当传入的 `fps_str` 为 `None`(例如 `ffprobe` 未返回该字段导致 `metadata.get` 返回 `None`)时,会引发 `TypeError`,导致 Worker 任务崩溃。虽然函数名包含 `safe` 且捕获了 `ValueError`,但未覆盖 `TypeError`。 - **修改建议**:在函数入口处增加非空检查,例如: ```python if not fps_str: return 0.0 ``` 2. **[packages/domain/media_validation.py: 101] `is_valid_media` 函数类型转换不安全** - **问题描述**:代码直接使用 `int()` 和 `float()` 强制转换元数据值(如 `size = int(metadata.get("size_bytes", 0))`)。如果 `ffprobe` 返回的元数据中包含非数字字符串(如 `"N/A"`),或者值为 `None` 且未设置默认值(虽然代码中设置了默认值,但如果元数据被篡改或格式异常),将导致 `ValueError` 或 `TypeError`。作为校验函数,应当对脏数据具有防御性,返回 `False` 而非抛出异常。 - **修改建议**:封装一个安全的类型转换辅助函数,或者在转换时使用 `try-except` 块,捕获异常后返回 `False`。 ### 💡 改进建议(一般) 1. **[packages/domain/media_validation.py: 110] 非白名单编码的日志记录移除** - **具体内容**:在旧代码中,检测到非白名单视频编码时会记录 `logger.info`。重构后的代码(第 110-113 行)将此逻辑替换为 `pass`,注释称“调用方负责日志”。请务必确认调用方(`ingest_asset`)已同步更新逻辑来记录此类情况,否则会导致系统对非标准编码格式的上传失去监控可见性。 ### ✅ 良好实践 - **常量优化**:将 `SUPPORTED_VIDEO_CODECS` 从 `set` 改为 `frozenset`,利用不可变性提升安全性和哈希性能。 - **代码重构**:将媒体校验逻辑从 Worker 任务中剥离到 `packages.domain`,符合领域驱动设计(DDD)原则,提升了代码的可测试性和复用性。 - **测试覆盖**:新增了单元测试文件,覆盖了 Domain Entities 和 Media Validation 逻辑,有助于保障重构后的正确性。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-26 12:26:45 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia force-pushed test/wave98-preset-bgm from d57a0e7738 to 5289e427e2 2026-07-27 19:01:01 +08:00 Compare
xiaoxia closed this pull request 2026-07-27 19:49:03 +08:00

🗑️ 预览环境已清理

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

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

🗑️ **预览环境已清理** PR #961 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Some checks are pending
CI/CD Pipeline / Check if frontend-only change (push) Has been cancelled
CI/CD Pipeline / Validate - Code Quality (push) Has been cancelled
CI/CD Pipeline / Validate - Type Check (mypy) (push) Has been cancelled
CI/CD Pipeline / Validate - Migration (alembic) (push) Has been cancelled
CI/CD Pipeline / Unit Tests (push) Has been cancelled
CI/CD Pipeline / Integration Tests (push) Has been cancelled
CI/CD Pipeline / Frontend Lint (push) Has been cancelled
CI/CD Pipeline / Frontend Unit Tests (push) Has been cancelled
CI/CD Pipeline / PR Build API Image (push) Has been cancelled
CI/CD Pipeline / PR Build Web Image (push) Has been cancelled
CI/CD Pipeline / PR Build Worker Image (push) Has been cancelled
CI/CD Pipeline / Build Staging API Image (push) Has been cancelled
CI/CD Pipeline / Build Staging Web Image (push) Has been cancelled
CI/CD Pipeline / Build Staging Worker Image (push) Has been cancelled
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Has been cancelled
CI/CD Pipeline / Staging E2E Tests (push) Has been cancelled
CI/CD Pipeline / Staging API Integration Tests (push) Has been cancelled
CI/CD Pipeline / Build Production API Image (push) Has been cancelled
CI/CD Pipeline / Build Production Web Image (push) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (push) Has been cancelled
CI/CD Pipeline / Deploy Production (push) Has been cancelled
CI/CD Pipeline / Production Browser E2E (push) Has been cancelled
CI/CD Pipeline / ACR Image Cleanup (push) Has been cancelled
CI/CD Pipeline / Canary Release to Production (push) Has been cancelled
CI/CD Pipeline / CI Gate (push) Has been cancelled
AI Code Review / AI Code Review (pull_request) Failing after 0s
PR Automation / Auto Approve on CI Green (pull_request) Failing after 0s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Failing after 0s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Failing after 0s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m33s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 48s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Failing after 1s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 0s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Failing after 1s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Failing after 0s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 0s
CI/CD Pipeline / Integration Tests (pull_request) Failing after 0s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 0s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 0s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 10m44s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 1m58s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m54s
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 / 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 / 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 / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Failing after 0s

Pull request closed

Sign in to join this conversation.