from unittest import mock import pytest from faker import Faker from email_campaigns.automated.handlers import ( ApplyAutomatedEmailChangesHandler, ApplyAutomatedEmailChangesRequest, ) from email_campaigns.automated.models import ( AutomatedEmail, AutomatedEmailTrigger, SourceCampaign, ) from email_campaigns.emails.exceptions import EmailNotFoundError from tests.unit.types import CreateModel class TestApplyAutomatedEmailChangesHandler: @pytest.mark.db def test_apply_pulls_stripo_content_and_clears_flag( self, handler: ApplyAutomatedEmailChangesHandler, create_model: CreateModel, identity_id: str, faker: Faker, campaign_public_preview_cache_mock: mock.MagicMock, automated_stripo_client_v2_mock: mock.MagicMock, ) -> None: campaign_public_preview_cache_mock.reset_mock() source_campaign = create_model(SourceCampaign) automated_email = create_model( AutomatedEmail, has_unapplied_changes=True, source_campaign_connections=[ AutomatedEmailTrigger(source_campaign_id=source_campaign.id) ], ) new_html = faker.pystr() new_css = faker.pystr() compressed = faker.pystr() automated_stripo_client_v2_mock.get_html_css.return_value = mock.Mock( html=new_html, css=new_css ) automated_stripo_client_v2_mock.compress.return_value = compressed result = handler.handle( ApplyAutomatedEmailChangesRequest( identity_id=identity_id, email_id=automated_email.id, ) ) assert result.has_unapplied_changes is False assert result.is_automated is True assert automated_email.html_content == new_html assert automated_email.css_content == new_css assert automated_email.compressed_content == compressed assert automated_email.has_unapplied_changes is False automated_stripo_client_v2_mock.get_html_css.assert_called_once_with( email_id=automated_email.id, user_id=identity_id ) automated_stripo_client_v2_mock.compress.assert_called_once_with( new_html, new_css ) campaign_public_preview_cache_mock.delete.assert_called_once_with( automated_email.id, automated_email.email_type ) @pytest.mark.db def test_apply_skips_compress_when_not_automated( self, handler: ApplyAutomatedEmailChangesHandler, create_model: CreateModel, identity_id: str, faker: Faker, automated_stripo_client_v2_mock: mock.MagicMock, ) -> None: automated_email = create_model( AutomatedEmail, has_unapplied_changes=True, ) automated_stripo_client_v2_mock.get_html_css.return_value = mock.Mock( html=faker.pystr(), css=faker.pystr() ) handler.handle( ApplyAutomatedEmailChangesRequest( identity_id=identity_id, email_id=automated_email.id, ) ) assert automated_email.has_unapplied_changes is False automated_stripo_client_v2_mock.compress.assert_not_called() @pytest.mark.db def test_apply_returns_status_without_applying_when_no_pending_changes( self, handler: ApplyAutomatedEmailChangesHandler, create_model: CreateModel, identity_id: str, automated_stripo_client_v2_mock: mock.MagicMock, ) -> None: automated_email = create_model(AutomatedEmail, has_unapplied_changes=False) result = handler.handle( ApplyAutomatedEmailChangesRequest( identity_id=identity_id, email_id=automated_email.id, ) ) assert result.has_unapplied_changes is False assert result.is_automated is False automated_stripo_client_v2_mock.get_html_css.assert_not_called() @pytest.mark.db def test_apply_raises_when_email_not_found( self, handler: ApplyAutomatedEmailChangesHandler, identity_id: str, faker: Faker, ) -> None: with pytest.raises(EmailNotFoundError): handler.handle( ApplyAutomatedEmailChangesRequest( identity_id=identity_id, email_id=faker.pystr(), ) )