e38f13eb96
CI/CD Pipeline / Check if frontend-only change (push) Has been skipped
CI/CD Pipeline / Validate - Code Quality (push) Has been cancelled
CI/CD Pipeline / Validate - Type Check (mypy) (push) Has been cancelled
CI/CD Pipeline / Validate - Migration (alembic) (push) Has been cancelled
CI/CD Pipeline / Unit Tests (push) Has been cancelled
CI/CD Pipeline / Integration Tests (push) Has been cancelled
CI/CD Pipeline / Frontend Lint (push) Has been cancelled
CI/CD Pipeline / Frontend Unit Tests (push) Has been cancelled
CI/CD Pipeline / PR Build API Image (push) Has been cancelled
CI/CD Pipeline / PR Build Web Image (push) Has been cancelled
CI/CD Pipeline / PR Build Worker Image (push) Has been cancelled
CI/CD Pipeline / Build Staging API Image (push) Has been cancelled
CI/CD Pipeline / Build Staging Web Image (push) Has been cancelled
CI/CD Pipeline / Build Staging Worker Image (push) Has been cancelled
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Has been cancelled
CI/CD Pipeline / Staging E2E Tests (push) Has been cancelled
CI/CD Pipeline / Staging API Integration Tests (push) Has been cancelled
CI/CD Pipeline / Build Production API Image (push) Has been cancelled
CI/CD Pipeline / Build Production Web Image (push) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (push) Has been cancelled
CI/CD Pipeline / Deploy Production (push) Has been cancelled
CI/CD Pipeline / Production Browser E2E (push) Has been cancelled
CI/CD Pipeline / ACR Image Cleanup (push) Has been cancelled
116 lines
4.7 KiB
Python
Executable File
116 lines
4.7 KiB
Python
Executable File
"""classification 分类领域模型单测."""
|
|
|
|
import pytest
|
|
|
|
from packages.domain.classification import (
|
|
AssetClassification,
|
|
AssetLibraryKind,
|
|
ClassificationJob,
|
|
ClassificationJobStatus,
|
|
ClassificationStatus,
|
|
IngestJobStatus,
|
|
)
|
|
|
|
|
|
class TestAssetLibraryKind:
|
|
def test_values(self):
|
|
assert AssetLibraryKind.VIDEO.value == "video"
|
|
assert AssetLibraryKind.VOICE.value == "voice"
|
|
assert AssetLibraryKind.IMAGE.value == "image"
|
|
|
|
def test_is_str(self):
|
|
assert isinstance(AssetLibraryKind.VIDEO, str)
|
|
|
|
|
|
class TestIngestJobStatus:
|
|
def test_values(self):
|
|
assert IngestJobStatus.PENDING.value == "pending"
|
|
assert IngestJobStatus.PROCESSING.value == "processing"
|
|
assert IngestJobStatus.COMPLETED.value == "completed"
|
|
assert IngestJobStatus.FAILED.value == "failed"
|
|
|
|
|
|
class TestClassificationJobStatusMissing:
|
|
"""ClassificationJobStatus._missing_ 兼容性测试."""
|
|
|
|
def test_normal_values(self):
|
|
assert ClassificationJobStatus("pending") == ClassificationJobStatus.PENDING
|
|
assert ClassificationJobStatus("processing") == ClassificationJobStatus.PROCESSING
|
|
assert ClassificationJobStatus("completed") == ClassificationJobStatus.COMPLETED
|
|
assert ClassificationJobStatus("failed") == ClassificationJobStatus.FAILED
|
|
|
|
@pytest.mark.parametrize("value", ["done", "success", "finished", "complete"])
|
|
def test_completed_aliases(self, value):
|
|
assert ClassificationJobStatus(value) == ClassificationJobStatus.COMPLETED
|
|
|
|
@pytest.mark.parametrize("value", ["fail", "error", "err"])
|
|
def test_failed_aliases(self, value):
|
|
assert ClassificationJobStatus(value) == ClassificationJobStatus.FAILED
|
|
|
|
@pytest.mark.parametrize("value", ["process", "processing", "running", "run"])
|
|
def test_processing_aliases(self, value):
|
|
assert ClassificationJobStatus(value) == ClassificationJobStatus.PROCESSING
|
|
|
|
@pytest.mark.parametrize("value", ["unknown", "foobar", ""])
|
|
def test_unknown_fallback_to_pending(self, value):
|
|
assert ClassificationJobStatus(value) == ClassificationJobStatus.PENDING
|
|
|
|
def test_none_fallback_to_pending(self):
|
|
assert ClassificationJobStatus(None) == ClassificationJobStatus.PENDING # type: ignore[arg-type]
|
|
|
|
def test_case_insensitive_with_strip(self):
|
|
assert ClassificationJobStatus(" DONE ") == ClassificationJobStatus.COMPLETED
|
|
assert ClassificationJobStatus("ERROR") == ClassificationJobStatus.FAILED
|
|
|
|
def test_backward_compat_alias(self):
|
|
"""ClassificationStatus 是 ClassificationJobStatus 的别名."""
|
|
assert ClassificationStatus is ClassificationJobStatus
|
|
assert ClassificationStatus("done") == ClassificationJobStatus.COMPLETED
|
|
|
|
|
|
class TestAssetClassification:
|
|
def test_values(self):
|
|
assert AssetClassification.SCENIC.value == "scenic"
|
|
assert AssetClassification.PRODUCT.value == "product"
|
|
assert AssetClassification.PERSON.value == "person"
|
|
assert AssetClassification.ANIMAL.value == "animal"
|
|
assert AssetClassification.FOOD.value == "food"
|
|
assert AssetClassification.TECH.value == "tech"
|
|
assert AssetClassification.SPORT.value == "sport"
|
|
assert AssetClassification.MUSIC.value == "music"
|
|
assert AssetClassification.OTHER.value == "other"
|
|
|
|
|
|
class TestClassificationJobCreate:
|
|
def test_create_normal(self):
|
|
job = ClassificationJob.create(project_id="proj1", asset_id="asset1")
|
|
assert job.id
|
|
assert job.project_id == "proj1"
|
|
assert job.asset_id == "asset1"
|
|
assert job.status == ClassificationJobStatus.PENDING
|
|
assert job.classification == ""
|
|
assert job.confidence == 0.0
|
|
assert job.error_message == ""
|
|
|
|
def test_create_strips_whitespace(self):
|
|
job = ClassificationJob.create(project_id=" proj1 ", asset_id=" asset1 ")
|
|
assert job.project_id == "proj1"
|
|
assert job.asset_id == "asset1"
|
|
|
|
def test_create_empty_project_id_raises(self):
|
|
with pytest.raises(ValueError, match="project_id 不能为空"):
|
|
ClassificationJob.create(project_id="", asset_id="a1")
|
|
|
|
def test_create_empty_asset_id_raises(self):
|
|
with pytest.raises(ValueError, match="asset_id 不能为空"):
|
|
ClassificationJob.create(project_id="p1", asset_id="")
|
|
|
|
def test_create_whitespace_project_id_raises(self):
|
|
with pytest.raises(ValueError, match="project_id 不能为空"):
|
|
ClassificationJob.create(project_id=" ", asset_id="a1")
|
|
|
|
def test_create_unique_ids(self):
|
|
job1 = ClassificationJob.create(project_id="p1", asset_id="a1")
|
|
job2 = ClassificationJob.create(project_id="p1", asset_id="a2")
|
|
assert job1.id != job2.id
|