Files
xiaoxia-saas/tests/unit/test_temp_dir_cleanup_race.py
T
CI Bot 25b6f19861
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 / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 45s
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 Worker Image (pull_request) Successful in 27s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m43s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m44s
AI Code Review / AI Code Review (pull_request) Failing after 2m6s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m24s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 2m27s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 1m42s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m38s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 4m27s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 6m32s
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production API 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) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
style: auto-format with black + isort + prettier [skip ci-format-check]
2026-08-24 09:37:10 +00:00

61 lines
2.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
回归测试:渲染产物临时目录不在 render_plan 中提前清理。
根因:render_plan 的 finally 块在返回前清理了临时目录,
但 generation.py 还需要访问其中的文件进行 OSS 上传。
修复:将清理责任交给调用方(generation.py),render_plan 只在失败时清理。
"""
import ast
def test_render_adapter_result_has_temp_dir_field():
"""RenderAdapterResult 包含 temp_dir 字段"""
with open("apps/worker/video_processing/render_adapter.py") as f:
source = f.read()
tree = ast.parse(source)
for node in ast.walk(tree):
if isinstance(node, ast.ClassDef) and node.name == "RenderAdapterResult":
# 检查类体中是否有 temp_dir 的赋值(dataclass field
for item in node.body:
if isinstance(item, ast.AnnAssign) and isinstance(item.target, ast.Name):
if item.target.id == "temp_dir":
return
raise AssertionError("RenderAdapterResult 缺少 temp_dir 字段")
def test_render_plan_does_not_cleanup_on_success():
"""render_plan 成功时不在 finally 中清理临时目录"""
with open("apps/worker/video_processing/render_adapter.py") as f:
source = f.read()
# 验证成功路径中 temp_dir 被置为 None(阻止 finally 清理)
assert (
"temp_dir = None # 成功时不清理" in source or "temp_dir = None" in source
), "render_plan 成功时应将 temp_dir 置为 None 以阻止 finally 清理"
def test_render_plan_passes_temp_dir_to_result():
"""render_plan 将 temp_dir 传递给返回结果"""
with open("apps/worker/video_processing/render_adapter.py") as f:
source = f.read()
assert "result.temp_dir = temp_dir" in source, "render_plan 应将 temp_dir 设置到 result 上"
def test_generation_cleans_up_temp_dir():
"""generation.py 在上传完成后清理临时目录"""
with open("apps/worker/worker_app/tasks/generation.py") as f:
source = f.read()
# 验证 _render_from_edit_plan 返回 temp_dir
assert "render_temp_dir" in source, "generation.py 应接收 render_temp_dir"
# 验证有清理逻辑
assert "rmtree(render_temp_dir" in source, "generation.py 应清理 render_temp_dir"
# 验证清理发生在上传之后(通过查找顺序)
upload_pos = source.find("_upload_and_record")
cleanup_pos = source.find("rmtree(render_temp_dir")
assert upload_pos > 0 and cleanup_pos > upload_pos, "清理临时目录应在 _upload_and_record 之后执行"