import pytest from email_campaigns.campaigns.models import EmailCampaign from email_campaigns.emails.models import EmailAnalyticsV3Dbt from email_campaigns.reporting.handlers.get_reporting_analytics import ( GetReportingAnalyticsHandler, GetReportingAnalyticsRequest, ) from email_campaigns.reporting.models import EmailReportingReport from tests.unit.types import CreateModel class TestGetReportingAnalyticsHandler: @pytest.mark.db def test_aggregates_across_multiple_emails( self, handler: GetReportingAnalyticsHandler, create_model: CreateModel, identity_id: str, ) -> None: campaign1 = create_model(EmailCampaign, name="Campaign 1") campaign2 = create_model(EmailCampaign, name="Campaign 2") report = create_model( EmailReportingReport, identity_id=identity_id, name="My Report" ) report.email_ids = [campaign1.id, campaign2.id] create_model( EmailAnalyticsV3Dbt, email_id=campaign1.id, email_type=campaign1.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( EmailAnalyticsV3Dbt, email_id=campaign2.id, email_type=campaign2.email_type, sends=20, drops=0, delivered=18, opens=10, clicks=8, unique_opens=9, unique_clicks=6, unique_bounces=2, unique_spam_complaints=0, unsubscribes=1, open_rate=0.5, delivered_rate=0.9, click_through_rate=0.33, click_to_open_rate=0.67, bounce_rate=0.1, spam_complaints_rate=0.0, unsubscribe_rate=0.05, unique_opens_dropoff=0.6, unique_clicks_dropoff=0.33, ) response = handler.handle( GetReportingAnalyticsRequest( report_id=report.id, identity_id=identity_id, ) ) assert response.data == { "sends": 30, "delivered": 28, "opens": 16, "clicks": 11, "bounces": 2, "spam_complaints": 1, "unsubscribes": 1, "open_rate": 0.536, "delivered_rate": 0.933, "click_through_rate": 0.321, "click_to_open_rate": 0.6, "bounce_rate": 0.067, "spam_complaints_rate": 0.036, "unsubscribe_rate": 0.036, } @pytest.mark.db def test_returns_zeros_when_report_has_no_emails( self, handler: GetReportingAnalyticsHandler, create_model: CreateModel, identity_id: str, ) -> None: report = create_model( EmailReportingReport, identity_id=identity_id, name="Empty Report" ) response = handler.handle( GetReportingAnalyticsRequest( report_id=report.id, identity_id=identity_id, ) ) assert response.data == { "sends": 0, "delivered": 0, "opens": 0, "clicks": 0, "bounces": 0, "spam_complaints": 0, "unsubscribes": 0, "open_rate": 0.0, "delivered_rate": 0.0, "click_through_rate": 0.0, "click_to_open_rate": 0.0, "bounce_rate": 0.0, "spam_complaints_rate": 0.0, "unsubscribe_rate": 0.0, }