feat: add max 2 decimal places validation to Money

This commit is contained in:
2026-07-29 01:20:50 -04:00
parent 94ff7c83ce
commit d098a84b03
3 changed files with 30 additions and 0 deletions

View File

@@ -6,6 +6,12 @@ from decimal import Decimal
class Money:
amount: Decimal
def __post_init__(self):
if self.amount.as_tuple().exponent < -2:
raise ValueError(
f"Money amount cannot have more than 2 decimal places: {self.amount}"
)
def __add__(self, other):
return Money(self.amount + other.amount)

View File

@@ -6,5 +6,6 @@ from domain.marketplace.money import Money
@dataclass(frozen=True)
class Price(Money):
def __post_init__(self):
super().__post_init__()
if self.amount < 0:
raise ValueError(f"Price cannot be negative: {self.amount}")

View File

@@ -37,3 +37,26 @@ def test_money_substract():
money1 = Money(amount=Decimal("5.00"))
money2 = Money(amount=Decimal("3.00"))
assert (money1 - money2) == Money(amount=Decimal("2.00"))
def test_money_can_not_have_more_than_two_decimals():
try:
Money(amount=Decimal("1.234"))
assert False, "Should have raised ValueError"
except ValueError:
pass
def test_money_allows_two_decimals():
money = Money(amount=Decimal("1.23"))
assert money.amount == Decimal("1.23")
def test_money_allows_one_decimal():
money = Money(amount=Decimal("1.2"))
assert money.amount == Decimal("1.2")
def test_money_allows_no_decimals():
money = Money(amount=Decimal(1))
assert money.amount == Decimal(1)