- Replace deprecated datetime.utcnow() with datetime.now(UTC) in model and repository - Add listing_type validation to decision_service (RENT/BUY only) - Fix decision filtering tests failing due to rate limiting by patching _match_endpoint - Add SwipeCard component test suite (11 tests covering rendering, interactions, and POI distances) - Add test for invalid listing_type validation
90 lines
3.1 KiB
Python
90 lines
3.1 KiB
Python
"""Unit tests for decision_service."""
|
|
from unittest.mock import MagicMock
|
|
import pytest
|
|
|
|
from models.decision import ListingDecision
|
|
from services import decision_service
|
|
|
|
|
|
class TestSetDecision:
|
|
def test_set_liked(self) -> None:
|
|
repo = MagicMock()
|
|
repo.upsert_decision.return_value = ListingDecision(
|
|
id=1, user_id=1, listing_id=100, listing_type="RENT", decision="liked"
|
|
)
|
|
result = decision_service.set_decision(
|
|
repo, user_id=1, listing_id=100,
|
|
listing_type="RENT", decision="liked",
|
|
)
|
|
assert result.decision == "liked"
|
|
repo.upsert_decision.assert_called_once_with(
|
|
user_id=1, listing_id=100, listing_type="RENT", decision="liked"
|
|
)
|
|
|
|
def test_set_disliked(self) -> None:
|
|
repo = MagicMock()
|
|
repo.upsert_decision.return_value = ListingDecision(
|
|
id=1, user_id=1, listing_id=100, listing_type="RENT", decision="disliked"
|
|
)
|
|
result = decision_service.set_decision(
|
|
repo, user_id=1, listing_id=100,
|
|
listing_type="RENT", decision="disliked",
|
|
)
|
|
assert result.decision == "disliked"
|
|
|
|
def test_invalid_decision_raises(self) -> None:
|
|
repo = MagicMock()
|
|
with pytest.raises(ValueError, match="Invalid decision"):
|
|
decision_service.set_decision(
|
|
repo, user_id=1, listing_id=100,
|
|
listing_type="RENT", decision="maybe",
|
|
)
|
|
|
|
def test_invalid_listing_type_raises(self) -> None:
|
|
repo = MagicMock()
|
|
with pytest.raises(ValueError, match="Invalid listing_type"):
|
|
decision_service.set_decision(
|
|
repo, user_id=1, listing_id=100,
|
|
listing_type="SELL", decision="liked",
|
|
)
|
|
|
|
|
|
class TestGetDecisions:
|
|
def test_returns_all_decisions(self) -> None:
|
|
repo = MagicMock()
|
|
repo.get_decisions_for_user.return_value = [
|
|
ListingDecision(
|
|
id=1, user_id=1, listing_id=100,
|
|
listing_type="RENT", decision="liked",
|
|
),
|
|
]
|
|
result = decision_service.get_decisions(repo, user_id=1)
|
|
assert len(result) == 1
|
|
|
|
|
|
class TestClearDecision:
|
|
def test_clear_existing(self) -> None:
|
|
repo = MagicMock()
|
|
repo.delete_decision.return_value = True
|
|
result = decision_service.clear_decision(
|
|
repo, user_id=1, listing_id=100, listing_type="RENT"
|
|
)
|
|
assert result is True
|
|
|
|
def test_clear_nonexistent(self) -> None:
|
|
repo = MagicMock()
|
|
repo.delete_decision.return_value = False
|
|
result = decision_service.clear_decision(
|
|
repo, user_id=1, listing_id=100, listing_type="RENT"
|
|
)
|
|
assert result is False
|
|
|
|
|
|
class TestGetDislikedListingIds:
|
|
def test_returns_disliked_set(self) -> None:
|
|
repo = MagicMock()
|
|
repo.get_disliked_listing_ids.return_value = {200, 300}
|
|
result = decision_service.get_disliked_listing_ids(
|
|
repo, user_id=1, listing_type="RENT"
|
|
)
|
|
assert result == {200, 300}
|