import datetime import pytest from dmp.artists.dtos import FansCampaignValue from dmp.artists.handlers import ( GetArtistFansCountByCampaignSummaryHandler, GetArtistFansCountByCampaignSummaryRequest, ) from dmp.fandata.enums import AcquisitionChannel, HeavyRotation from dmp.fandata.models import ( FansByArtistAccountAcquisitionCampaignCountryDailyDbt, FansByArtistAccountAcquisitionCampaignDailyDbt, FansByArtistAccountHeavyRotationDailyDbt, GlobalFansByArtistAcquisitionCampaignCountryDailyDbt, GlobalFansByArtistAcquisitionCampaignDailyDbt, ) from tests.unit.faker import FakerTyped from tests.unit.types import CreateReportingModel class TestGetArtistAccountFansCountByCampaignSummaryHandler: @pytest.mark.db def test_get_artist_fans_count_by_acquisition_campaign_without_country( self, handler: GetArtistFansCountByCampaignSummaryHandler, create_reporting_model: CreateReportingModel, identity_id: str, fake: FakerTyped, ) -> None: start_date = datetime.datetime.now().date() - datetime.timedelta(days=16) end_date = datetime.datetime.now().date() vendor_id = fake.integer() subaccount_id = 0 global_participant_id = fake.uuid4_string() campaign_id_1 = fake.pystr() campaign_name_1 = fake.pystr() campaign_url_1 = fake.url() campaign_id_2 = fake.pystr() campaign_name_2 = fake.pystr() campaign_url_2 = fake.url() timestamp_1 = datetime.date.today() - datetime.timedelta(days=3) timestamp_2 = datetime.date.today() - datetime.timedelta(days=5) timestamp_3 = datetime.date.today() - datetime.timedelta(days=15) create_reporting_model( FansByArtistAccountAcquisitionCampaignDailyDbt, vendor_id=vendor_id, subaccount_id=subaccount_id, global_participant_id=global_participant_id, acquisition_channel=AcquisitionChannel.SHOPIFY, acquisition_campaign_id=campaign_id_1, acquisition_campaign=campaign_name_1, campaign_url=campaign_url_1, acquired_at_date=timestamp_1, daily_running_total_fans_count=100, ) create_reporting_model( FansByArtistAccountAcquisitionCampaignDailyDbt, vendor_id=vendor_id, subaccount_id=subaccount_id, global_participant_id=global_participant_id, acquisition_channel=AcquisitionChannel.SHOPIFY, acquisition_campaign_id=campaign_id_1, acquisition_campaign=campaign_name_1, campaign_url=campaign_url_1, acquired_at_date=timestamp_2, daily_running_total_fans_count=36, ) create_reporting_model( FansByArtistAccountAcquisitionCampaignDailyDbt, vendor_id=vendor_id, subaccount_id=subaccount_id, global_participant_id=global_participant_id, acquisition_channel=AcquisitionChannel.TUNESPEAK, acquisition_campaign_id=campaign_id_2, acquisition_campaign=campaign_name_2, campaign_url=campaign_url_2, acquired_at_date=timestamp_2, daily_running_total_fans_count=20, ) create_reporting_model( FansByArtistAccountAcquisitionCampaignDailyDbt, vendor_id=vendor_id, subaccount_id=subaccount_id, global_participant_id=global_participant_id, acquisition_channel=AcquisitionChannel.TUNESPEAK, acquisition_campaign_id=campaign_id_2, acquisition_campaign=campaign_name_2, campaign_url=campaign_url_2, acquired_at_date=timestamp_3, daily_running_total_fans_count=55, ) result = handler.handle( GetArtistFansCountByCampaignSummaryRequest( identity_id=identity_id, vendor_id=vendor_id, subaccount_id=subaccount_id, global_participant_id=global_participant_id, start_date=start_date, end_date=end_date, ), ) assert result == [ FansCampaignValue( id=campaign_id_1, name=campaign_name_1, url=campaign_url_1, channel=AcquisitionChannel.SHOPIFY, date=timestamp_2, value=100, ), FansCampaignValue( id=campaign_id_2, name=campaign_name_2, url=campaign_url_2, channel=AcquisitionChannel.TUNESPEAK, date=timestamp_3, value=55, ), ] @pytest.mark.db def test_get_artist_fans_count_by_acquisition_campaign_with_country( self, handler: GetArtistFansCountByCampaignSummaryHandler, create_reporting_model: CreateReportingModel, identity_id: str, fake: FakerTyped, ) -> None: start_date = datetime.datetime.now().date() - datetime.timedelta(days=16) end_date = datetime.datetime.now().date() campaign_id_1 = fake.pystr() campaign_name_1 = fake.pystr() campaign_url_1 = fake.url() campaign_id_2 = fake.pystr() campaign_name_2 = fake.pystr() campaign_url_2 = fake.url() campaign_id_3 = fake.pystr() campaign_name_3 = fake.pystr() campaign_url_3 = fake.url() vendor_id = fake.integer() subaccount_id = 0 global_participant_id = fake.uuid4_string() country_1 = "US" country_2 = "EE" timestamp_1 = datetime.datetime.now() - datetime.timedelta(days=3) timestamp_2 = datetime.datetime.now() - datetime.timedelta(days=5) timestamp_3 = datetime.datetime.now() - datetime.timedelta(days=15) create_reporting_model( FansByArtistAccountAcquisitionCampaignCountryDailyDbt, vendor_id=vendor_id, subaccount_id=subaccount_id, global_participant_id=global_participant_id, acquisition_campaign_id=campaign_id_1, acquisition_campaign=campaign_name_1, campaign_url=campaign_url_1, acquisition_channel=AcquisitionChannel.SHOPIFY, acquired_at_date=timestamp_1, country_iso2=country_1, daily_running_total_fans_count=100, ) create_reporting_model( FansByArtistAccountAcquisitionCampaignCountryDailyDbt, vendor_id=vendor_id, subaccount_id=subaccount_id, global_participant_id=global_participant_id, acquisition_campaign_id=campaign_id_2, acquisition_campaign=campaign_name_2, campaign_url=campaign_url_2, acquisition_channel=AcquisitionChannel.SMF_UNCATEGORIZED, acquired_at_date=timestamp_1, country_iso2=country_1, daily_running_total_fans_count=150, ) create_reporting_model( FansByArtistAccountAcquisitionCampaignCountryDailyDbt, vendor_id=vendor_id, subaccount_id=subaccount_id, global_participant_id=global_participant_id, acquisition_campaign_id=campaign_id_3, acquisition_campaign=campaign_name_3, campaign_url=campaign_url_3, acquisition_channel=AcquisitionChannel.MAKE_THE_LINK, acquired_at_date=timestamp_2, country_iso2=country_1, daily_running_total_fans_count=200, ) create_reporting_model( FansByArtistAccountAcquisitionCampaignCountryDailyDbt, vendor_id=vendor_id, subaccount_id=subaccount_id, global_participant_id=global_participant_id, acquisition_campaign_id=campaign_id_3, acquisition_campaign=campaign_name_3, campaign_url=campaign_url_3, acquisition_channel=AcquisitionChannel.MAKE_THE_LINK, acquired_at_date=timestamp_3, country_iso2=country_2, daily_running_total_fans_count=650, ) result = handler.handle( GetArtistFansCountByCampaignSummaryRequest( identity_id=identity_id, vendor_id=vendor_id, subaccount_id=subaccount_id, global_participant_id=global_participant_id, start_date=start_date, end_date=end_date, countries=[country_1], ), ) assert result == [ FansCampaignValue( id=campaign_id_1, name=campaign_name_1, url=campaign_url_1, channel=AcquisitionChannel.SHOPIFY, date=timestamp_1.date(), value=100, ), FansCampaignValue( id=campaign_id_2, name=campaign_name_2, url=campaign_url_2, channel=AcquisitionChannel.SMF_UNCATEGORIZED, date=timestamp_1.date(), value=150, ), FansCampaignValue( id=campaign_id_3, name=campaign_name_3, url=campaign_url_3, channel=AcquisitionChannel.MAKE_THE_LINK, date=timestamp_2.date(), value=200, ), ] @pytest.mark.db def test_get_artist_fans_count_by_acquisition_channel_empty( self, handler: GetArtistFansCountByCampaignSummaryHandler, create_reporting_model: CreateReportingModel, identity_id: str, fake: FakerTyped, ) -> None: vendor_id = fake.integer() subaccount_id = 0 global_participant_id = fake.uuid4_string() start_date = datetime.datetime.now().date() - datetime.timedelta(days=25) end_date = datetime.datetime.now().date() - datetime.timedelta(days=6) create_reporting_model( FansByArtistAccountHeavyRotationDailyDbt, vendor_id=vendor_id, subaccount_id=subaccount_id, global_participant_id=global_participant_id, heavy_rotation=HeavyRotation.IN, report_date=datetime.datetime.now() - datetime.timedelta(days=10), daily_running_total_fans_count=10, ) result = handler.handle( GetArtistFansCountByCampaignSummaryRequest( identity_id=identity_id, vendor_id=vendor_id, subaccount_id=subaccount_id, global_participant_id=global_participant_id, start_date=start_date, end_date=end_date, ), ) assert result == [] class TestGetArtistGlobalFansCountByTypeSummaryHandler: @pytest.mark.db @pytest.mark.artist_access(is_global=True) def test_get_artist_fans_count_by_acquisition_channel_without_country( self, handler: GetArtistFansCountByCampaignSummaryHandler, create_reporting_model: CreateReportingModel, identity_id: str, fake: FakerTyped, ) -> None: campaign_id_1 = fake.pystr() campaign_name_1 = fake.pystr() campaign_url_1 = fake.url() campaign_id_2 = fake.pystr() campaign_name_2 = fake.pystr() campaign_url_2 = fake.url() start_date = datetime.date.today() - datetime.timedelta(days=6) end_date = datetime.date.today() global_participant_id = fake.uuid4_string() timestamp_1 = datetime.date.today() - datetime.timedelta(days=3) timestamp_2 = datetime.date.today() - datetime.timedelta(days=5) timestamp_3 = datetime.date.today() - datetime.timedelta(days=15) create_reporting_model( GlobalFansByArtistAcquisitionCampaignDailyDbt, global_participant_id=global_participant_id, acquisition_channel=AcquisitionChannel.SHOPIFY, acquisition_campaign_id=campaign_id_1, acquisition_campaign=campaign_name_1, campaign_url=campaign_url_1, acquired_at_date=timestamp_1, daily_running_total_fans_count=100, ) create_reporting_model( GlobalFansByArtistAcquisitionCampaignDailyDbt, global_participant_id=global_participant_id, acquisition_channel=AcquisitionChannel.SHOPIFY, acquisition_campaign_id=campaign_id_1, acquisition_campaign=campaign_name_1, campaign_url=campaign_url_1, acquired_at_date=timestamp_2, daily_running_total_fans_count=36, ) create_reporting_model( GlobalFansByArtistAcquisitionCampaignDailyDbt, global_participant_id=global_participant_id, acquisition_channel=AcquisitionChannel.TUNESPEAK, acquisition_campaign_id=campaign_id_2, acquisition_campaign=campaign_name_2, campaign_url=campaign_url_2, acquired_at_date=timestamp_2, daily_running_total_fans_count=20, ) create_reporting_model( GlobalFansByArtistAcquisitionCampaignDailyDbt, global_participant_id=global_participant_id, acquisition_channel=AcquisitionChannel.TUNESPEAK, acquisition_campaign_id=campaign_id_2, acquisition_campaign=campaign_name_2, campaign_url=campaign_url_2, acquired_at_date=timestamp_3, daily_running_total_fans_count=55, ) result = handler.handle( GetArtistFansCountByCampaignSummaryRequest( identity_id=identity_id, vendor_id=None, subaccount_id=None, global_participant_id=global_participant_id, start_date=start_date, end_date=end_date, ), ) assert result == [ FansCampaignValue( channel=AcquisitionChannel.SHOPIFY, value=100, id=campaign_id_1, name=campaign_name_1, url=campaign_url_1, date=datetime.date.today() - datetime.timedelta(days=5), ), FansCampaignValue( channel=AcquisitionChannel.TUNESPEAK, value=55, id=campaign_id_2, name=campaign_name_2, url=campaign_url_2, date=datetime.date.today() - datetime.timedelta(days=15), ), ] @pytest.mark.db @pytest.mark.artist_access(is_global=True) def test_get_artist_fans_count_by_acquisition_channel_with_country( self, handler: GetArtistFansCountByCampaignSummaryHandler, create_reporting_model: CreateReportingModel, identity_id: str, fake: FakerTyped, ) -> None: campaign_id_1 = fake.pystr() campaign_name_1 = fake.pystr() campaign_url_1 = fake.pystr() campaign_id_2 = fake.pystr() campaign_name_2 = fake.pystr() campaign_url_2 = fake.pystr() campaign_id_3 = fake.pystr() campaign_name_3 = fake.pystr() campaign_url_3 = fake.pystr() campaign_id_4 = fake.pystr() campaign_name_4 = fake.pystr() campaign_url_4 = fake.pystr() start_date = datetime.datetime.now().date() - datetime.timedelta(days=16) end_date = datetime.datetime.now().date() global_participant_id = fake.uuid4_string() country_1 = "US" country_2 = "GB" timestamp_1 = datetime.datetime.now() - datetime.timedelta(days=3) timestamp_2 = datetime.datetime.now() - datetime.timedelta(days=5) timestamp_3 = datetime.datetime.now() - datetime.timedelta(days=15) create_reporting_model( GlobalFansByArtistAcquisitionCampaignCountryDailyDbt, global_participant_id=global_participant_id, acquisition_channel=AcquisitionChannel.SHOPIFY, acquisition_campaign_id=campaign_id_1, acquisition_campaign=campaign_name_1, campaign_url=campaign_url_1, acquired_at_date=timestamp_1, country_iso2=country_1, daily_running_total_fans_count=100, ) create_reporting_model( GlobalFansByArtistAcquisitionCampaignCountryDailyDbt, global_participant_id=global_participant_id, acquisition_channel=AcquisitionChannel.SMF_UNCATEGORIZED, acquisition_campaign_id=campaign_id_2, acquisition_campaign=campaign_name_2, campaign_url=campaign_url_2, acquired_at_date=timestamp_1, country_iso2=country_1, daily_running_total_fans_count=150, ) create_reporting_model( GlobalFansByArtistAcquisitionCampaignCountryDailyDbt, global_participant_id=global_participant_id, acquisition_channel=AcquisitionChannel.MAKE_THE_LINK, acquisition_campaign_id=campaign_id_3, acquisition_campaign=campaign_name_3, campaign_url=campaign_url_3, acquired_at_date=timestamp_2, country_iso2=country_1, daily_running_total_fans_count=200, ) create_reporting_model( GlobalFansByArtistAcquisitionCampaignCountryDailyDbt, global_participant_id=global_participant_id, acquisition_channel=AcquisitionChannel.TUNESPEAK, acquisition_campaign_id=campaign_id_4, acquisition_campaign=campaign_name_4, campaign_url=campaign_url_4, acquired_at_date=timestamp_3, country_iso2=country_2, daily_running_total_fans_count=500, ) result = handler.handle( GetArtistFansCountByCampaignSummaryRequest( identity_id=identity_id, vendor_id=None, subaccount_id=None, global_participant_id=global_participant_id, start_date=start_date, end_date=end_date, countries=["GB"], ), ) assert result == [ FansCampaignValue( channel=AcquisitionChannel.TUNESPEAK, id=campaign_id_4, name=campaign_name_4, url=campaign_url_4, value=500, date=datetime.date.today() - datetime.timedelta(days=15), ) ] @pytest.mark.db @pytest.mark.artist_access(is_global=True) def test_get_artist_fans_count_by_acquisition_campaign_with_country( self, handler: GetArtistFansCountByCampaignSummaryHandler, create_reporting_model: CreateReportingModel, identity_id: str, fake: FakerTyped, ) -> None: start_date = datetime.datetime.now().date() - datetime.timedelta(days=16) end_date = datetime.datetime.now().date() global_participant_id = fake.uuid4_string() country_1 = "US" country_2 = "GB" campaign_1_id = fake.uuid4_string() campaign_2_id = fake.uuid4_string() campaign_1_name = fake.pystr() campaign_2_name = fake.pystr() campaign_1_url = fake.url() campaign_2_url = fake.url() timestamp_1 = datetime.datetime.now() - datetime.timedelta(days=3) timestamp_2 = datetime.datetime.now() - datetime.timedelta(days=5) timestamp_3 = datetime.datetime.now() - datetime.timedelta(days=15) create_reporting_model( GlobalFansByArtistAcquisitionCampaignCountryDailyDbt, global_participant_id=global_participant_id, acquisition_channel=AcquisitionChannel.SHOPIFY, acquisition_campaign_id=campaign_1_id, acquisition_campaign=campaign_1_name, campaign_url=campaign_1_url, acquired_at_date=timestamp_1, country_iso2=country_1, daily_running_total_fans_count=100, ) create_reporting_model( GlobalFansByArtistAcquisitionCampaignCountryDailyDbt, global_participant_id=global_participant_id, acquisition_channel=AcquisitionChannel.SMF_UNCATEGORIZED, acquisition_campaign_id=campaign_2_id, acquisition_campaign=campaign_2_name, campaign_url=campaign_2_url, acquired_at_date=timestamp_1, country_iso2=country_1, daily_running_total_fans_count=150, ) create_reporting_model( GlobalFansByArtistAcquisitionCampaignCountryDailyDbt, global_participant_id=global_participant_id, acquisition_channel=AcquisitionChannel.SHOPIFY, acquisition_campaign_id=campaign_1_id, acquisition_campaign=campaign_1_name, campaign_url=campaign_1_url, acquired_at_date=timestamp_2, country_iso2=country_1, daily_running_total_fans_count=100, ) create_reporting_model( GlobalFansByArtistAcquisitionCampaignCountryDailyDbt, global_participant_id=global_participant_id, acquisition_channel=AcquisitionChannel.SMF_UNCATEGORIZED, acquisition_campaign_id=campaign_2_id, acquisition_campaign=campaign_2_name, campaign_url=campaign_2_url, acquired_at_date=timestamp_3, country_iso2=country_2, daily_running_total_fans_count=150, ) result = handler.handle( GetArtistFansCountByCampaignSummaryRequest( identity_id=identity_id, vendor_id=None, subaccount_id=None, global_participant_id=global_participant_id, start_date=start_date, end_date=end_date, countries=["US"], ), ) assert result == [ FansCampaignValue( id=campaign_1_id, name=campaign_1_name, url=campaign_1_url, channel=AcquisitionChannel.SHOPIFY, date=timestamp_2.date(), value=100, ), FansCampaignValue( id=campaign_2_id, name=campaign_2_name, url=campaign_2_url, channel=AcquisitionChannel.SMF_UNCATEGORIZED, date=timestamp_1.date(), value=150, ), ]