afe78fb25f
CI/CD Pipeline / Check if frontend-only change (push) Has been skipped
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (push) Successful in 1s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 3s
CI/CD Pipeline / Frontend Lint (push) Has been skipped
CI/CD Pipeline / PR Build API Image (push) Has been skipped
CI/CD Pipeline / PR Build Web Image (push) Has been skipped
CI/CD Pipeline / PR Build Worker Image (push) Has been skipped
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 / Validate - Code Quality (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 4m51s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 5m35s
CI/CD Pipeline / Validate - Migration (alembic) (push) Successful in 5m34s
CI/CD Pipeline / Validate - Type Check (mypy) (push) Successful in 6m15s
AI Code Review / AI Code Review (pull_request) Failing after 6m40s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Check push changed paths (push) Successful in 7m8s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
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
PR Automation / Auto Approve on CI Green (pull_request) Successful in 8m31s
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 / Build Staging Web Image (push) 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 / PR Build API Image (pull_request) Successful in 1m54s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m46s
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 / Build Staging API Image (push) Successful in 1m46s
CI/CD Pipeline / CI Gate (pull_request) Successful in 30s
CI/CD Pipeline / Build Staging Worker Image (push) Successful in 1m36s
CI/CD Pipeline / Retag skipped Staging API Image (push) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (push) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (push) Successful in 34s
CI/CD Pipeline / Frontend Unit Tests (push) Successful in 10m14s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Successful in 1m14s
CI/CD Pipeline / Validate - Code Quality (push) Successful in 12m59s
CI/CD Pipeline / ACR Image Cleanup (push) Successful in 2m31s
CI/CD Pipeline / Staging API Integration Tests (push) Successful in 4m14s
CI/CD Pipeline / Staging E2E Tests (push) Successful in 6m14s
CI/CD Pipeline / Integration Tests (push) Successful in 5m41s
CI/CD Pipeline / Unit Tests (push) Successful in 19m12s
CI/CD Pipeline / Build Production API Image (push) Has been skipped
CI/CD Pipeline / Build Production Web Image (push) Has been skipped
CI/CD Pipeline / Build Production Worker Image (push) Has been skipped
CI/CD Pipeline / CI Gate (push) Has been skipped
CI/CD Pipeline / Deploy Production (push) Has been skipped
CI/CD Pipeline / Canary Release to Production (push) Has been skipped
CI/CD Pipeline / Production Browser E2E (push) Has been skipped
Co-authored-by: xiaoxia <dev@xiaoxiajianji.com> Co-committed-by: xiaoxia <dev@xiaoxiajianji.com>
94 lines
3.3 KiB
Python
94 lines
3.3 KiB
Python
"""Tests for get_asset_recent_use_counts and smart-match high-use exclusion."""
|
|
|
|
import json
|
|
import sys
|
|
from pathlib import Path
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
import pytest
|
|
|
|
ROOT = Path(__file__).resolve().parents[2]
|
|
sys.path.insert(0, str(ROOT / "apps" / "api"))
|
|
sys.path.insert(0, str(ROOT / "packages"))
|
|
|
|
|
|
class TestGetAssetRecentUseCounts:
|
|
"""Test asset_segment_tracker.get_asset_recent_use_counts."""
|
|
|
|
def _make_asset_model(self, asset_id, used_time_ranges=None):
|
|
from packages.adapters.sqlalchemy_impl.models import AssetModel
|
|
|
|
model = AssetModel(
|
|
id=asset_id,
|
|
name=f"asset-{asset_id}",
|
|
file_type="video",
|
|
status="ready",
|
|
asset_library_id="lib1",
|
|
project_id="proj1",
|
|
file_size=1000,
|
|
file_url=f"https://example.com/{asset_id}.mp4",
|
|
uploaded_by_user_id="user1",
|
|
)
|
|
model.classification_result = json.dumps(
|
|
{
|
|
"used_time_ranges": used_time_ranges or [],
|
|
}
|
|
)
|
|
return model
|
|
|
|
def test_empty_asset_ids_returns_empty(self):
|
|
from app.services.asset_segment_tracker import get_asset_recent_use_counts
|
|
|
|
db = MagicMock()
|
|
result = get_asset_recent_use_counts(db, [])
|
|
assert result == {}
|
|
|
|
def test_no_usage_returns_zero(self):
|
|
from app.services.asset_segment_tracker import get_asset_recent_use_counts
|
|
|
|
db = MagicMock()
|
|
model = self._make_asset_model("a1", [])
|
|
db.query.return_value.filter.return_value.all.return_value = [model]
|
|
|
|
result = get_asset_recent_use_counts(db, ["a1"])
|
|
assert result == {"a1": 0}
|
|
|
|
def test_counts_distinct_plan_ids(self):
|
|
from app.services.asset_segment_tracker import get_asset_recent_use_counts
|
|
|
|
db = MagicMock()
|
|
ranges = [
|
|
{"start": 0, "end": 5, "plan_id": "plan1", "created_at": "2026-08-01T00:00:00"},
|
|
{"start": 5, "end": 10, "plan_id": "plan1", "created_at": "2026-08-01T00:01:00"},
|
|
{"start": 0, "end": 5, "plan_id": "plan2", "created_at": "2026-08-02T00:00:00"},
|
|
{"start": 0, "end": 5, "plan_id": "plan3", "created_at": "2026-08-03T00:00:00"},
|
|
]
|
|
model = self._make_asset_model("a1", ranges)
|
|
db.query.return_value.filter.return_value.all.return_value = [model]
|
|
|
|
result = get_asset_recent_use_counts(db, ["a1"])
|
|
assert result == {"a1": 3}
|
|
|
|
def test_limits_to_recent_n(self):
|
|
from app.services.asset_segment_tracker import get_asset_recent_use_counts
|
|
|
|
db = MagicMock()
|
|
ranges = [
|
|
{"start": 0, "end": 5, "plan_id": f"plan{i}", "created_at": f"2026-08-{i+1:02d}T00:00:00"}
|
|
for i in range(10)
|
|
]
|
|
model = self._make_asset_model("a1", ranges)
|
|
db.query.return_value.filter.return_value.all.return_value = [model]
|
|
|
|
result = get_asset_recent_use_counts(db, ["a1"], recent_video_count=5)
|
|
assert result["a1"] == 5
|
|
|
|
def test_missing_asset_defaults_to_zero(self):
|
|
from app.services.asset_segment_tracker import get_asset_recent_use_counts
|
|
|
|
db = MagicMock()
|
|
db.query.return_value.filter.return_value.all.return_value = []
|
|
|
|
result = get_asset_recent_use_counts(db, ["missing_asset"])
|
|
assert result == {"missing_asset": 0}
|