feat: add RequestToPublish to ClassifiedAd with state management

This commit is contained in:
2026-07-29 01:37:34 -04:00
parent d098a84b03
commit 3bae739bc0
5 changed files with 134 additions and 0 deletions

View File

@@ -5,8 +5,12 @@ import pytest
from domain.marketplace.classified_ad import ClassifiedAd
from domain.marketplace.classified_ad_id import ClassifiedAdId
from domain.marketplace.classified_ad_state import ClassifiedAdState
from domain.marketplace.classified_ad_text import ClassifiedAdText
from domain.marketplace.classified_ad_title import ClassifiedAdTitle
from domain.marketplace.invalid_entity_state_exception import (
InvalidEntityStateException,
)
from domain.marketplace.price import Price
from domain.marketplace.user_id import UserId
@@ -127,3 +131,91 @@ def test_classified_ad_title_validation():
text=ClassifiedAdText(text="Text"),
price=Price(amount=Decimal("10.00")),
)
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"),
price=Price(amount=Decimal("10.00")),
)
published = ad.request_to_publish()
assert published.state == ClassifiedAdState.PendingReview
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"),
price=Price(amount=Decimal("10.00")),
)
with pytest.raises(InvalidEntityStateException) as exc_info:
ad.request_to_publish()
assert "title" in str(exc_info.value)
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=""),
price=Price(amount=Decimal("10.00")),
)
with pytest.raises(InvalidEntityStateException) as exc_info:
ad.request_to_publish()
assert "text" in str(exc_info.value)
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"),
)
with pytest.raises(InvalidEntityStateException) as exc_info:
ad.request_to_publish()
assert "price" in str(exc_info.value)
def test_request_to_publish_reports_all_errors():
ad = ClassifiedAd(
id=ClassifiedAdId(value=uuid4()),
_ownerId=UserId(value=uuid4()),
title=ClassifiedAdTitle(title=""),
text=ClassifiedAdText(text=""),
)
with pytest.raises(InvalidEntityStateException) as exc_info:
ad.request_to_publish()
assert "title" in str(exc_info.value)
assert "text" in str(exc_info.value)
assert "price" in str(exc_info.value)
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"),
price=Price(amount=Decimal("10.00")),
)
ad.request_to_publish()
assert ad.state is None