from unittest import mock import pytest from faker import Faker from email_campaigns.automated.handlers import AutosaveAutomatedEmailV2Handler from email_campaigns.automated.models import ( AutomatedEmail, AutomatedEmailTrigger, SourceCampaign, ) from email_campaigns.emails.handlers import AutosaveEmailV2Request from tests.unit.helpers import override_settings from tests.unit.types import CreateModel class TestAutosaveAutomatedEmailV2Handler: @pytest.mark.db def test_autosave_v2_flags_unapplied_changes_when_content_differs( self, handler: AutosaveAutomatedEmailV2Handler, create_model: CreateModel, faker: Faker, campaign_public_preview_cache_mock: mock.MagicMock, automated_stripo_client_v2_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, html_content=faker.pystr(), css_content=faker.pystr(), has_unapplied_changes=False, source_campaign_connections=[ AutomatedEmailTrigger(source_campaign_id=source_campaign.id) ], ) original_html = automated_email.html_content original_css = automated_email.css_content automated_stripo_client_v2_mock.get_html_css.return_value = mock.Mock( html=f"{original_html}-edited", css=f"{original_css}-edited" ) with override_settings( stripo_autosave_username=username, stripo_autosave_password=password, ): handler.handle( AutosaveEmailV2Request( email_id=automated_email.id, user_id=faker.pystr(), username=username, password=password, ) ) assert automated_email.html_content == original_html assert automated_email.css_content == original_css assert automated_email.has_unapplied_changes is True automated_stripo_client_v2_mock.get_html_css.assert_called_once() campaign_public_preview_cache_mock.delete.assert_not_called() @pytest.mark.db def test_autosave_v2_clears_unapplied_changes_when_content_reverted( self, handler: AutosaveAutomatedEmailV2Handler, create_model: CreateModel, faker: Faker, campaign_public_preview_cache_mock: mock.MagicMock, automated_stripo_client_v2_mock: mock.MagicMock, ) -> None: campaign_public_preview_cache_mock.reset_mock() username = faker.pystr() password = faker.pystr() applied_html = faker.pystr() applied_css = faker.pystr() source_campaign = create_model(SourceCampaign) automated_email = create_model( AutomatedEmail, html_content=applied_html, css_content=applied_css, has_unapplied_changes=True, source_campaign_connections=[ AutomatedEmailTrigger(source_campaign_id=source_campaign.id) ], ) automated_stripo_client_v2_mock.get_html_css.return_value = mock.Mock( html=applied_html, css=applied_css ) with override_settings( stripo_autosave_username=username, stripo_autosave_password=password, ): handler.handle( AutosaveEmailV2Request( email_id=automated_email.id, user_id=faker.pystr(), username=username, password=password, ) ) assert automated_email.html_content == applied_html assert automated_email.css_content == applied_css assert automated_email.has_unapplied_changes is False automated_stripo_client_v2_mock.get_html_css.assert_called_once() campaign_public_preview_cache_mock.delete.assert_not_called() @pytest.mark.db def test_autosave_v2_stays_clean_when_only_attribute_order_differs( self, handler: AutosaveAutomatedEmailV2Handler, create_model: CreateModel, faker: Faker, campaign_public_preview_cache_mock: mock.MagicMock, automated_stripo_client_v2_mock: mock.MagicMock, ) -> None: campaign_public_preview_cache_mock.reset_mock() username = faker.pystr() password = faker.pystr() source_campaign = create_model(SourceCampaign) stored_html = '' stored_css = "a { color: red; }" automated_email = create_model( AutomatedEmail, html_content=stored_html, css_content=stored_css, has_unapplied_changes=False, source_campaign_connections=[ AutomatedEmailTrigger(source_campaign_id=source_campaign.id) ], ) automated_stripo_client_v2_mock.get_html_css.return_value = mock.Mock( html='', css="a {\n color: red;\n}", ) with override_settings( stripo_autosave_username=username, stripo_autosave_password=password, ): handler.handle( AutosaveEmailV2Request( email_id=automated_email.id, user_id=faker.pystr(), username=username, password=password, ) ) assert automated_email.html_content == stored_html assert automated_email.css_content == stored_css assert automated_email.has_unapplied_changes is False automated_stripo_client_v2_mock.get_html_css.assert_called_once() campaign_public_preview_cache_mock.delete.assert_not_called() @pytest.mark.db def test_autosave_v2_applies_when_no_source_campaigns( self, handler: AutosaveAutomatedEmailV2Handler, create_model: CreateModel, faker: Faker, campaign_public_preview_cache_mock: mock.MagicMock, automated_stripo_client_v2_mock: mock.MagicMock, ) -> None: campaign_public_preview_cache_mock.reset_mock() username = faker.pystr() password = faker.pystr() automated_email = create_model(AutomatedEmail, has_unapplied_changes=True) new_html = faker.pystr() new_css = faker.pystr() automated_stripo_client_v2_mock.get_html_css.return_value = mock.Mock( html=new_html, css=new_css ) with override_settings( stripo_autosave_username=username, stripo_autosave_password=password, ): handler.handle( AutosaveEmailV2Request( email_id=automated_email.id, user_id=faker.pystr(), username=username, password=password, ) ) assert automated_email.html_content == new_html assert automated_email.css_content == new_css assert automated_email.has_unapplied_changes is False automated_stripo_client_v2_mock.get_html_css.assert_called_once() campaign_public_preview_cache_mock.delete.assert_called_once_with( automated_email.id, automated_email.email_type )