import pytest from modelforge_api.domain.enums import ( MigrationStatus, ModelLifecycle, UpgradeClass, VerificationStatus, ) from modelforge_api.domain.lifecycle import ( InvalidTransition, assert_model_transition, assert_promotion_allowed, ) def test_model_lifecycle_allows_only_declared_transition() -> None: assert_model_transition(ModelLifecycle.DISCOVERED, ModelLifecycle.CANDIDATE) with pytest.raises(InvalidTransition): assert_model_transition(ModelLifecycle.DISCOVERED, ModelLifecycle.ACTIVE) def test_stable_promotion_requires_complete_evidence() -> None: with pytest.raises(InvalidTransition, match="benchmark"): assert_promotion_allowed( upgrade_class=UpgradeClass.BEHAVIORAL, verification_status=VerificationStatus.VERIFIED, local_benchmark_ids=[], project_benchmark_ids=[], operator_approval_id="approval", rollback_deployment_id="old", ) def test_reindex_promotion_requires_ready_migration() -> None: kwargs = { "upgrade_class": UpgradeClass.REQUIRES_REINDEX, "verification_status": VerificationStatus.VERIFIED, "local_benchmark_ids": ["local"], "project_benchmark_ids": ["project"], "operator_approval_id": "approval", "rollback_deployment_id": "old", } with pytest.raises(InvalidTransition, match="migration"): assert_promotion_allowed(**kwargs, migration_status=MigrationStatus.BACKFILLING) assert_promotion_allowed(**kwargs, migration_status=MigrationStatus.READY)