import datetime import pytest from dirty_equals import IsList from fansifter_common.auth.identity import Identity from dmp.audiences.dtos import AudienceCriteria from dmp.audiences.enums import AudienceTarget from dmp.audiences.filters import AudienceFilters from dmp.audiences.models import AudienceEmailFan from dmp.audiences.repositories import AudienceEmailFanRepository from dmp.audiences.types import FanDataListId from dmp.fandata.models import ( AudienceFiltersCustomListEmailCampaignDbt, AudienceFiltersEmailCampaignDbt, EmailDomainToISPMapping, FanPersonalDataDbt, ) from tests.unit.faker import FakerTyped from tests.unit.types import CreateReportingModel class TestAudienceEmailFanRepository: @pytest.mark.db def test_insert_bulk( self, repository: AudienceEmailFanRepository, create_reporting_model: CreateReportingModel, fake: FakerTyped, identity: Identity, ) -> None: global_participant_id = fake.uuid4_string() vendor_id = fake.integer() subaccount_id = fake.integer() audience_id = fake.uuid4_string() custom_list_id = fake.pystr() fan_without_engagement = create_reporting_model( AudienceFiltersEmailCampaignDbt, global_participant_id=global_participant_id, vendor_id=vendor_id, subaccount_id=subaccount_id, last_email_event_date=None, ) fan = create_reporting_model( AudienceFiltersEmailCampaignDbt, global_participant_id=global_participant_id, vendor_id=vendor_id, subaccount_id=subaccount_id, last_email_event_date=datetime.datetime(2022, 2, 24, tzinfo=datetime.UTC), ) create_reporting_model( AudienceFiltersCustomListEmailCampaignDbt, fan_id=fan.fan_id, custom_list_id=custom_list_id, vendor_id=vendor_id, subaccount_id=subaccount_id, last_email_event_date=datetime.datetime(2020, 1, 1, tzinfo=datetime.UTC), ) fan_count = repository.insert_bulk( audience_id=audience_id, criteria=AudienceCriteria( vendor_id=vendor_id, subaccount_id=subaccount_id, fandata_list_ids=[ FanDataListId.from_artist_id(global_participant_id), FanDataListId.from_custom_list_id(custom_list_id), ], identity=identity, filters=AudienceFilters.model_construct(), target=AudienceTarget.EMAIL, ), ) assert fan_count == 2 assert repository.all() == IsList( AudienceEmailFan( audience_id=audience_id, fan_id=fan.fan_id, last_engagement_at=fan.last_email_event_date, ), AudienceEmailFan( audience_id=audience_id, fan_id=fan_without_engagement.fan_id, ), check_order=False, ) @pytest.mark.db def test_get_recipients_count_by_email_provider( self, repository: AudienceEmailFanRepository, create_reporting_model: CreateReportingModel, fake: FakerTyped, identity: Identity, ) -> None: global_participant_id = fake.uuid4_string() vendor_id = fake.integer() subaccount_id = fake.integer() create_reporting_model(EmailDomainToISPMapping, domain="gmail.com", isp="gmail") create_reporting_model( EmailDomainToISPMapping, domain="google.com", isp="gmail" ) create_reporting_model(EmailDomainToISPMapping, domain="yahoo.com", isp="yahoo") fan = create_reporting_model( AudienceFiltersEmailCampaignDbt, global_participant_id=global_participant_id, vendor_id=vendor_id, subaccount_id=subaccount_id, ) create_reporting_model( FanPersonalDataDbt, fan_id=fan.fan_id, fan_email="google_fan@google.com", fan_email_domain="google.com", ) for i in range(5): fan = create_reporting_model( AudienceFiltersEmailCampaignDbt, global_participant_id=global_participant_id, vendor_id=vendor_id, subaccount_id=subaccount_id, ) create_reporting_model( FanPersonalDataDbt, fan_id=fan.fan_id, fan_email=f"user{i}@gmail.com", fan_email_domain="gmail.com", ) for i in range(2): fan = create_reporting_model( AudienceFiltersEmailCampaignDbt, global_participant_id=global_participant_id, vendor_id=vendor_id, subaccount_id=subaccount_id, ) create_reporting_model( FanPersonalDataDbt, fan_id=fan.fan_id, fan_email=f"user{i}@yahoo.com", fan_email_domain="yahoo.com", ) for i, domain in enumerate(["example.com", "test.org", "custom.net"]): fan = create_reporting_model( AudienceFiltersEmailCampaignDbt, global_participant_id=global_participant_id, vendor_id=vendor_id, subaccount_id=subaccount_id, ) create_reporting_model( FanPersonalDataDbt, fan_id=fan.fan_id, fan_email=f"user{i}@{domain}", fan_email_domain=domain, ) result = repository.get_recipients_count_by_email_provider( criteria=AudienceCriteria( vendor_id=vendor_id, subaccount_id=subaccount_id, fandata_list_ids=[ FanDataListId.from_artist_id(global_participant_id), ], identity=identity, filters=AudienceFilters.model_construct(), target=AudienceTarget.EMAIL, ), ) assert result == {"gmail": 6, "yahoo": 2, "OTHER": 3} @pytest.mark.db def test_get_recipients_count_by_email_provider_empty( self, repository: AudienceEmailFanRepository, fake: FakerTyped, identity: Identity, ) -> None: result = repository.get_recipients_count_by_email_provider( criteria=AudienceCriteria( vendor_id=fake.integer(), subaccount_id=fake.integer(), fandata_list_ids=[ FanDataListId.from_artist_id(fake.uuid4_string()), ], identity=identity, filters=AudienceFilters.model_construct(), target=AudienceTarget.EMAIL, ), ) assert result == {}