import pytest from fansifter_common.utils import timezone from email_campaigns.api.schemas import CustomFont from email_campaigns.audiences.models import Audience from email_campaigns.campaigns.enums import EmailCampaignStatus from email_campaigns.campaigns.exceptions import EmailCampaignUniqueNameError from email_campaigns.campaigns.handlers import ( DuplicateCampaignHandler, DuplicateCampaignRequest, ) from email_campaigns.campaigns.models import EmailCampaign from tests.unit.types import CreateModel, CreatePgModel class TestDuplicateCampaignHandler: @pytest.mark.db def test_duplicate_email_campaign( self, handler: DuplicateCampaignHandler, create_model: CreateModel, create_pg_model: CreatePgModel, identity_id: str, ) -> None: audience = create_pg_model(Audience) campaign = create_model(EmailCampaign, audience_id=audience.id) name = "New Name" email_campaign_copy = handler.handle( DuplicateCampaignRequest( identity_id=identity_id, campaign_id=campaign.id, name=name ) ) assert email_campaign_copy.id != campaign.id assert email_campaign_copy.name == name assert email_campaign_copy.vendor_id == campaign.vendor_id assert email_campaign_copy.subaccount_id == campaign.subaccount_id assert ( email_campaign_copy.global_participant_id == campaign.global_participant_id ) assert email_campaign_copy.created_by == identity_id assert email_campaign_copy.updated_by == identity_id assert email_campaign_copy.audience_id assert email_campaign_copy.audience_id == campaign.audience_id assert email_campaign_copy.sender_name == campaign.sender_name assert email_campaign_copy.email_username == campaign.email_username assert email_campaign_copy.email_domain_id == campaign.email_domain_id assert email_campaign_copy.subject == campaign.subject assert email_campaign_copy.html_content == campaign.html_content assert email_campaign_copy.css_content == campaign.css_content assert email_campaign_copy.custom_fonts == campaign.custom_fonts assert email_campaign_copy.preview_text == campaign.preview_text assert email_campaign_copy.status == EmailCampaignStatus.DRAFT assert email_campaign_copy.send_at is None assert email_campaign_copy.send_at_timezone is None assert email_campaign_copy.recipients_count == audience.fan_count assert email_campaign_copy.audience assert email_campaign_copy.audience.id == audience.id @pytest.mark.db def test_duplicate_campaign_copies_custom_fonts( self, handler: DuplicateCampaignHandler, create_model: CreateModel, identity_id: str, ) -> None: roboto = CustomFont( name="Roboto", cssFontFamily="'Roboto', Arial, sans-serif", url="https://fonts.googleapis.com/css2?family=Roboto", ) campaign = create_model(EmailCampaign, custom_fonts=[roboto]) copy = handler.handle( DuplicateCampaignRequest( identity_id=identity_id, campaign_id=campaign.id, name="Copy" ) ) assert copy.custom_fonts == [roboto] @pytest.mark.db def test_duplicate_campaign_with_archived_audience( self, handler: DuplicateCampaignHandler, create_model: CreateModel, create_pg_model: CreatePgModel, identity_id: str, ) -> None: audience = create_pg_model(Audience, archived_at=timezone.now()) campaign = create_model(EmailCampaign, audience_id=audience.id) name = "New Name" email_campaign_copy = handler.handle( DuplicateCampaignRequest( identity_id=identity_id, campaign_id=campaign.id, name=name ) ) assert email_campaign_copy.id != campaign.id assert email_campaign_copy.name == name assert email_campaign_copy.audience_id == audience.id @pytest.mark.db def test_duplicate_campaign_unique_name( self, handler: DuplicateCampaignHandler, create_model: CreateModel, identity_id: str, ) -> None: campaign = create_model(EmailCampaign) with pytest.raises(EmailCampaignUniqueNameError): handler.handle( DuplicateCampaignRequest( identity_id=identity_id, campaign_id=campaign.id, name=campaign.name, ) )