from unittest import mock import faker import pytest from dirty_equals import IsList from fansifter_common.auth.account import Account, AccountAccess from email_campaigns.automated.handlers import ( GetAutomatedEmailsHandler, GetAutomatedEmailsRequest, ) from email_campaigns.automated.models import AutomatedEmail from email_campaigns.emails.models import EmailAnalyticsV3Dbt from tests.unit.types import CreateModel class TestGetAutomatedEmailsHandler: @pytest.mark.db def test_get_automated_emails( self, handler: GetAutomatedEmailsHandler, create_model: CreateModel, auth_service_mock: mock.MagicMock, faker: faker.Faker, identity_id: str, ) -> None: vendor_id_1 = faker.pyint() vendor_id_2 = faker.pyint() automated_email_1 = create_model( AutomatedEmail, name="Test Campaign", vendor_id=vendor_id_1, subaccount_id=0, deleted_at=None, deleted_by=None, ) automated_email_2 = create_model( AutomatedEmail, name="Test Campaign 2", vendor_id=vendor_id_2, subaccount_id=0, deleted_at=None, deleted_by=None, ) create_model( AutomatedEmail, name="Test Campaign 3", deleted_at=None, deleted_by=None, ) auth_service_mock.authorize_for_permission = mock.Mock( return_value=AccountAccess( accounts=[ Account(vendor_id=vendor_id_1, subaccount_id=0), Account(vendor_id=vendor_id_2, subaccount_id=0), ], ) ) response = handler.handle( GetAutomatedEmailsRequest( identity_id=identity_id, search=None, vendor_id=None, subaccount_id=None, fandata_list_ids=None, is_automated=False, order_by=["createdAt.asc"], limit=10, offset=0, ) ) assert response.total == 2 assert response.items == IsList( automated_email_1, automated_email_2, check_order=False ) @pytest.mark.db def test_get_automated_emails_with_analytics( self, handler: GetAutomatedEmailsHandler, create_model: CreateModel, auth_service_mock: mock.MagicMock, faker: faker.Faker, identity_id: str, ) -> None: vendor_id = faker.pyint() subaccount_id = faker.pyint() # Create automated email automated_email = create_model( AutomatedEmail, name="Test Campaign with Analytics", vendor_id=vendor_id, subaccount_id=subaccount_id, deleted_at=None, deleted_by=None, ) # Create analytics data for this automated email create_model( EmailAnalyticsV3Dbt, email_id=automated_email.id, email_type="AUTOMATED", sends=1000, drops=10, delivered=990, opens=450, clicks=120, unique_opens=400, unique_clicks=100, unique_bounces=5, unique_spam_complaints=2, unsubscribes=8, open_rate=0.45, delivered_rate=0.99, click_through_rate=0.12, click_to_open_rate=0.267, bounce_rate=0.005, spam_complaints_rate=0.002, unsubscribe_rate=0.008, unique_opens_dropoff=0.11, unique_clicks_dropoff=0.75, ) auth_service_mock.authorize_for_permission = mock.Mock( return_value=AccountAccess( accounts=[ Account(vendor_id=vendor_id, subaccount_id=subaccount_id), ], ) ) response = handler.handle( GetAutomatedEmailsRequest( identity_id=identity_id, search=None, vendor_id=None, subaccount_id=None, fandata_list_ids=None, is_automated=False, order_by=["createdAt.asc"], limit=10, offset=0, ) ) assert response.total == 1 assert len(response.items) == 1 result = response.items[0] assert result.id == automated_email.id assert result.analytics is not None assert result.analytics.sends == 1000 assert result.analytics.delivered == 990 assert result.analytics.opens == 450 assert result.analytics.clicks == 120 assert result.analytics.unique_opens == 400 assert result.analytics.unique_clicks == 100 assert result.analytics.bounces == 5 assert result.analytics.spam_complaints == 2 assert result.analytics.unsubscribes == 8 assert result.analytics.open_rate == 0.45 assert result.analytics.delivered_rate == 0.99 assert result.analytics.click_through_rate == 0.12 assert result.analytics.click_to_open_rate == 0.267 assert result.analytics.bounce_rate == 0.005 assert result.analytics.spam_complaints_rate == 0.002 assert result.analytics.unsubscribe_rate == 0.008