from unittest import mock import faker import freezegun import pytest from fansifter_common.utils import timezone from email_campaigns.audiences.enums import AudienceTarget from email_campaigns.audiences.models import Audience from email_campaigns.campaigns.enums import EmailCampaignStatus from email_campaigns.campaigns.exceptions import EmailCampaignMustBeDraftError from email_campaigns.campaigns.handlers import SendCampaignHandler, SendCampaignRequest from email_campaigns.campaigns.models import EmailCampaign from email_campaigns.emails.exceptions import EmailPrivacyFooterMissingError from email_campaigns.emails.models import EmailDomain from tests.unit.types import CreateModel, CreatePgModel class TestSendCampaignHandler: @pytest.mark.db @freezegun.freeze_time("2021-01-01 00:00:00") def test_send_campaign( self, handler: SendCampaignHandler, create_model: CreateModel, create_pg_model: CreatePgModel, identity_id: str, faker: faker.Faker, stripo_client_mock: mock.MagicMock, ) -> None: audience = create_pg_model(Audience, target=AudienceTarget.EMAIL, fan_count=100) email_domain = create_model(EmailDomain) email_username = faker.user_name() sender_name = faker.first_name() subject = faker.sentence() preview_text = faker.sentence() campaign = create_model( EmailCampaign, status=EmailCampaignStatus.DRAFT, vendor_id=audience.vendor_id, subaccount_id=audience.subaccount_id, global_participant_id=audience.global_participant_id, audience_id=audience.id, sender_name=sender_name, subject=subject, preview_text=preview_text, email_domain=email_domain, email_username=email_username, ) stripo_client_mock.compress.return_value = "compressed" handler.handle( SendCampaignRequest( identity_id=identity_id, campaign_id=campaign.id, ) ) assert campaign.status == EmailCampaignStatus.IN_PROGRESS assert campaign.send_at == timezone.now() assert campaign.scheduled_at == timezone.now() assert campaign.send_at_timezone is None assert campaign.recipients_count == audience.fan_count assert campaign.compressed_content == "compressed" @pytest.mark.db def test_send_campaign_is_not_draft( self, handler: SendCampaignHandler, create_model: CreateModel, create_pg_model: CreatePgModel, identity_id: str, ) -> None: audience = create_pg_model(Audience) campaign = create_model( EmailCampaign, status=EmailCampaignStatus.SENT, vendor_id=audience.vendor_id, subaccount_id=audience.subaccount_id, global_participant_id=audience.global_participant_id, ) with pytest.raises(EmailCampaignMustBeDraftError): handler.handle( SendCampaignRequest( identity_id=identity_id, campaign_id=campaign.id, ) ) @pytest.mark.db def test_send_campaign_without_privacy_footer( self, handler: SendCampaignHandler, faker: faker.Faker, create_model: CreateModel, create_pg_model: CreatePgModel, identity_id: str, ) -> None: audience = create_pg_model(Audience, target=AudienceTarget.EMAIL, fan_count=100) email_domain = create_model(EmailDomain) email_username = faker.user_name() sender_name = faker.first_name() subject = faker.sentence() preview_text = faker.sentence() campaign = create_model( EmailCampaign, status=EmailCampaignStatus.DRAFT, vendor_id=audience.vendor_id, subaccount_id=audience.subaccount_id, global_participant_id=audience.global_participant_id, audience_id=audience.id, sender_name=sender_name, subject=subject, preview_text=preview_text, email_domain=email_domain, email_username=email_username, html_content="", ) with pytest.raises(EmailPrivacyFooterMissingError): handler.handle( SendCampaignRequest( identity_id=identity_id, campaign_id=campaign.id, ) )