from dataclasses import replace from unittest import mock import pytest from fansifter_common.adapters.ows_users import Identity from email_campaigns.campaigns.handlers import GetCampaignPreviewHandler from email_campaigns.campaigns.models import EmailCampaign from email_campaigns.emails.handlers import GetEmailPreviewRequest from tests.unit.types import BuildModel, CreateModel class TestGetCampaignPreviewHandler: @pytest.mark.db def test_default_returns_raw_preview_without_substitutions( self, handler: GetCampaignPreviewHandler, create_model: CreateModel, identity_id: str, sendgrid_client_mock: mock.MagicMock, ) -> None: sendgrid_client_mock.reset_mock() campaign = create_model( EmailCampaign, html_content="
Hi -firstName-!
-privacyFooterBlock-", css_content="p { color: red; }", ) preview = handler.handle( GetEmailPreviewRequest( identity_id=identity_id, email_id=campaign.id, ) ) assert preview == replace( campaign.preview, favorite_fonts=preview.favorite_fonts ) sendgrid_client_mock.get_user_privacy_footer_block.assert_not_called() @pytest.mark.db def test_with_substitutions_replaces_first_name_with_fallback( self, handler: GetCampaignPreviewHandler, create_model: CreateModel, identity_id: str, sendgrid_client_mock: mock.MagicMock, ) -> None: sendgrid_client_mock.get_user_privacy_footer_block.return_value = "" campaign = create_model( EmailCampaign, html_content="Hi -firstName-!
", css_content="", ) preview = handler.handle( GetEmailPreviewRequest( identity_id=identity_id, email_id=campaign.id, apply_substitutions=True, ) ) assert preview.html is not None assert "-firstName-" not in preview.html assert "Hi Fan!" in preview.html @pytest.mark.db def test_with_substitutions_replaces_privacy_footer_block( self, handler: GetCampaignPreviewHandler, create_model: CreateModel, identity_id: str, sendgrid_client_mock: mock.MagicMock, ) -> None: footer_html = "body
-privacyFooterBlock-", css_content="", ) preview = handler.handle( GetEmailPreviewRequest( identity_id=identity_id, email_id=campaign.id, apply_substitutions=True, ) ) assert preview.html is not None assert "-privacyFooterBlock-" not in preview.html assert footer_html in preview.html @pytest.mark.db def test_with_substitutions_uses_real_user_email_in_footer( self, handler: GetCampaignPreviewHandler, create_model: CreateModel, build_model: BuildModel, identity_id: str, ows_users_client_mock: mock.MagicMock, sendgrid_client_mock: mock.MagicMock, ) -> None: ows_users_client_mock.reset_mock() identity = build_model(Identity) ows_users_client_mock.get_identity.return_value = identity sendgrid_client_mock.get_user_privacy_footer_block.return_value = "" campaign = create_model( EmailCampaign, html_content="body
-privacyFooterBlock-", css_content="", ) handler.handle( GetEmailPreviewRequest( identity_id=identity_id, email_id=campaign.id, apply_substitutions=True, ) ) ows_users_client_mock.get_identity.assert_called_once_with(identity_id) assert ( sendgrid_client_mock.get_user_privacy_footer_block.call_args.kwargs["email"] == identity.email ) @pytest.mark.db def test_with_substitutions_replaces_double_opt_in_url( self, handler: GetCampaignPreviewHandler, create_model: CreateModel, identity_id: str, sendgrid_client_mock: mock.MagicMock, ) -> None: sendgrid_client_mock.get_user_privacy_footer_block.return_value = "" campaign = create_model( EmailCampaign, html_content='Confirm', css_content="", ) preview = handler.handle( GetEmailPreviewRequest( identity_id=identity_id, email_id=campaign.id, apply_substitutions=True, ) ) assert preview.html is not None assert "-doubleOptInUrl-" not in preview.html assert 'href="#"' in preview.html @pytest.mark.db def test_with_substitutions_preserves_none_html( self, handler: GetCampaignPreviewHandler, create_model: CreateModel, identity_id: str, ) -> None: campaign = create_model( EmailCampaign, html_content=None, css_content=None, ) preview = handler.handle( GetEmailPreviewRequest( identity_id=identity_id, email_id=campaign.id, apply_substitutions=True, ) ) assert preview.html is None assert preview.css is None