import pytest from faker import Faker from email_campaigns.automated.handlers.get_automated_email_link_analytics import ( GetAutomatedEmailLinkAnalyticsHandler, ) from email_campaigns.automated.models import AutomatedEmail from email_campaigns.emails.exceptions import EmailNotFoundError from email_campaigns.emails.handlers import GetEmailLinkAnalyticsRequest from email_campaigns.emails.models import ( EmailAnalyticsBenchmarkByAccountArtistV2Dbt, EmailAnalyticsBenchmarkByLinktV3Dbt, EmailAnalyticsV3Dbt, ) from tests.unit.types import CreateModel class TestGetAutomatedEmailLinkAnalyticsHandler: @pytest.mark.db def test_get_automated_email_link_analytics( self, handler: GetAutomatedEmailLinkAnalyticsHandler, create_model: CreateModel, identity_id: str, ) -> None: automated_email = create_model( AutomatedEmail, name="Test Automated Email", custom_list_id=None ) create_model( EmailAnalyticsV3Dbt, email_id=automated_email.id, email_type=automated_email.email_type, sends=10, drops=0, delivered=10, opens=6, clicks=3, unique_opens=6, unique_clicks=3, unique_bounces=0, unique_spam_complaints=1, unsubscribes=0, open_rate=0.6, delivered_rate=1.0, click_through_rate=0.3, click_to_open_rate=0.3, bounce_rate=0.0, spam_complaints_rate=0.1, unsubscribe_rate=0.0, unique_opens_dropoff=0.6, unique_clicks_dropoff=0.5, ) create_model( EmailAnalyticsBenchmarkByAccountArtistV2Dbt, vendor_id=automated_email.vendor_id, subaccount_id=automated_email.subaccount_id, email_type=automated_email.email_type, global_participant_id=automated_email.global_participant_id, custom_list_id=automated_email.custom_list_id, avg_open_rate=0.8, avg_click_through_rate=0.8, avg_bounce_rate=0.1, avg_delivered_rate=0.9, avg_unique_clicks=6.0, avg_click_to_open_rate=0.2, avg_spam_complaints_rate=0.1, avg_unsubscribe_rate=0.0, ) url1 = create_model( EmailAnalyticsBenchmarkByLinktV3Dbt, email_id=automated_email.id, email_type=automated_email.email_type, url="http://www.awesome-artist.com", total_clicks=100, unique_clicks=50, percentage_of_total_clicks=0.4, ) url2 = create_model( EmailAnalyticsBenchmarkByLinktV3Dbt, email_id=automated_email.id, email_type=automated_email.email_type, url="http://facebook.com/tickets", total_clicks=150, unique_clicks=100, percentage_of_total_clicks=0.6, ) response = handler.handle( GetEmailLinkAnalyticsRequest( email_id=automated_email.id, identity_id=identity_id, ), ) assert response.data == [ { "url": url2.url, "total_clicks": url2.total_clicks, "unique_clicks": url2.unique_clicks, "percentage_of_total_clicks": url2.percentage_of_total_clicks, }, { "url": url1.url, "total_clicks": url1.total_clicks, "unique_clicks": url1.unique_clicks, "percentage_of_total_clicks": url1.percentage_of_total_clicks, }, ] @pytest.mark.db def test_get_automated_email_link_analytics_wrong_automated_email_id( self, handler: GetAutomatedEmailLinkAnalyticsHandler, identity_id: str, faker: Faker, ) -> None: automated_email_id = faker.uuid4() with pytest.raises(EmailNotFoundError): handler.handle( GetEmailLinkAnalyticsRequest( email_id=automated_email_id, identity_id=identity_id, ), ) @pytest.mark.db def test_get_automated_email_link_analytics_empty_automated_email_id( self, handler: GetAutomatedEmailLinkAnalyticsHandler, identity_id: str, ) -> None: automated_email_id = "" with pytest.raises(EmailNotFoundError): handler.handle( GetEmailLinkAnalyticsRequest( email_id=automated_email_id, identity_id=identity_id, ), ) @pytest.mark.db def test_get_automated_email_link_analytics_no_links( self, handler: GetAutomatedEmailLinkAnalyticsHandler, create_model: CreateModel, identity_id: str, ) -> None: automated_email = create_model(AutomatedEmail, name="Test Automated Email") response = handler.handle( GetEmailLinkAnalyticsRequest( email_id=automated_email.id, identity_id=identity_id, ), ) assert response.data is None @pytest.mark.db def test_get_automated_email_link_analytics_for_custom_list( self, handler: GetAutomatedEmailLinkAnalyticsHandler, create_model: CreateModel, identity_id: str, ) -> None: custom_list_id = "abcde12345" automated_email = create_model( AutomatedEmail, name="Test Automated Email", global_participant_id=None, custom_list_id=custom_list_id, ) create_model( EmailAnalyticsV3Dbt, email_id=automated_email.id, email_type=automated_email.email_type, sends=10, drops=0, delivered=10, opens=6, clicks=3, unique_opens=6, unique_clicks=3, unique_bounces=0, unique_spam_complaints=1, unsubscribes=0, open_rate=0.6, delivered_rate=1.0, click_through_rate=0.3, click_to_open_rate=0.3, bounce_rate=0.0, spam_complaints_rate=0.1, unsubscribe_rate=0.0, unique_opens_dropoff=0.6, unique_clicks_dropoff=0.5, ) create_model( EmailAnalyticsBenchmarkByAccountArtistV2Dbt, vendor_id=automated_email.vendor_id, subaccount_id=automated_email.subaccount_id, email_type=automated_email.email_type, global_participant_id=automated_email.global_participant_id, custom_list_id=automated_email.custom_list_id, avg_open_rate=0.8, avg_click_through_rate=0.8, avg_bounce_rate=0.1, avg_delivered_rate=0.9, avg_unique_clicks=6.0, avg_click_to_open_rate=0.2, avg_spam_complaints_rate=0.1, avg_unsubscribe_rate=0.0, ) url1 = create_model( EmailAnalyticsBenchmarkByLinktV3Dbt, email_id=automated_email.id, email_type=automated_email.email_type, url="http://www.awesome-artist.com", total_clicks=100, unique_clicks=50, percentage_of_total_clicks=0.4, ) url2 = create_model( EmailAnalyticsBenchmarkByLinktV3Dbt, email_id=automated_email.id, email_type=automated_email.email_type, url="http://facebook.com/tickets", total_clicks=150, unique_clicks=100, percentage_of_total_clicks=0.6, ) response = handler.handle( GetEmailLinkAnalyticsRequest( email_id=automated_email.id, identity_id=identity_id, ), ) assert response.data == [ { "url": url2.url, "total_clicks": url2.total_clicks, "unique_clicks": url2.unique_clicks, "percentage_of_total_clicks": url2.percentage_of_total_clicks, }, { "url": url1.url, "total_clicks": url1.total_clicks, "unique_clicks": url1.unique_clicks, "percentage_of_total_clicks": url1.percentage_of_total_clicks, }, ] @pytest.mark.db def test_get_automated_email_link_analytics_correctly_sorted( self, handler: GetAutomatedEmailLinkAnalyticsHandler, create_model: CreateModel, identity_id: str, ) -> None: custom_list_id = "abcde12345" automated_email = create_model( AutomatedEmail, name="Test Automated Email", global_participant_id=None, custom_list_id=custom_list_id, ) create_model( EmailAnalyticsV3Dbt, email_id=automated_email.id, email_type=automated_email.email_type, sends=10, drops=0, delivered=10, opens=6, clicks=3, unique_opens=6, unique_clicks=3, unique_bounces=0, unique_spam_complaints=1, unsubscribes=0, open_rate=0.6, delivered_rate=1.0, click_through_rate=0.3, click_to_open_rate=0.3, bounce_rate=0.0, spam_complaints_rate=0.1, unsubscribe_rate=0.0, unique_opens_dropoff=0.6, unique_clicks_dropoff=0.5, ) create_model( EmailAnalyticsBenchmarkByAccountArtistV2Dbt, vendor_id=automated_email.vendor_id, subaccount_id=automated_email.subaccount_id, email_type=automated_email.email_type, global_participant_id=automated_email.global_participant_id, custom_list_id=automated_email.custom_list_id, avg_open_rate=0.8, avg_click_through_rate=0.8, avg_bounce_rate=0.1, avg_delivered_rate=0.9, avg_unique_clicks=6.0, avg_click_to_open_rate=0.2, avg_spam_complaints_rate=0.1, avg_unsubscribe_rate=0.0, ) url1 = create_model( EmailAnalyticsBenchmarkByLinktV3Dbt, email_id=automated_email.id, email_type=automated_email.email_type, url="http://www.awesome-artist.com", total_clicks=100, unique_clicks=50, percentage_of_total_clicks=0.25, ) url2 = create_model( EmailAnalyticsBenchmarkByLinktV3Dbt, email_id=automated_email.id, email_type=automated_email.email_type, url="http://facebook.com/tickets", total_clicks=150, unique_clicks=100, percentage_of_total_clicks=0.375, ) url3 = create_model( EmailAnalyticsBenchmarkByLinktV3Dbt, email_id=automated_email.id, email_type=automated_email.email_type, url="http://youtube.com/channel/some_id", total_clicks=150, unique_clicks=67, percentage_of_total_clicks=0.375, ) response = handler.handle( GetEmailLinkAnalyticsRequest( email_id=automated_email.id, identity_id=identity_id, ), ) assert response.data == [ { "url": url2.url, "total_clicks": url2.total_clicks, "unique_clicks": url2.unique_clicks, "percentage_of_total_clicks": url2.percentage_of_total_clicks, }, { "url": url3.url, "total_clicks": url3.total_clicks, "unique_clicks": url3.unique_clicks, "percentage_of_total_clicks": url3.percentage_of_total_clicks, }, { "url": url1.url, "total_clicks": url1.total_clicks, "unique_clicks": url1.unique_clicks, "percentage_of_total_clicks": url1.percentage_of_total_clicks, }, ]