from unittest import mock import pytest from faker import Faker from fansifter_common.email import EmailType from email_campaigns.automated.handlers import AutosaveAutomatedEmailHandler from email_campaigns.automated.models import ( AutomatedEmail, AutomatedEmailTrigger, SourceCampaign, ) from email_campaigns.emails.exceptions import AutosaveUnauthorizedError from email_campaigns.emails.handlers import AutosaveEmailRequest from tests.unit.helpers import override_settings from tests.unit.types import CreateModel class TestAutosaveAutomatedEmailHandler: @pytest.mark.db def test_autosave_automated_email( self, handler: AutosaveAutomatedEmailHandler, create_model: CreateModel, faker: Faker, campaign_public_preview_cache_mock: mock.MagicMock, ) -> None: campaign_public_preview_cache_mock.reset_mock() username = faker.pystr() password = faker.pystr() automated_email = create_model(AutomatedEmail) html = "
html content
" css = "p { color: red; }" with override_settings( stripo_autosave_username=username, stripo_autosave_password=password, ): handler.handle( AutosaveEmailRequest( key=faker.pystr(), email_id=automated_email.id, html=html, css=css, username=username, password=password, ) ) assert automated_email.html_content == html assert automated_email.css_content == css campaign_public_preview_cache_mock.delete.assert_called_once_with( automated_email.id, EmailType.AUTOMATED ) @pytest.mark.db def test_autosave_skips_automated_email_with_source_campaigns( self, handler: AutosaveAutomatedEmailHandler, create_model: CreateModel, faker: Faker, campaign_public_preview_cache_mock: mock.MagicMock, ) -> None: campaign_public_preview_cache_mock.reset_mock() username = faker.pystr() password = faker.pystr() source_campaign = create_model(SourceCampaign) automated_email = create_model( AutomatedEmail, source_campaign_connections=[ AutomatedEmailTrigger(source_campaign_id=source_campaign.id) ], ) original_html = automated_email.html_content original_css = automated_email.css_content with override_settings( stripo_autosave_username=username, stripo_autosave_password=password, ): handler.handle( AutosaveEmailRequest( key=faker.pystr(), email_id=automated_email.id, html="new html
", css="p { color: blue; }", username=username, password=password, ) ) assert automated_email.html_content == original_html assert automated_email.css_content == original_css campaign_public_preview_cache_mock.delete.assert_not_called() @pytest.mark.db def test_autosave_automated_email_incorrect_password( self, handler: AutosaveAutomatedEmailHandler, create_model: CreateModel, faker: Faker, ) -> None: username = faker.pystr() password = faker.pystr() automated_email = create_model(AutomatedEmail) with ( override_settings( stripo_autosave_username=username, stripo_autosave_password=password, ), pytest.raises(AutosaveUnauthorizedError), ): handler.handle( AutosaveEmailRequest( key=faker.pystr(), email_id=automated_email.id, html="html
", css="p {}", username=username, password=faker.pystr(), ) )