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
- 新增042号迁移:assets表加storage_key字段 - 更新schema-metadata-snapshot.json快照 - 新增SQLAlchemyAssetRepository的storage_key单测(create/update/to_domain fallback)
93 lines
2.9 KiB
Python
Executable File
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
|