feat: add generic Value[T] base class for value objects
- Create Value[T] (frozen dataclass + ABC + Generic) in domain/framework/ - Migrate ClassifiedAdTitle and ClassifiedAdText to inherit Value[str] - Standardize all value access via .value instead of type-specific fields
This commit is contained in:
@@ -30,15 +30,15 @@ def test_classified_ad_creation():
|
||||
ad = ClassifiedAd(
|
||||
id=ad_id,
|
||||
_ownerId=owner_id,
|
||||
title=ClassifiedAdTitle(title="Test Title"),
|
||||
text=ClassifiedAdText(text="Test text content"),
|
||||
title=ClassifiedAdTitle(value="Test Title"),
|
||||
text=ClassifiedAdText(value="Test text content"),
|
||||
price=Price(amount=Decimal("99.99")),
|
||||
)
|
||||
|
||||
assert ad.id == ad_id
|
||||
assert ad._ownerId == owner_id
|
||||
assert ad.title == ClassifiedAdTitle(title="Test Title")
|
||||
assert ad.text == ClassifiedAdText(text="Test text content")
|
||||
assert ad.title == ClassifiedAdTitle(value="Test Title")
|
||||
assert ad.text == ClassifiedAdText(value="Test text content")
|
||||
assert ad.price == Price(amount=Decimal("99.99"))
|
||||
|
||||
|
||||
@@ -46,8 +46,8 @@ def test_classified_ad_can_not_be_created_without_id():
|
||||
with pytest.raises(TypeError):
|
||||
ClassifiedAd(
|
||||
_ownerId=UserId(value=uuid4()),
|
||||
title=ClassifiedAdTitle(title="Title"),
|
||||
text=ClassifiedAdText(text="Text"),
|
||||
title=ClassifiedAdTitle(value="Title"),
|
||||
text=ClassifiedAdText(value="Text"),
|
||||
price=Price(amount=Decimal("10.00")),
|
||||
)
|
||||
|
||||
@@ -56,8 +56,8 @@ def test_classified_ad_can_not_be_created_without_owner_id():
|
||||
with pytest.raises(TypeError):
|
||||
ClassifiedAd(
|
||||
id=ClassifiedAdId(value=uuid4()),
|
||||
title=ClassifiedAdTitle(title="Title"),
|
||||
text=ClassifiedAdText(text="Text"),
|
||||
title=ClassifiedAdTitle(value="Title"),
|
||||
text=ClassifiedAdText(value="Text"),
|
||||
price=Price(amount=Decimal("10.00")),
|
||||
)
|
||||
|
||||
@@ -69,14 +69,14 @@ def test_classified_ad_can_be_created_without_price():
|
||||
ad = ClassifiedAd(
|
||||
id=ad_id,
|
||||
_ownerId=owner_id,
|
||||
title=ClassifiedAdTitle(title="Test Title"),
|
||||
text=ClassifiedAdText(text="Test text content"),
|
||||
title=ClassifiedAdTitle(value="Test Title"),
|
||||
text=ClassifiedAdText(value="Test text content"),
|
||||
)
|
||||
|
||||
assert ad.id == ad_id
|
||||
assert ad._ownerId == owner_id
|
||||
assert ad.title == ClassifiedAdTitle(title="Test Title")
|
||||
assert ad.text == ClassifiedAdText(text="Test text content")
|
||||
assert ad.title == ClassifiedAdTitle(value="Test Title")
|
||||
assert ad.text == ClassifiedAdText(value="Test text content")
|
||||
assert ad.price == Price(amount=Decimal("0.00"))
|
||||
|
||||
|
||||
@@ -85,8 +85,8 @@ def test_classified_ad_can_not_have_negative_price():
|
||||
ClassifiedAd(
|
||||
id=ClassifiedAdId(value=uuid4()),
|
||||
_ownerId=UserId(value=uuid4()),
|
||||
title=ClassifiedAdTitle(title="Title"),
|
||||
text=ClassifiedAdText(text="Text"),
|
||||
title=ClassifiedAdTitle(value="Title"),
|
||||
text=ClassifiedAdText(value="Text"),
|
||||
price=Price(amount=Decimal("-10.00")),
|
||||
)
|
||||
|
||||
@@ -95,8 +95,8 @@ def test_classified_ad_is_immutable():
|
||||
ad = ClassifiedAd(
|
||||
id=ClassifiedAdId(value=uuid4()),
|
||||
_ownerId=UserId(value=uuid4()),
|
||||
title=ClassifiedAdTitle(title="Title"),
|
||||
text=ClassifiedAdText(text="Text"),
|
||||
title=ClassifiedAdTitle(value="Title"),
|
||||
text=ClassifiedAdText(value="Text"),
|
||||
price=Price(amount=Decimal("10.00")),
|
||||
)
|
||||
|
||||
@@ -114,15 +114,15 @@ def test_classified_ad_equality():
|
||||
ad1 = ClassifiedAd(
|
||||
id=ad_id,
|
||||
_ownerId=owner_id,
|
||||
title=ClassifiedAdTitle(title="Title"),
|
||||
text=ClassifiedAdText(text="Text"),
|
||||
title=ClassifiedAdTitle(value="Title"),
|
||||
text=ClassifiedAdText(value="Text"),
|
||||
price=Price(amount=Decimal("10.00")),
|
||||
)
|
||||
ad2 = ClassifiedAd(
|
||||
id=ad_id,
|
||||
_ownerId=owner_id,
|
||||
title=ClassifiedAdTitle(title="Title"),
|
||||
text=ClassifiedAdText(text="Text"),
|
||||
title=ClassifiedAdTitle(value="Title"),
|
||||
text=ClassifiedAdText(value="Text"),
|
||||
price=Price(amount=Decimal("10.00")),
|
||||
)
|
||||
|
||||
@@ -135,8 +135,8 @@ def test_classified_ad_title_validation():
|
||||
ClassifiedAd(
|
||||
id=ClassifiedAdId(value=uuid4()),
|
||||
_ownerId=UserId(value=uuid4()),
|
||||
title=ClassifiedAdTitle(title=long_title),
|
||||
text=ClassifiedAdText(text="Text"),
|
||||
title=ClassifiedAdTitle(value=long_title),
|
||||
text=ClassifiedAdText(value="Text"),
|
||||
price=Price(amount=Decimal("10.00")),
|
||||
)
|
||||
|
||||
@@ -145,8 +145,8 @@ def test_request_to_publish_sets_state_to_pending_review():
|
||||
ad = ClassifiedAd(
|
||||
id=ClassifiedAdId(value=uuid4()),
|
||||
_ownerId=UserId(value=uuid4()),
|
||||
title=ClassifiedAdTitle(title="Title"),
|
||||
text=ClassifiedAdText(text="Text"),
|
||||
title=ClassifiedAdTitle(value="Title"),
|
||||
text=ClassifiedAdText(value="Text"),
|
||||
price=Price(amount=Decimal("10.00")),
|
||||
)
|
||||
|
||||
@@ -165,8 +165,8 @@ def test_request_to_publish_fails_when_title_empty():
|
||||
ad = ClassifiedAd(
|
||||
id=ClassifiedAdId(value=uuid4()),
|
||||
_ownerId=UserId(value=uuid4()),
|
||||
title=ClassifiedAdTitle(title=""),
|
||||
text=ClassifiedAdText(text="Text"),
|
||||
title=ClassifiedAdTitle(value=""),
|
||||
text=ClassifiedAdText(value="Text"),
|
||||
price=Price(amount=Decimal("10.00")),
|
||||
)
|
||||
|
||||
@@ -180,8 +180,8 @@ def test_request_to_publish_fails_when_text_empty():
|
||||
ad = ClassifiedAd(
|
||||
id=ClassifiedAdId(value=uuid4()),
|
||||
_ownerId=UserId(value=uuid4()),
|
||||
title=ClassifiedAdTitle(title="Title"),
|
||||
text=ClassifiedAdText(text=""),
|
||||
title=ClassifiedAdTitle(value="Title"),
|
||||
text=ClassifiedAdText(value=""),
|
||||
price=Price(amount=Decimal("10.00")),
|
||||
)
|
||||
|
||||
@@ -195,8 +195,8 @@ def test_request_to_publish_fails_when_price_is_zero():
|
||||
ad = ClassifiedAd(
|
||||
id=ClassifiedAdId(value=uuid4()),
|
||||
_ownerId=UserId(value=uuid4()),
|
||||
title=ClassifiedAdTitle(title="Title"),
|
||||
text=ClassifiedAdText(text="Text"),
|
||||
title=ClassifiedAdTitle(value="Title"),
|
||||
text=ClassifiedAdText(value="Text"),
|
||||
)
|
||||
|
||||
with pytest.raises(InvalidEntityStateException) as exc_info:
|
||||
@@ -209,8 +209,8 @@ def test_request_to_publish_reports_all_errors():
|
||||
ad = ClassifiedAd(
|
||||
id=ClassifiedAdId(value=uuid4()),
|
||||
_ownerId=UserId(value=uuid4()),
|
||||
title=ClassifiedAdTitle(title=""),
|
||||
text=ClassifiedAdText(text=""),
|
||||
title=ClassifiedAdTitle(value=""),
|
||||
text=ClassifiedAdText(value=""),
|
||||
)
|
||||
|
||||
with pytest.raises(InvalidEntityStateException) as exc_info:
|
||||
@@ -225,8 +225,8 @@ def test_request_to_publish_does_not_mutate_original():
|
||||
ad = ClassifiedAd(
|
||||
id=ClassifiedAdId(value=uuid4()),
|
||||
_ownerId=UserId(value=uuid4()),
|
||||
title=ClassifiedAdTitle(title="Title"),
|
||||
text=ClassifiedAdText(text="Text"),
|
||||
title=ClassifiedAdTitle(value="Title"),
|
||||
text=ClassifiedAdText(value="Text"),
|
||||
price=Price(amount=Decimal("10.00")),
|
||||
)
|
||||
|
||||
@@ -240,8 +240,8 @@ def test_classified_ad_is_instance_of_entity():
|
||||
ad = ClassifiedAd(
|
||||
id=ClassifiedAdId(value=uuid4()),
|
||||
_ownerId=UserId(value=uuid4()),
|
||||
title=ClassifiedAdTitle(title="Title"),
|
||||
text=ClassifiedAdText(text="Text"),
|
||||
title=ClassifiedAdTitle(value="Title"),
|
||||
text=ClassifiedAdText(value="Text"),
|
||||
price=Price(amount=Decimal("10.00")),
|
||||
)
|
||||
|
||||
@@ -252,8 +252,8 @@ def test_classified_ad_can_use_entity_apply():
|
||||
ad = ClassifiedAd(
|
||||
id=ClassifiedAdId(value=uuid4()),
|
||||
_ownerId=UserId(value=uuid4()),
|
||||
title=ClassifiedAdTitle(title="Title"),
|
||||
text=ClassifiedAdText(text="Text"),
|
||||
title=ClassifiedAdTitle(value="Title"),
|
||||
text=ClassifiedAdText(value="Text"),
|
||||
price=Price(amount=Decimal("10.00")),
|
||||
)
|
||||
event = ClassifiedAdSentForReview(id=ad.id.value)
|
||||
@@ -269,32 +269,32 @@ def test_set_title_updates_title():
|
||||
ad = ClassifiedAd(
|
||||
id=ClassifiedAdId(value=uuid4()),
|
||||
_ownerId=UserId(value=uuid4()),
|
||||
title=ClassifiedAdTitle(title="Old Title"),
|
||||
text=ClassifiedAdText(text="Text"),
|
||||
title=ClassifiedAdTitle(value="Old Title"),
|
||||
text=ClassifiedAdText(value="Text"),
|
||||
price=Price(amount=Decimal("10.00")),
|
||||
)
|
||||
new_title = ClassifiedAdTitle(title="New Title")
|
||||
new_title = ClassifiedAdTitle(value="New Title")
|
||||
|
||||
updated = ad.set_title(new_title)
|
||||
|
||||
assert updated.title == new_title
|
||||
assert ad.title == ClassifiedAdTitle(title="Old Title")
|
||||
assert ad.title == ClassifiedAdTitle(value="Old Title")
|
||||
|
||||
|
||||
def test_set_title_preserves_other_fields():
|
||||
ad_id = ClassifiedAdId(value=uuid4())
|
||||
owner_id = UserId(value=uuid4())
|
||||
text = ClassifiedAdText(text="Text")
|
||||
text = ClassifiedAdText(value="Text")
|
||||
price = Price(amount=Decimal("10.00"))
|
||||
ad = ClassifiedAd(
|
||||
id=ad_id,
|
||||
_ownerId=owner_id,
|
||||
title=ClassifiedAdTitle(title="Old Title"),
|
||||
title=ClassifiedAdTitle(value="Old Title"),
|
||||
text=text,
|
||||
price=price,
|
||||
)
|
||||
|
||||
updated = ad.set_title(ClassifiedAdTitle(title="New Title"))
|
||||
updated = ad.set_title(ClassifiedAdTitle(value="New Title"))
|
||||
|
||||
assert updated.id == ad_id
|
||||
assert updated._ownerId == owner_id
|
||||
@@ -306,13 +306,13 @@ def test_set_title_fails_when_new_title_empty():
|
||||
ad = ClassifiedAd(
|
||||
id=ClassifiedAdId(value=uuid4()),
|
||||
_ownerId=UserId(value=uuid4()),
|
||||
title=ClassifiedAdTitle(title="Title"),
|
||||
text=ClassifiedAdText(text="Text"),
|
||||
title=ClassifiedAdTitle(value="Title"),
|
||||
text=ClassifiedAdText(value="Text"),
|
||||
price=Price(amount=Decimal("10.00")),
|
||||
)
|
||||
|
||||
with pytest.raises(InvalidEntityStateException) as exc_info:
|
||||
ad.set_title(ClassifiedAdTitle(title=""))
|
||||
ad.set_title(ClassifiedAdTitle(value=""))
|
||||
|
||||
assert "title" in str(exc_info.value)
|
||||
|
||||
@@ -321,12 +321,12 @@ def test_set_title_raises_classified_ad_title_changed_event():
|
||||
ad = ClassifiedAd(
|
||||
id=ClassifiedAdId(value=uuid4()),
|
||||
_ownerId=UserId(value=uuid4()),
|
||||
title=ClassifiedAdTitle(title="Old Title"),
|
||||
text=ClassifiedAdText(text="Text"),
|
||||
title=ClassifiedAdTitle(value="Old Title"),
|
||||
text=ClassifiedAdText(value="Text"),
|
||||
price=Price(amount=Decimal("10.00")),
|
||||
)
|
||||
|
||||
updated = ad.set_title(ClassifiedAdTitle(title="New Title"))
|
||||
updated = ad.set_title(ClassifiedAdTitle(value="New Title"))
|
||||
|
||||
changes = updated.get_changes()
|
||||
assert len(changes) == 2
|
||||
@@ -340,29 +340,29 @@ def test_update_text_updates_text():
|
||||
ad = ClassifiedAd(
|
||||
id=ClassifiedAdId(value=uuid4()),
|
||||
_ownerId=UserId(value=uuid4()),
|
||||
title=ClassifiedAdTitle(title="Title"),
|
||||
text=ClassifiedAdText(text="Old text"),
|
||||
title=ClassifiedAdTitle(value="Title"),
|
||||
text=ClassifiedAdText(value="Old text"),
|
||||
price=Price(amount=Decimal("10.00")),
|
||||
)
|
||||
new_text = ClassifiedAdText(text="New text")
|
||||
new_text = ClassifiedAdText(value="New text")
|
||||
|
||||
updated = ad.update_text(new_text)
|
||||
|
||||
assert updated.text == new_text
|
||||
assert ad.text == ClassifiedAdText(text="Old text")
|
||||
assert ad.text == ClassifiedAdText(value="Old text")
|
||||
|
||||
|
||||
def test_update_text_fails_when_new_text_empty():
|
||||
ad = ClassifiedAd(
|
||||
id=ClassifiedAdId(value=uuid4()),
|
||||
_ownerId=UserId(value=uuid4()),
|
||||
title=ClassifiedAdTitle(title="Title"),
|
||||
text=ClassifiedAdText(text="Text"),
|
||||
title=ClassifiedAdTitle(value="Title"),
|
||||
text=ClassifiedAdText(value="Text"),
|
||||
price=Price(amount=Decimal("10.00")),
|
||||
)
|
||||
|
||||
with pytest.raises(InvalidEntityStateException) as exc_info:
|
||||
ad.update_text(ClassifiedAdText(text=""))
|
||||
ad.update_text(ClassifiedAdText(value=""))
|
||||
|
||||
assert "text" in str(exc_info.value)
|
||||
|
||||
@@ -371,12 +371,12 @@ def test_update_text_raises_classified_ad_text_updated_event():
|
||||
ad = ClassifiedAd(
|
||||
id=ClassifiedAdId(value=uuid4()),
|
||||
_ownerId=UserId(value=uuid4()),
|
||||
title=ClassifiedAdTitle(title="Title"),
|
||||
text=ClassifiedAdText(text="Old text"),
|
||||
title=ClassifiedAdTitle(value="Title"),
|
||||
text=ClassifiedAdText(value="Old text"),
|
||||
price=Price(amount=Decimal("10.00")),
|
||||
)
|
||||
|
||||
updated = ad.update_text(ClassifiedAdText(text="New text"))
|
||||
updated = ad.update_text(ClassifiedAdText(value="New text"))
|
||||
|
||||
changes = updated.get_changes()
|
||||
assert len(changes) == 2
|
||||
@@ -390,8 +390,8 @@ def test_update_price_updates_price():
|
||||
ad = ClassifiedAd(
|
||||
id=ClassifiedAdId(value=uuid4()),
|
||||
_ownerId=UserId(value=uuid4()),
|
||||
title=ClassifiedAdTitle(title="Title"),
|
||||
text=ClassifiedAdText(text="Text"),
|
||||
title=ClassifiedAdTitle(value="Title"),
|
||||
text=ClassifiedAdText(value="Text"),
|
||||
price=Price(amount=Decimal("10.00")),
|
||||
)
|
||||
new_price = Price(amount=Decimal("25.00"))
|
||||
@@ -406,8 +406,8 @@ def test_update_price_fails_when_price_zero():
|
||||
ad = ClassifiedAd(
|
||||
id=ClassifiedAdId(value=uuid4()),
|
||||
_ownerId=UserId(value=uuid4()),
|
||||
title=ClassifiedAdTitle(title="Title"),
|
||||
text=ClassifiedAdText(text="Text"),
|
||||
title=ClassifiedAdTitle(value="Title"),
|
||||
text=ClassifiedAdText(value="Text"),
|
||||
price=Price(amount=Decimal("10.00")),
|
||||
)
|
||||
|
||||
@@ -421,8 +421,8 @@ def test_update_price_raises_classified_ad_price_updated_event():
|
||||
ad = ClassifiedAd(
|
||||
id=ClassifiedAdId(value=uuid4()),
|
||||
_ownerId=UserId(value=uuid4()),
|
||||
title=ClassifiedAdTitle(title="Title"),
|
||||
text=ClassifiedAdText(text="Text"),
|
||||
title=ClassifiedAdTitle(value="Title"),
|
||||
text=ClassifiedAdText(value="Text"),
|
||||
price=Price(amount=Decimal("10.00")),
|
||||
)
|
||||
|
||||
|
||||
@@ -2,6 +2,6 @@ from domain.marketplace.classified_ad_text import ClassifiedAdText
|
||||
|
||||
|
||||
def test_classified_ad_text_creation():
|
||||
text = ClassifiedAdText(text="This is a classified ad description.")
|
||||
text = ClassifiedAdText(value="This is a classified ad description.")
|
||||
|
||||
assert text.text == "This is a classified ad description."
|
||||
assert text.value == "This is a classified ad description."
|
||||
|
||||
@@ -4,10 +4,13 @@ from domain.marketplace.classified_ad_title import ClassifiedAdTitle
|
||||
|
||||
|
||||
def test_classified_ad_title_creation():
|
||||
title = ClassifiedAdTitle(title="Test Ad")
|
||||
title = ClassifiedAdTitle(value="Test Ad")
|
||||
|
||||
assert title.value == "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")
|
||||
ClassifiedAdTitle(
|
||||
value="efbqzzqmsjdlhkovmnmyykrjvlftrzzaefbqzzqmsjdlhkovmnmyykrjvlftrzzaefbqzzqmsjdlhkovmnmyykrjvlftrzzaefbqzzqmsjdlhkovmnmyykrjvlftrzzaefbqzzqmsjdlhkovmnmyykrjvlftrzza"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user