feat: use ClassifiedAdTitle value object for ClassifiedAd.title

This commit is contained in:
2026-07-26 11:39:25 -04:00
parent 3df59767ea
commit ed83e021a0
6 changed files with 49 additions and 11 deletions

View File

@@ -1,5 +1,6 @@
from .classified_ad import ClassifiedAd as ClassifiedAd
from .classified_ad_id import ClassifiedAdId as ClassifiedAdId
from .classified_ad_title import ClassifiedAdTitle as ClassifiedAdTitle
from .money import Money as Money
from .price import Price as Price
from .user_id import UserId as UserId

View File

@@ -2,6 +2,7 @@ from dataclasses import dataclass, field
from decimal import Decimal
from domain.marketplace.classified_ad_id import ClassifiedAdId
from domain.marketplace.classified_ad_title import ClassifiedAdTitle
from domain.marketplace.price import Price
from domain.marketplace.user_id import UserId
@@ -10,6 +11,6 @@ from domain.marketplace.user_id import UserId
class ClassifiedAd:
id: ClassifiedAdId
_ownerId: UserId
title: str
title: ClassifiedAdTitle
text: str
price: Price = field(default_factory=lambda: Price(amount=Decimal("0.00")))

View File

@@ -0,0 +1,10 @@
from dataclasses import dataclass
@dataclass(frozen=True)
class ClassifiedAdTitle:
title: str
def __post_init__(self):
if len(self.title) > 100:
raise ValueError(f"Title cannot be longer than 100 characters: {self.title}")

0
tests/__init__.py Normal file
View File

View File

@@ -5,6 +5,7 @@ import pytest
from domain.marketplace.classified_ad import ClassifiedAd
from domain.marketplace.classified_ad_id import ClassifiedAdId
from domain.marketplace.classified_ad_title import ClassifiedAdTitle
from domain.marketplace.price import Price
from domain.marketplace.user_id import UserId
@@ -16,14 +17,14 @@ def test_classified_ad_creation():
ad = ClassifiedAd(
id=ad_id,
_ownerId=owner_id,
title="Test Title",
title=ClassifiedAdTitle(title="Test Title"),
text="Test text content",
price=Price(amount=Decimal("99.99")),
)
assert ad.id == ad_id
assert ad._ownerId == owner_id
assert ad.title == "Test Title"
assert ad.title == ClassifiedAdTitle(title="Test Title")
assert ad.text == "Test text content"
assert ad.price == Price(amount=Decimal("99.99"))
@@ -32,7 +33,7 @@ def test_classified_ad_can_not_be_created_without_id():
with pytest.raises(TypeError):
ClassifiedAd(
_ownerId=UserId(value=uuid4()),
title="Title",
title=ClassifiedAdTitle(title="Title"),
text="Text",
price=Price(amount=Decimal("10.00")),
)
@@ -42,7 +43,7 @@ def test_classified_ad_can_not_be_created_without_owner_id():
with pytest.raises(TypeError):
ClassifiedAd(
id=ClassifiedAdId(value=uuid4()),
title="Title",
title=ClassifiedAdTitle(title="Title"),
text="Text",
price=Price(amount=Decimal("10.00")),
)
@@ -55,13 +56,13 @@ def test_classified_ad_can_be_created_without_price():
ad = ClassifiedAd(
id=ad_id,
_ownerId=owner_id,
title="Test Title",
title=ClassifiedAdTitle(title="Test Title"),
text="Test text content",
)
assert ad.id == ad_id
assert ad._ownerId == owner_id
assert ad.title == "Test Title"
assert ad.title == ClassifiedAdTitle(title="Test Title")
assert ad.text == "Test text content"
assert ad.price == Price(amount=Decimal("0.00"))
@@ -71,7 +72,7 @@ def test_classified_ad_can_not_have_negative_price():
ClassifiedAd(
id=ClassifiedAdId(value=uuid4()),
_ownerId=UserId(value=uuid4()),
title="Title",
title=ClassifiedAdTitle(title="Title"),
text="Text",
price=Price(amount=Decimal("-10.00")),
)
@@ -81,7 +82,7 @@ def test_classified_ad_is_immutable():
ad = ClassifiedAd(
id=ClassifiedAdId(value=uuid4()),
_ownerId=UserId(value=uuid4()),
title="Title",
title=ClassifiedAdTitle(title="Title"),
text="Text",
price=Price(amount=Decimal("10.00")),
)
@@ -100,16 +101,28 @@ def test_classified_ad_equality():
ad1 = ClassifiedAd(
id=ad_id,
_ownerId=owner_id,
title="Title",
title=ClassifiedAdTitle(title="Title"),
text="Text",
price=Price(amount=Decimal("10.00")),
)
ad2 = ClassifiedAd(
id=ad_id,
_ownerId=owner_id,
title="Title",
title=ClassifiedAdTitle(title="Title"),
text="Text",
price=Price(amount=Decimal("10.00")),
)
assert ad1 == ad2
def test_classified_ad_title_validation():
long_title = "a" * 101
with pytest.raises(ValueError):
ClassifiedAd(
id=ClassifiedAdId(value=uuid4()),
_ownerId=UserId(value=uuid4()),
title=ClassifiedAdTitle(title=long_title),
text="Text",
price=Price(amount=Decimal("10.00")),
)

View File

@@ -0,0 +1,13 @@
import pytest
from domain.marketplace.classified_ad_title import ClassifiedAdTitle
def test_classified_ad_title_creation():
title = ClassifiedAdTitle(title="Test Ad")
assert title.title == "Test Ad"
def test_classified_ad_title_can_not_be_longer_then_100_chars():
with pytest.raises(ValueError):
ClassifiedAdTitle(title="efbqzzqmsjdlhkovmnmyykrjvlftrzzaefbqzzqmsjdlhkovmnmyykrjvlftrzzaefbqzzqmsjdlhkovmnmyykrjvlftrzzaefbqzzqmsjdlhkovmnmyykrjvlftrzzaefbqzzqmsjdlhkovmnmyykrjvlftrzza")