from unittest import mock import pytest from faker import Faker from fansifter_common.adapters.stripo.models import HtmlCssResponse from fansifter_common.email import EmailType from email_campaigns.campaigns.enums import EmailCampaignStatus from email_campaigns.campaigns.exceptions import EmailCampaignMustBeDraftError from email_campaigns.campaigns.handlers import AutosaveCampaignV2Handler from email_campaigns.campaigns.models import EmailCampaign from email_campaigns.emails.exceptions import AutosaveUnauthorizedError from email_campaigns.emails.handlers import AutosaveEmailV2Request from tests.unit.helpers import override_settings from tests.unit.types import CreateModel class TestAutosaveCampaignV2Handler: @pytest.mark.db def test_autosave_campaign_v2( self, handler: AutosaveCampaignV2Handler, create_model: CreateModel, faker: Faker, campaign_public_preview_cache_mock: mock.MagicMock, campaign_stripo_client_v2_mock: mock.MagicMock, ) -> None: campaign_public_preview_cache_mock.reset_mock() username = faker.pystr() password = faker.pystr() user_id = faker.uuid4() html = "
v2 html
" css = "p { color: blue; }" campaign_stripo_client_v2_mock.get_html_css.return_value = HtmlCssResponse( html=html, css=css ) campaign = create_model( EmailCampaign, status=EmailCampaignStatus.DRAFT, ) with override_settings( stripo_autosave_username=username, stripo_autosave_password=password, ): handler.handle( AutosaveEmailV2Request( email_id=campaign.id, user_id=user_id, username=username, password=password, ) ) assert campaign.html_content == html assert campaign.css_content == css assert campaign.updated_by == user_id campaign_stripo_client_v2_mock.get_html_css.assert_called_once_with( email_id=campaign.id, user_id=user_id, ) campaign_public_preview_cache_mock.delete.assert_called_once_with( campaign.id, EmailType.CAMPAIGN ) @pytest.mark.db def test_campaign_for_autosave_v2_must_be_draft( self, handler: AutosaveCampaignV2Handler, create_model: CreateModel, faker: Faker, campaign_stripo_client_v2_mock: mock.MagicMock, ) -> None: username = faker.pystr() password = faker.pystr() campaign = create_model( EmailCampaign, status=EmailCampaignStatus.IN_PROGRESS, ) with ( override_settings( stripo_autosave_username=username, stripo_autosave_password=password, ), pytest.raises(EmailCampaignMustBeDraftError), ): handler.handle( AutosaveEmailV2Request( email_id=campaign.id, user_id=faker.uuid4(), username=username, password=password, ) ) # Stripo API should not be called when validation fails campaign_stripo_client_v2_mock.get_html_css.assert_not_called() @pytest.mark.db def test_autosave_campaign_v2_incorrect_password( self, handler: AutosaveCampaignV2Handler, create_model: CreateModel, faker: Faker, campaign_stripo_client_v2_mock: mock.MagicMock, ) -> None: username = faker.pystr() password = faker.pystr() campaign = create_model( EmailCampaign, status=EmailCampaignStatus.DRAFT, ) with ( override_settings( stripo_autosave_username=username, stripo_autosave_password=password, ), pytest.raises(AutosaveUnauthorizedError), ): handler.handle( AutosaveEmailV2Request( email_id=campaign.id, user_id=faker.uuid4(), username=username, password=faker.pystr(), # wrong password ) ) # Stripo API should not be called on auth failure campaign_stripo_client_v2_mock.get_html_css.assert_not_called()