from unittest import mock import pytest from fansifter_common.adapters.sendgrid.models import MergeTags from fansifter_common.translation.types import Terms from app.models import BatchRecipient, CampaignBatch from app.services.fandata import FanDataService from tests.unit.types import CreateModel, OverrideSettings _DE_TERMS = Terms( optInInfo="", unsubscribe="Abmelden", optInInfoExternal="", profile="Deine Daten verwalten", ) _US_TERMS = Terms(optInInfo="", unsubscribe="Unsubscribe", optInInfoExternal="") class TestFanDataService: @pytest.mark.db def test_get_fans_data( self, service: FanDataService, create_model: CreateModel, override_settings: OverrideSettings, ) -> None: batch = create_model(CampaignBatch) create_model(BatchRecipient, batch_id=batch.id, fan_email="fan@mail.com") with override_settings(send_fansifter_only=False): fans_data = list( service.get_fans_data( campaign_id=batch.campaign_id, batch_id=batch.id, limit=1, offset=0, ) ) assert len(fans_data) == 1 @pytest.mark.db def test_get_fans_data_fansifter_only( self, service: FanDataService, create_model: CreateModel, override_settings: OverrideSettings, ) -> None: batch = create_model(CampaignBatch) create_model( BatchRecipient, batch_id=batch.id, fan_email="fan@sonymusic-pde.com" ) create_model(BatchRecipient, batch_id=batch.id, fan_email="fan@gmail.com") with override_settings(send_fansifter_only=True): fans_data = list( service.get_fans_data( campaign_id=batch.campaign_id, batch_id=batch.id, limit=1, offset=0, ) ) assert len(fans_data) == 1 @pytest.mark.db def test_get_fans_data_de_fan_has_profile_text( self, service: FanDataService, translation_service_mock: mock.MagicMock, create_model: CreateModel, override_settings: OverrideSettings, ) -> None: translation_service_mock.get_translations_by_country_code.side_effect = ( lambda code: {"de": _DE_TERMS} if code == "DE" else {"en": _US_TERMS} ) service._footer_cache.clear() batch = create_model(CampaignBatch) create_model( BatchRecipient, batch_id=batch.id, fan_email="fan@sonymusic-pde.com", fan_country_iso2="DE", ) with override_settings(send_fansifter_only=False): fans_data = list( service.get_fans_data( campaign_id=batch.campaign_id, batch_id=batch.id, limit=1, offset=0, ) ) assert len(fans_data) == 1 assert fans_data[0].profile_text == "Deine Daten verwalten" @pytest.mark.db def test_get_fans_data_non_de_fan_has_no_profile_text( self, service: FanDataService, translation_service_mock: mock.MagicMock, create_model: CreateModel, override_settings: OverrideSettings, ) -> None: translation_service_mock.get_translations_by_country_code.side_effect = ( lambda code: {"de": _DE_TERMS} if code == "DE" else {"en": _US_TERMS} ) service._footer_cache.clear() batch = create_model(CampaignBatch) create_model( BatchRecipient, batch_id=batch.id, fan_email="fan@sonymusic-pde.com", fan_country_iso2="US", ) with override_settings(send_fansifter_only=False): fans_data = list( service.get_fans_data( campaign_id=batch.campaign_id, batch_id=batch.id, limit=1, offset=0, ) ) assert len(fans_data) == 1 assert fans_data[0].profile_text is None @pytest.mark.db def test_get_fans_data_emits_first_name_merge_tag( self, service: FanDataService, create_model: CreateModel, ) -> None: batch = create_model(CampaignBatch) create_model( BatchRecipient, batch_id=batch.id, fan_email="fan@sonymusic-pde.com", fan_first_name="Anna", ) create_model( BatchRecipient, batch_id=batch.id, fan_email="other@sonymusic-pde.com", fan_first_name=None, ) fans_data = list( service.get_fans_data( campaign_id=batch.campaign_id, batch_id=batch.id, limit=10, offset=0, ) ) by_email = {fan.email: fan for fan in fans_data} assert by_email["fan@sonymusic-pde.com"].merge_tags == MergeTags( first_name="Anna" ) assert by_email["other@sonymusic-pde.com"].merge_tags == MergeTags( first_name=None )