test(wave134): 贴纸引擎纯逻辑抽离 + 113单测 #1048

Merged
auto-approve-bot merged 1 commits from test/wave134-sticker-engine-pure into develop 2026-07-28 09:34:21 +08:00
Owner

变更内容

新增纯逻辑模块 sticker_engine_pure.py

sticker_engine.py 中抽离所有纯函数,0 FFmpeg 依赖:

分类 函数 说明
类型转换 safe_float / safe_int / safe_bool 安全类型转换 + 默认值
尺寸估算 estimate_sticker_size / estimate_text_size 贴纸/文字尺寸估算
时间计算 calculate_fade_out_start / calculate_end_time / has_time_range 淡入淡出时间计算
滤镜构建 build_scale_filter / build_opacity_filter / build_image_fade_filters / build_enable_expr 图片贴纸滤镜组件
drawtext escape_drawtext_text / build_drawtext_alpha_expr / build_stroke_params / build_shadow_params 文字贴纸滤镜组件
排序统计 sort_stickers_by_z_index / filter_enabled_stickers / count_sticker_types 贴纸集合操作
辅助 build_overlay_position / build_pre_filter_label overlay 辅助
配置验证 validate_image_sticker / validate_text_sticker 配置合法性校验

113个单元测试

测试类 数量
TestSafeFloat 9
TestSafeInt 8
TestSafeBool 10
TestEstimateStickerSize 5
TestEstimateTextSize 4
TestCalculateFadeOutStart 6
TestCalculateEndTime 4
TestHasTimeRange 3
TestBuildScaleFilter 5
TestBuildOpacityFilter 5
TestBuildImageFadeFilters 6
TestBuildEnableExpr 4
TestEscapeDrawtextText 5
TestBuildDrawtextAlphaExpr 5
TestBuildStrokeParams 3
TestBuildShadowParams 3
TestSortStickersByZIndex 4
TestFilterEnabledStickers 4
TestCountStickerTypes 3
TestBuildOverlayPosition 4
TestBuildPreFilterLabel 2
TestValidateImageSticker 7
TestValidateTextSticker 5

向后兼容

  • sticker_engine.py 未修改,不影响现有功能
  • 后续可逐步迁移到使用 pure 模块

纯函数,无外部依赖,本地113测全绿。

## 变更内容 ### 新增纯逻辑模块 `sticker_engine_pure.py` 从 `sticker_engine.py` 中抽离所有纯函数,0 FFmpeg 依赖: | 分类 | 函数 | 说明 | |------|------|------| | 类型转换 | `safe_float` / `safe_int` / `safe_bool` | 安全类型转换 + 默认值 | | 尺寸估算 | `estimate_sticker_size` / `estimate_text_size` | 贴纸/文字尺寸估算 | | 时间计算 | `calculate_fade_out_start` / `calculate_end_time` / `has_time_range` | 淡入淡出时间计算 | | 滤镜构建 | `build_scale_filter` / `build_opacity_filter` / `build_image_fade_filters` / `build_enable_expr` | 图片贴纸滤镜组件 | | drawtext | `escape_drawtext_text` / `build_drawtext_alpha_expr` / `build_stroke_params` / `build_shadow_params` | 文字贴纸滤镜组件 | | 排序统计 | `sort_stickers_by_z_index` / `filter_enabled_stickers` / `count_sticker_types` | 贴纸集合操作 | | 辅助 | `build_overlay_position` / `build_pre_filter_label` | overlay 辅助 | | 配置验证 | `validate_image_sticker` / `validate_text_sticker` | 配置合法性校验 | ### 113个单元测试 | 测试类 | 数量 | |--------|------| | TestSafeFloat | 9 | | TestSafeInt | 8 | | TestSafeBool | 10 | | TestEstimateStickerSize | 5 | | TestEstimateTextSize | 4 | | TestCalculateFadeOutStart | 6 | | TestCalculateEndTime | 4 | | TestHasTimeRange | 3 | | TestBuildScaleFilter | 5 | | TestBuildOpacityFilter | 5 | | TestBuildImageFadeFilters | 6 | | TestBuildEnableExpr | 4 | | TestEscapeDrawtextText | 5 | | TestBuildDrawtextAlphaExpr | 5 | | TestBuildStrokeParams | 3 | | TestBuildShadowParams | 3 | | TestSortStickersByZIndex | 4 | | TestFilterEnabledStickers | 4 | | TestCountStickerTypes | 3 | | TestBuildOverlayPosition | 4 | | TestBuildPreFilterLabel | 2 | | TestValidateImageSticker | 7 | | TestValidateTextSticker | 5 | ### 向后兼容 - 原 `sticker_engine.py` 未修改,不影响现有功能 - 后续可逐步迁移到使用 pure 模块 --- 纯函数,无外部依赖,本地113测全绿。
xiaoxia added 1 commit 2026-07-28 09:17:49 +08:00
test(wave134): 贴纸引擎纯逻辑抽离 + 113单测
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 57s
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 / PR Build Web Image (pull_request) Successful in 53s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m36s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 2m4s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m11s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m4s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m31s
AI Code Review / AI Code Review (pull_request) Successful in 2m2s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 3m4s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m9s
CI/CD Pipeline / Frontend Unit 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 Staging (Watchtower auto-deploy) (pull_request) Has been skipped
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m28s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 3m12s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (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 / Unit Tests (pull_request) Successful in 3m45s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 22s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 13m30s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 29s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Waiting to run
d51bea5975
- 新增 sticker_engine_pure.py:安全类型转换/尺寸估算/时间计算/滤镜构建/贴纸排序/配置验证
- 113个单测覆盖:safe_float/safe_int/safe_bool/尺寸估算/淡入淡出/scale+opacity/enable/drawtext转义+alpha/排序+过滤+统计/验证函数
- 0 FFmpeg依赖,纯函数可测试
Collaborator

代码审查结果 - PR #1048

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

  1. apps/worker/video_processing/sticker_engine_pure.py 第473-482行validate_image_sticker 函数中存在校验逻辑漏洞。
    • 问题描述:使用了 safe_float 获取参数,当传入非法字符串(如 "abc")时,safe_float 返回 None。后续的校验逻辑 if opacity is not None and ... 会直接跳过校验,导致非法输入被判定为合法(返回 True)。如果后续流程直接使用原始值,会导致类型错误或生成错误的 FFmpeg 命令。
    • 后果:非法的贴纸配置通过校验,可能导致后续处理崩溃或视频生成失败。
    • 修改建议:应区分“字段未提供”和“字段格式错误”。建议修改校验逻辑,当 safe_float 返回 None 但原始值存在时,应报错。例如:
      opacity_val = sticker.get("opacity")
      opacity = safe_float(opacity_val)
      if opacity_val is not None and opacity is None:
          errors.append("opacity 格式错误")
      elif opacity is not None and (opacity < 0 or opacity > 1):
          errors.append("opacity 必须在 0~1 之间")
      
    • 受影响代码validate_text_sticker 中的 duration 校验(第515行左右)也存在同样问题。

💡 建议(1个可选)

  1. apps/worker/video_processing/sticker_engine_pure.py 第311行escape_drawtext_text 函数转义字符较少。
    • 具体内容:目前仅转义了 :'。在 FFmpeg drawtext 滤镜中,根据上下文不同,\(反斜杠)、[]% 等字符也可能具有特殊含义。如果文本内容包含这些字符,可能导致滤镜解析失败。建议根据实际调用场景(是否被引号包裹)补充转义逻辑,或至少补充对 \ 的处理。

格式检查通过 | 逻辑审查需修改 | 性能无明显问题


🤖 由 AI 代码审查机器人自动生成 | 2026-07-28 01:22:22 | 模型:

## 代码审查结果 - PR #1048 ### ⚠️ 问题(1个需要修改) 1. **apps/worker/video_processing/sticker_engine_pure.py 第473-482行**:`validate_image_sticker` 函数中存在校验逻辑漏洞。 - **问题描述**:使用了 `safe_float` 获取参数,当传入非法字符串(如 `"abc"`)时,`safe_float` 返回 `None`。后续的校验逻辑 `if opacity is not None and ...` 会直接跳过校验,导致非法输入被判定为合法(返回 True)。如果后续流程直接使用原始值,会导致类型错误或生成错误的 FFmpeg 命令。 - **后果**:非法的贴纸配置通过校验,可能导致后续处理崩溃或视频生成失败。 - **修改建议**:应区分“字段未提供”和“字段格式错误”。建议修改校验逻辑,当 `safe_float` 返回 `None` 但原始值存在时,应报错。例如: ```python opacity_val = sticker.get("opacity") opacity = safe_float(opacity_val) if opacity_val is not None and opacity is None: errors.append("opacity 格式错误") elif opacity is not None and (opacity < 0 or opacity > 1): errors.append("opacity 必须在 0~1 之间") ``` - **受影响代码**:`validate_text_sticker` 中的 `duration` 校验(第515行左右)也存在同样问题。 ### 💡 建议(1个可选) 1. **apps/worker/video_processing/sticker_engine_pure.py 第311行**:`escape_drawtext_text` 函数转义字符较少。 - **具体内容**:目前仅转义了 `:` 和 `'`。在 FFmpeg `drawtext` 滤镜中,根据上下文不同,`\`(反斜杠)、`[`、`]`、`%` 等字符也可能具有特殊含义。如果文本内容包含这些字符,可能导致滤镜解析失败。建议根据实际调用场景(是否被引号包裹)补充转义逻辑,或至少补充对 `\` 的处理。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 性能无明显问题 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-28 01:22:22 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1048 | | 预览链接 | [https://pr-1048.preview.xiaoxiajianji.com](https://pr-1048.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
auto-approve-bot merged commit 456718ad84 into develop 2026-07-28 09:34:21 +08:00
auto-approve-bot deleted branch test/wave134-sticker-engine-pure 2026-07-28 09:34:21 +08:00

🗑️ 预览环境已清理

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

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

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