from unittest import mock import faker import pytest from anydi import Container from fansifter_common.adapters.ows_account import Vendor from fansifter_common.legal_info.types import LegalEntity from email_campaigns.adapters.features import AUDIENCE_ENABLE_STRIPO_PLUGIN_V2 from email_campaigns.campaigns.handlers import SendTestCampaignEmailHandler from email_campaigns.campaigns.models import EmailCampaign from email_campaigns.emails.exceptions import ( EmailNotFoundError, EmailPrivacyFooterMissingError, ) from email_campaigns.emails.handlers import SendTestEmailRequest from email_campaigns.emails.models import EmailDomain from email_campaigns.emails.services import EmailSendService from tests.unit.types import BuildModel, CreateModel, EnableFeatures class TestSendTestCampaignEmailHandler: @pytest.mark.db def test_send_test_campaign_email( self, handler: SendTestCampaignEmailHandler, faker: faker.Faker, identity_id: str, ) -> None: with pytest.raises(EmailNotFoundError): handler.handle( SendTestEmailRequest( email_id=faker.pystr(), emails={faker.email(), faker.email()}, identity_id=identity_id, content=faker.pystr(), ) ) @pytest.mark.db def test_send_test_campaign_email_without_privacy_footer( self, handler: SendTestCampaignEmailHandler, faker: faker.Faker, create_model: CreateModel, identity_id: str, ) -> None: email_campaign = create_model(EmailCampaign, html_content="") with pytest.raises(EmailPrivacyFooterMissingError): handler.handle( SendTestEmailRequest( email_id=email_campaign.id, emails={faker.email(), faker.email()}, identity_id=identity_id, content=faker.pystr(), ) ) @pytest.mark.db def test_send_test_campaign_with_unapplied_changes_fetches_from_stripo( self, container: Container, handler: SendTestCampaignEmailHandler, faker: faker.Faker, create_model: CreateModel, identity_id: str, campaign_stripo_client_v2_mock: mock.MagicMock, stripo_client_mock: mock.MagicMock, enable_features: EnableFeatures, ) -> None: email_domain = create_model(EmailDomain) email_campaign = create_model( EmailCampaign, sender_name=faker.name(), subject=faker.sentence(), email_domain=email_domain, email_username=faker.user_name(), html_content=( "" '' ), css_content="p{color:red}", has_unapplied_changes=True, ) new_html = ( "" '' ) new_css = "p{color:blue}" compressed = faker.pystr() campaign_stripo_client_v2_mock.get_html_css.return_value = mock.Mock( html=new_html, css=new_css ) stripo_client_mock.compress.return_value = compressed email_send_service_mock = mock.MagicMock(spec=EmailSendService) with ( container.override(EmailSendService, email_send_service_mock), enable_features([AUDIENCE_ENABLE_STRIPO_PLUGIN_V2]), ): handler.handle( SendTestEmailRequest( email_id=email_campaign.id, emails={faker.email()}, identity_id=identity_id, content=None, with_unapplied_changes=True, ) ) campaign_stripo_client_v2_mock.get_html_css.assert_called_once_with( email_id=email_campaign.id, user_id=identity_id ) stripo_client_mock.compress.assert_called_once_with(new_html, new_css) kwargs = email_send_service_mock.send_test_email.call_args.kwargs assert kwargs["content"] == compressed @pytest.mark.db def test_send_test_with_api_flag_but_no_unapplied_changes_uses_test_prefix( self, handler: SendTestCampaignEmailHandler, faker: faker.Faker, create_model: CreateModel, build_model: BuildModel, identity_id: str, sendgrid_client_mock: mock.MagicMock, ows_account_client_mock: mock.MagicMock, legal_info_service_mock: mock.MagicMock, ) -> None: legal_info_service_mock.prepare_privacy_links_for_country.return_value = ( faker.pystr() ) legal_info_service_mock.get_legal_entity.return_value = build_model(LegalEntity) ows_account_client_mock.get_vendor.return_value = build_model(Vendor) email_domain = create_model(EmailDomain) email_campaign = create_model( EmailCampaign, sender_name=faker.name(), subject=faker.sentence(), email_domain=email_domain, email_username=faker.user_name(), html_content=( "" '' ), css_content="p{color:red}", has_unapplied_changes=False, ) sendgrid_client_mock.reset_mock() sendgrid_client_mock.send_mail.return_value = None handler.handle( SendTestEmailRequest( email_id=email_campaign.id, emails={faker.email()}, identity_id=identity_id, content=faker.pystr(), with_unapplied_changes=True, ) ) [call] = sendgrid_client_mock.send_mail.call_args_list assert call.kwargs["subject"] == f" [TEST] {email_campaign.subject}"