"""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( 1, 100, "RENT", "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_user_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.remove_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.remove_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_ids( repo, user_id=1, listing_type="RENT" ) assert result == {200, 300}