style: auto-format with black + isort + ruff + prettier [skip ci-format-check]
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 2s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 10s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m10s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m23s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 2m40s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 3m5s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m13s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 3m56s
AI Code Review / AI Code Review (pull_request) Successful in 6m23s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 7m1s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 7m2s
CI/CD Pipeline / CI Gate (pull_request) Failing after 6s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 5m33s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 25h36m59s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 25h37m10s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 25h36m25s
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Failing after 25h36m29s
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Failing after 25h36m29s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 25h36m32s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 25h36m32s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 25h36m42s
CI/CD Pipeline / Check push changed paths (pull_request) Failing after 25h36m57s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 25h28m13s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 25h28m29s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 25h28m30s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 25h28m30s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 25h36m20s
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 25h28m12s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 25h36m20s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 25h36m42s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 25h36m42s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Failing after 26h12m6s
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 2s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 10s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m10s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m23s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 2m40s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 3m5s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m13s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 3m56s
AI Code Review / AI Code Review (pull_request) Successful in 6m23s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 7m1s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 7m2s
CI/CD Pipeline / CI Gate (pull_request) Failing after 6s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 5m33s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 25h36m59s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 25h37m10s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 25h36m25s
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Failing after 25h36m29s
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Failing after 25h36m29s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 25h36m32s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 25h36m32s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 25h36m42s
CI/CD Pipeline / Check push changed paths (pull_request) Failing after 25h36m57s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 25h28m13s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 25h28m29s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 25h28m30s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 25h28m30s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 25h36m20s
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 25h28m12s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 25h36m20s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 25h36m42s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 25h36m42s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Failing after 26h12m6s
This commit is contained in:
@@ -15,13 +15,12 @@ from datetime import datetime, timezone
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
from app.main import app
|
||||
from fastapi.testclient import TestClient
|
||||
|
||||
from app.main import app
|
||||
|
||||
|
||||
# ── helpers ──────────────────────────────────────────────────────────────
|
||||
|
||||
|
||||
def _make_script(**overrides):
|
||||
"""构造一个模拟 ScriptModel 对象."""
|
||||
defaults = dict(
|
||||
@@ -33,7 +32,13 @@ def _make_script(**overrides):
|
||||
tags=["测试"],
|
||||
title_text="开场大标题",
|
||||
title_category="片头",
|
||||
title_config={"text": "开场大标题", "font": "思源黑体", "font_size": 48, "font_color": "#FFFFFF", "position": "top"},
|
||||
title_config={
|
||||
"text": "开场大标题",
|
||||
"font": "思源黑体",
|
||||
"font_size": 48,
|
||||
"font_color": "#FFFFFF",
|
||||
"position": "top",
|
||||
},
|
||||
created_at=datetime(2026, 9, 1, tzinfo=timezone.utc),
|
||||
updated_at=datetime(2026, 9, 1, tzinfo=timezone.utc),
|
||||
)
|
||||
@@ -43,11 +48,13 @@ def _make_script(**overrides):
|
||||
|
||||
# ── TestScriptModelNewFields ─────────────────────────────────────────────
|
||||
|
||||
|
||||
class TestScriptModelNewFields:
|
||||
"""验证 ScriptModel 新增字段的定义."""
|
||||
|
||||
def test_model_has_title_text_column(self):
|
||||
from packages.adapters.sqlalchemy_impl.models import ScriptModel
|
||||
|
||||
assert hasattr(ScriptModel, "title_text")
|
||||
col = ScriptModel.__table__.columns["title_text"]
|
||||
assert col is not None
|
||||
@@ -55,6 +62,7 @@ class TestScriptModelNewFields:
|
||||
|
||||
def test_model_has_title_category_column(self):
|
||||
from packages.adapters.sqlalchemy_impl.models import ScriptModel
|
||||
|
||||
assert hasattr(ScriptModel, "title_category")
|
||||
col = ScriptModel.__table__.columns["title_category"]
|
||||
assert col is not None
|
||||
@@ -62,6 +70,7 @@ class TestScriptModelNewFields:
|
||||
|
||||
def test_model_has_title_config_column(self):
|
||||
from packages.adapters.sqlalchemy_impl.models import ScriptModel
|
||||
|
||||
assert hasattr(ScriptModel, "title_config")
|
||||
col = ScriptModel.__table__.columns["title_config"]
|
||||
assert col is not None
|
||||
@@ -69,6 +78,7 @@ class TestScriptModelNewFields:
|
||||
def test_model_defaults(self):
|
||||
"""新字段默认值为空字符串/空 dict."""
|
||||
from packages.adapters.sqlalchemy_impl.models import ScriptModel
|
||||
|
||||
s = ScriptModel(id="x", user_id="u", title="t")
|
||||
# 检查 default 值
|
||||
assert ScriptModel.__table__.columns["title_text"].default.arg == ""
|
||||
@@ -77,6 +87,7 @@ class TestScriptModelNewFields:
|
||||
|
||||
# ── TestScriptServiceTitleConfig ─────────────────────────────────────────
|
||||
|
||||
|
||||
class TestScriptServiceTitleConfig:
|
||||
"""验证 ScriptService 新方法 get_title_config_for_script."""
|
||||
|
||||
@@ -137,6 +148,7 @@ class TestScriptServiceTitleConfig:
|
||||
|
||||
# ── TestScriptServiceCreateWithNewFields ─────────────────────────────────
|
||||
|
||||
|
||||
class TestScriptServiceCreateWithNewFields:
|
||||
"""验证 create_script 和 update_script 支持新字段."""
|
||||
|
||||
@@ -184,6 +196,7 @@ class TestScriptServiceCreateWithNewFields:
|
||||
|
||||
# ── TestScriptsRoutesNewFields ───────────────────────────────────────────
|
||||
|
||||
|
||||
class TestScriptsRoutesNewFields:
|
||||
"""验证 scripts API 路由正确处理新字段."""
|
||||
|
||||
@@ -245,6 +258,7 @@ class TestScriptsRoutesNewFields:
|
||||
|
||||
# ── TestTitleLibraryDeprecated ───────────────────────────────────────────
|
||||
|
||||
|
||||
class TestTitleLibraryDeprecated:
|
||||
"""验证 title_libraries API 返回 deprecated Warning header."""
|
||||
|
||||
@@ -267,10 +281,18 @@ class TestTitleLibraryDeprecated:
|
||||
def test_get_title_has_warning_header(self, mock_auth, mock_repo_dep):
|
||||
mock_auth.return_value = MagicMock(user=MagicMock(id="user-001"))
|
||||
from packages.domain.title_library import TitleLibraryItem
|
||||
|
||||
mock_item = TitleLibraryItem(
|
||||
id="t1", user_id="user-001", name="测试", text="标题文字",
|
||||
category="通用", description="", tags=[], usage_count=0,
|
||||
is_active=True, created_at=datetime(2026, 1, 1, tzinfo=timezone.utc),
|
||||
id="t1",
|
||||
user_id="user-001",
|
||||
name="测试",
|
||||
text="标题文字",
|
||||
category="通用",
|
||||
description="",
|
||||
tags=[],
|
||||
usage_count=0,
|
||||
is_active=True,
|
||||
created_at=datetime(2026, 1, 1, tzinfo=timezone.utc),
|
||||
updated_at=datetime(2026, 1, 1, tzinfo=timezone.utc),
|
||||
)
|
||||
mock_repo = MagicMock()
|
||||
|
||||
Reference in New Issue
Block a user