Files
xiaoxia-saas/tests/unit/domain/test_exceptions.py
CI Bot 13a1070fbc
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 14s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m23s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m33s
AI Code Review / AI Code Review (pull_request) Successful in 1m24s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m4s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m25s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m40s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 5m29s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 3m28s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 3m23s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 4m19s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 3m17s
CI/CD Pipeline / CI Gate (pull_request) Successful in 23s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Has been cancelled
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 1m0s
CI/CD Pipeline / Production Browser E2E (pull_request) Failing after 1169h8m37s
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 1169h8m38s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 1169h8m38s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 1169h8m40s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 1169h8m42s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 1169h9m27s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 1169h9m29s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 1169h12m33s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 1169h12m59s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 1169h13m13s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 1169h19m49s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 1169h19m51s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 1169h19m53s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 1169h41m42s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 1169h42m29s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 1169h46m12s
style: auto-format with black + isort + prettier [skip ci-format-check]
2026-07-29 14:02:11 +00:00

108 lines
3.0 KiB
Python
Executable File

"""domain exceptions 单元测试."""
from __future__ import annotations
import pytest
from domain.exceptions import (
DomainError,
NotFoundError,
QuotaExceededError,
ValidationError,
)
class TestDomainError:
"""DomainError 基类测试."""
def test_is_exception(self):
assert issubclass(DomainError, Exception)
def test_raise_and_catch(self):
with pytest.raises(DomainError):
raise DomainError("something went wrong")
def test_message(self):
err = DomainError("test message")
assert str(err) == "test message"
def test_empty_message(self):
err = DomainError()
assert str(err) == ""
class TestNotFoundError:
"""NotFoundError 测试."""
def test_is_domain_error(self):
assert issubclass(NotFoundError, DomainError)
def test_raise_and_catch_as_domain(self):
with pytest.raises(DomainError):
raise NotFoundError("user not found")
def test_raise_and_catch_specific(self):
with pytest.raises(NotFoundError):
raise NotFoundError("user not found")
def test_message(self):
err = NotFoundError("resource not found")
assert str(err) == "resource not found"
class TestValidationError:
"""ValidationError 测试."""
def test_is_domain_error(self):
assert issubclass(ValidationError, DomainError)
def test_raise_and_catch_as_domain(self):
with pytest.raises(DomainError):
raise ValidationError("invalid input")
def test_raise_and_catch_specific(self):
with pytest.raises(ValidationError):
raise ValidationError("invalid input")
def test_message(self):
err = ValidationError("bad data")
assert str(err) == "bad data"
class TestQuotaExceededError:
"""QuotaExceededError 测试."""
def test_is_domain_error(self):
assert issubclass(QuotaExceededError, DomainError)
def test_constructor_stores_fields(self):
err = QuotaExceededError("storage", limit=100.0, used=150.0)
assert err.dimension == "storage"
assert err.limit == 100.0
assert err.used == 150.0
def test_message_format(self):
err = QuotaExceededError("storage", limit=100.0, used=150.0)
assert "storage" in str(err)
assert "150.0" in str(err)
assert "100.0" in str(err)
assert "Quota exceeded" in str(err)
def test_raise_and_catch_as_domain(self):
with pytest.raises(DomainError):
raise QuotaExceededError("api_calls", limit=1000, used=2000)
def test_raise_and_catch_specific(self):
with pytest.raises(QuotaExceededError):
raise QuotaExceededError("api_calls", limit=1000, used=2000)
def test_int_values(self):
err = QuotaExceededError("count", limit=100, used=150)
assert err.limit == 100
assert err.used == 150
assert "150/100" in str(err)
def test_float_values(self):
err = QuotaExceededError("size", limit=10.5, used=20.3)
assert err.limit == 10.5
assert err.used == 20.3