import pytest from fansifter_common.auth.account import Account from ows_text_campaigns.campaigns.handlers import ( GetCampaignAnalyticsHandler, GetCampaignAnalyticsRequest, ) from ows_text_campaigns.campaigns.models import ( Campaign, CampaignSendsCountryAggregated, TextAnalyticsBenchmarkByAccountArtist, TextCampaignUnsubscribe, UrlShortenerClicksGenderAgeAggregated, ) from tests.unit.types import CreateModel class TestGetCampaignAnalyticsHandler: @pytest.mark.db def test_get_campaign_analytics_no_data( self, handler: GetCampaignAnalyticsHandler, create_model: CreateModel, identity_id: str, account: Account, ) -> None: url = "https://example.com/test-path" campaign = create_model( Campaign, vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, content=f""" short_link """, ) result = handler.handle( GetCampaignAnalyticsRequest( identity_id=identity_id, campaign_id=campaign.id, vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, ) ) assert result is not None assert result.campaign_id == campaign.id assert result.sends == 0 assert result.clicks == 0 assert result.click_through_rate == 0 assert result.unsubscribe_rate == 0 assert result.unsubscribe_rate_change is None assert result.delivery_rate == 0 assert result.delivery_rate_change is None assert result.delivery_failed_rate == 0 assert result.delivery_failed_rate_change is None assert result.locations is None @pytest.mark.db def test_get_campaign_analytics_no_short_links( self, handler: GetCampaignAnalyticsHandler, create_model: CreateModel, identity_id: str, account: Account, ) -> None: url = "https://example.com/test-path" campaign = create_model( Campaign, vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, content=f'long_link', ) result = handler.handle( GetCampaignAnalyticsRequest( identity_id=identity_id, campaign_id=campaign.id, vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, ) ) assert result is not None assert result.campaign_id == campaign.id assert result.sends == 0 assert result.clicks is None assert result.click_through_rate is None assert result.unsubscribe_rate == 0 assert result.unsubscribe_rate_change is None assert result.delivery_rate == 0 assert result.delivery_rate_change is None assert result.delivery_failed_rate == 0 assert result.delivery_failed_rate_change is None assert result.locations is None @pytest.mark.db def test_get_campaign_analytics( self, handler: GetCampaignAnalyticsHandler, create_model: CreateModel, identity_id: str, account: Account, ) -> None: url = "https://example.com/test-path" campaign = create_model( Campaign, vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, content=f""" short_link """, ) sends = create_model( CampaignSendsCountryAggregated, campaign_id=campaign.id, sends=10, delivered=5, failed=5, ) create_model( TextCampaignUnsubscribe, campaign_id=campaign.id, unsubscribes=2, ) create_model( UrlShortenerClicksGenderAgeAggregated, campaign_id=campaign.id, clicks=5, redirect_url=url, ) result = handler.handle( GetCampaignAnalyticsRequest( identity_id=identity_id, campaign_id=campaign.id, vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, ) ) assert result is not None assert result.campaign_id == campaign.id assert result.sends == 10 assert result.clicks == 5 assert result.click_through_rate == 0.5 assert result.delivery_rate == 0.5 assert result.delivery_failed_rate == 0.5 assert result.delivery_rate_change is None assert result.delivery_failed_rate_change is None assert result.unsubscribe_rate == 0.2 # TODO assert result.unsubscribe_rate_change is None assert result.locations is not None assert result.locations[0].sends == sends.sends assert result.locations[0].country_code == sends.country_code assert result.locations[0].clicks is None @pytest.mark.db def test_get_campaign_analytics_rates_change( self, handler: GetCampaignAnalyticsHandler, create_model: CreateModel, identity_id: str, account: Account, ) -> None: url = "https://example.com/test-path" campaign = create_model( Campaign, vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, content=f""" short_link """, ) create_model( CampaignSendsCountryAggregated, campaign_id=campaign.id, sends=10, delivered=5, failed=5, ) create_model( UrlShortenerClicksGenderAgeAggregated, campaign_id=campaign.id, clicks=5, redirect_url=url, ) create_model( TextAnalyticsBenchmarkByAccountArtist, vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, global_participant_id=campaign.global_participant_id, avg_delivery_rate=1, avg_delivery_failed_rate=1, ) result = handler.handle( GetCampaignAnalyticsRequest( identity_id=identity_id, campaign_id=campaign.id, vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, ) ) assert result is not None assert result.campaign_id == campaign.id assert result.sends == 10 assert result.clicks == 5 assert result.click_through_rate == 0.5 assert result.delivery_rate == 0.5 assert result.delivery_failed_rate == 0.5 assert result.delivery_rate_change == -0.5 assert result.delivery_failed_rate_change == -0.5 assert result.unsubscribe_rate == 0 # TODO assert result.unsubscribe_rate_change is None