"""Tests for shared error taxonomy and helpers.""" import pytest from transcription.errors import AppError, ErrorCategory, classify_unexpected_error, new_error_id @pytest.mark.unit class TestErrorCategoryContract: """Verify stable category identifiers.""" def test_category_values_match_policy_contract(self): """Error category values match docs/error_handling.md identifiers.""" assert ErrorCategory.VALIDATION.value == "validation_error" assert ErrorCategory.USER_INPUT.value == "user_input_error" assert ErrorCategory.NOT_FOUND.value == "not_found_error" assert ErrorCategory.CONFLICT.value == "conflict_error" assert ErrorCategory.EXTERNAL_PROVIDER.value == "external_provider_error" assert ErrorCategory.INFRA_TRANSIENT.value == "infrastructure_transient_error" assert ErrorCategory.INFRA_PERSISTENT.value == "infrastructure_persistent_error" assert ErrorCategory.INTERNAL_UNEXPECTED.value == "internal_unexpected_error" @pytest.mark.unit class TestAppErrorHelpers: """Verify helper behavior for IDs and normalization.""" def test_new_error_id_returns_short_identifier(self): """new_error_id returns a short non-empty identifier.""" value = new_error_id() assert isinstance(value, str) assert len(value) == 8 def test_classify_unexpected_error_returns_internal_unexpected(self): """Unexpected exceptions are normalized to internal_unexpected_error.""" err = classify_unexpected_error(RuntimeError("boom"), operation="unit.test") assert isinstance(err, AppError) assert err.category == ErrorCategory.INTERNAL_UNEXPECTED assert "unit.test" in err.message assert "boom" in err.message assert err.suggestion assert err.error_id