From ed83e021a086aa8cc6bf335bd1b77bf5b485fe65 Mon Sep 17 00:00:00 2001 From: Paul de Raaij Date: Sun, 26 Jul 2026 11:39:25 -0400 Subject: [PATCH] feat: use ClassifiedAdTitle value object for ClassifiedAd.title --- domain/marketplace/__init__.py | 1 + domain/marketplace/classified_ad.py | 3 ++- domain/marketplace/classified_ad_title.py | 10 +++++++ tests/__init__.py | 0 tests/test_classified_ad.py | 33 ++++++++++++++++------- tests/test_classified_ad_title.py | 13 +++++++++ 6 files changed, 49 insertions(+), 11 deletions(-) create mode 100644 domain/marketplace/classified_ad_title.py create mode 100644 tests/__init__.py create mode 100644 tests/test_classified_ad_title.py diff --git a/domain/marketplace/__init__.py b/domain/marketplace/__init__.py index 35d04fd..fd870c3 100644 --- a/domain/marketplace/__init__.py +++ b/domain/marketplace/__init__.py @@ -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 diff --git a/domain/marketplace/classified_ad.py b/domain/marketplace/classified_ad.py index b31ecf3..5b7c232 100644 --- a/domain/marketplace/classified_ad.py +++ b/domain/marketplace/classified_ad.py @@ -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"))) diff --git a/domain/marketplace/classified_ad_title.py b/domain/marketplace/classified_ad_title.py new file mode 100644 index 0000000..7efd6e1 --- /dev/null +++ b/domain/marketplace/classified_ad_title.py @@ -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}") diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_classified_ad.py b/tests/test_classified_ad.py index 86db76c..7a35502 100644 --- a/tests/test_classified_ad.py +++ b/tests/test_classified_ad.py @@ -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")), + ) diff --git a/tests/test_classified_ad_title.py b/tests/test_classified_ad_title.py new file mode 100644 index 0000000..194ca08 --- /dev/null +++ b/tests/test_classified_ad_title.py @@ -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") \ No newline at end of file