import pytest from email_campaigns.api.schemas import CustomFont from email_campaigns.automated.enums import AutomatedEmailType from email_campaigns.automated.exceptions import AutomatedEmailUniqueNameError from email_campaigns.automated.handlers import ( DuplicateAutomatedEmailHandler, DuplicateAutomatedEmailRequest, ) from email_campaigns.automated.models import AutomatedEmail from email_campaigns.emails.exceptions import ( EmailOptInButtonMissingError, EmailPrivacyFooterMissingError, ) from tests.unit.types import CreateModel class TestDuplicateAutomatedEmailHandler: @pytest.mark.db def test_duplicate_automated_email( self, handler: DuplicateAutomatedEmailHandler, create_model: CreateModel, identity_id: str, ) -> None: automated_email = create_model( AutomatedEmail, html_content='', ) name = "New Name" automated_email_copy = handler.handle( DuplicateAutomatedEmailRequest( identity_id=identity_id, email_id=automated_email.id, name=name ) ) assert automated_email_copy.id != automated_email.id assert automated_email_copy.name == name assert automated_email_copy.vendor_id == automated_email.vendor_id assert automated_email_copy.subaccount_id == automated_email.subaccount_id assert ( automated_email_copy.global_participant_id == automated_email.global_participant_id ) assert automated_email_copy.created_by == identity_id assert automated_email_copy.updated_by == identity_id assert automated_email_copy.sender_name == automated_email.sender_name assert automated_email_copy.email_username == automated_email.email_username assert automated_email_copy.email_domain_id == automated_email.email_domain_id assert automated_email_copy.subject == automated_email.subject assert automated_email_copy.html_content == automated_email.html_content assert automated_email_copy.css_content == automated_email.css_content assert automated_email_copy.custom_fonts == automated_email.custom_fonts assert automated_email_copy.preview_text == automated_email.preview_text @pytest.mark.db def test_duplicate_automated_email_copies_custom_fonts( self, handler: DuplicateAutomatedEmailHandler, create_model: CreateModel, identity_id: str, ) -> None: roboto = CustomFont( name="Roboto", cssFontFamily="'Roboto', Arial, sans-serif", url="https://fonts.googleapis.com/css2?family=Roboto", ) automated_email = create_model( AutomatedEmail, html_content='', custom_fonts=[roboto], ) copy = handler.handle( DuplicateAutomatedEmailRequest( identity_id=identity_id, email_id=automated_email.id, name="Copy" ) ) assert copy.custom_fonts == [roboto] @pytest.mark.db def test_duplicate_automated_email_without_html_content( self, handler: DuplicateAutomatedEmailHandler, create_model: CreateModel, identity_id: str, ) -> None: automated_email = create_model(AutomatedEmail, html_content=None) name = "New Name" automated_email_copy = handler.handle( DuplicateAutomatedEmailRequest( identity_id=identity_id, email_id=automated_email.id, name=name ) ) assert automated_email_copy.html_content is None @pytest.mark.db def test_duplicate_automated_email_missing_privacy_footer( self, handler: DuplicateAutomatedEmailHandler, create_model: CreateModel, identity_id: str, ) -> None: automated_email = create_model( AutomatedEmail, html_content="no footer" ) with pytest.raises(EmailPrivacyFooterMissingError): handler.handle( DuplicateAutomatedEmailRequest( identity_id=identity_id, email_id=automated_email.id, name="New Name", ) ) @pytest.mark.db def test_duplicate_automated_email_opt_in_missing_button( self, handler: DuplicateAutomatedEmailHandler, create_model: CreateModel, identity_id: str, ) -> None: automated_email = create_model( AutomatedEmail, type=AutomatedEmailType.OPT_IN, html_content='', ) with pytest.raises(EmailOptInButtonMissingError): handler.handle( DuplicateAutomatedEmailRequest( identity_id=identity_id, email_id=automated_email.id, name="New Name", ) ) @pytest.mark.db def test_duplicate_automated_email_unique_name( self, handler: DuplicateAutomatedEmailHandler, create_model: CreateModel, identity_id: str, ) -> None: automated_email = create_model( AutomatedEmail, deleted_at=None, html_content='', ) with pytest.raises(AutomatedEmailUniqueNameError): handler.handle( DuplicateAutomatedEmailRequest( identity_id=identity_id, email_id=automated_email.id, name=automated_email.name, ) )