Files
xiaoxia-saas/tests/unit/test_asset_repository_storage_key.py
T
CI Bot 0b073a8648
CI Build & Deploy Pipeline / Build Staging API Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Staging Worker Image (pull_request) Has been skipped
Auto Approve CI PRs / Auto Approve on CI Green (pull_request) Failing after 0s
CI Build & Deploy Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Production API Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Production Web Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI Build & Deploy Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI Build & Deploy Pipeline / Deploy Production (pull_request) Has been skipped
CI Build & Deploy Pipeline / Production Browser E2E (pull_request) Has been skipped
AI Code Review / AI Code Review (pull_request) Failing after 33s
Auto Merge CI PRs / Auto Merge on CI Green + Approved (pull_request) Successful in 4m9s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 6s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 42s
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Has been cancelled
CI/CD Pipeline / Unit Tests (pull_request) Has been cancelled
CI/CD Pipeline / Integration Tests (pull_request) Has been cancelled
fix(worker): 补alembic迁移+schema快照+asset_repository单测,修复CI 3红
- 新增042号迁移:assets表加storage_key字段
- 更新schema-metadata-snapshot.json快照
- 新增SQLAlchemyAssetRepository的storage_key单测(create/update/to_domain fallback)
2026-07-17 18:28:54 +08:00

93 lines
2.9 KiB
Python
Executable File

"""Unit tests for SQLAlchemyAssetRepository - storage_key field coverage."""
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "apps" / "api"))
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from packages.adapters.sqlalchemy_impl.asset_repository import SQLAlchemyAssetRepository
from packages.adapters.sqlalchemy_impl.models import Base
from packages.domain import Asset, AssetStatus
def _repository():
engine = create_engine("sqlite:///:memory:")
Base.metadata.create_all(engine)
session = sessionmaker(bind=engine)()
return SQLAlchemyAssetRepository(session)
def test_asset_repository_create_preserves_storage_key():
"""create时storage_key字段正确写入数据库。"""
repository = _repository()
asset = Asset.create(
project_id="proj-1",
library_id="lib-1",
name="test_video.mp4",
storage_key="assets/proj-1/test_video.mp4",
mime_type="video/mp4",
file_size=102400,
)
repository.create(asset)
saved = repository.get(asset.id)
assert saved is not None
assert saved.storage_key == "assets/proj-1/test_video.mp4"
def test_asset_repository_update_preserves_storage_key():
"""update时storage_key字段正确更新。"""
repository = _repository()
asset = Asset.create(
project_id="proj-1",
library_id="lib-1",
name="test_video.mp4",
storage_key="assets/proj-1/old_key.mp4",
mime_type="video/mp4",
)
repository.create(asset)
# 更新storage_key
asset.storage_key = "assets/proj-1/new_key.mp4"
repository.update(asset)
saved = repository.get(asset.id)
assert saved.storage_key == "assets/proj-1/new_key.mp4"
def test_asset_repository_to_domain_fallback_to_file_url():
"""_to_domain中storage_key为空时fallback到file_url(兼容存量数据)。"""
from sqlalchemy.orm import sessionmaker
engine = create_engine("sqlite:///:memory:")
Base.metadata.create_all(engine)
session = sessionmaker(bind=engine)()
repository = SQLAlchemyAssetRepository(session)
# 直接插入一条storage_key为空的记录(模拟存量数据)
from packages.adapters.sqlalchemy_impl.models import AssetModel
model = AssetModel(
id="asset-legacy-001",
project_id="proj-1",
asset_library_id="lib-1",
name="legacy_asset.mp4",
file_type="video",
file_size=204800,
file_url="legacy/storage/key.mp4", # 老数据file_url存的是storage_key
storage_key="", # 新字段为空
status="ready",
classification_status="pending",
uploaded_by_user_id="user-1",
)
session.add(model)
session.commit()
saved = repository.get("asset-legacy-001")
assert saved is not None
assert saved.storage_key == "legacy/storage/key.mp4" # fallback到file_url