from unittest import mock import pytest from faker import Faker 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 AutosaveCampaignHandler from email_campaigns.campaigns.models import EmailCampaign 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 TestAutosaveCampaignHandler: @pytest.mark.db def test_autosave_campaign( self, handler: AutosaveCampaignHandler, create_model: CreateModel, faker: Faker, campaign_public_preview_cache_mock: mock.MagicMock, ) -> None: # Reset mock to clear any previous calls campaign_public_preview_cache_mock.reset_mock() username = faker.pystr() password = faker.pystr() campaign = create_model( EmailCampaign, status=EmailCampaignStatus.DRAFT, ) 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=campaign.id, html=html, css=css, username=username, password=password, ) ) assert campaign.html_content == html assert campaign.css_content == css # Verify cache was invalidated campaign_public_preview_cache_mock.delete.assert_called_once_with( campaign.id, EmailType.CAMPAIGN ) @pytest.mark.db def test_autosave_campaign_with_user_id( self, handler: AutosaveCampaignHandler, create_model: CreateModel, faker: Faker, ) -> None: username = faker.pystr() password = faker.pystr() user_id = faker.uuid4() campaign = create_model( EmailCampaign, status=EmailCampaignStatus.DRAFT, ) 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=campaign.id, html=html, css=css, username=username, password=password, user_id=user_id, ) ) assert campaign.html_content == html assert campaign.css_content == css assert campaign.updated_by == user_id @pytest.mark.db def test_autosave_campaign_without_user_id( self, handler: AutosaveCampaignHandler, create_model: CreateModel, faker: Faker, ) -> None: username = faker.pystr() password = faker.pystr() original_updated_by = faker.uuid4() campaign = create_model( EmailCampaign, status=EmailCampaignStatus.DRAFT, updated_by=original_updated_by, ) 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=campaign.id, html=html, css=css, username=username, password=password, user_id=None, ) ) assert campaign.html_content == html assert campaign.css_content == css # updated_by should remain unchanged when user_id is None assert campaign.updated_by == original_updated_by @pytest.mark.db def test_campaign_for_autosave_must_be_draft( self, handler: AutosaveCampaignHandler, create_model: CreateModel, faker: Faker, ) -> None: username = faker.pystr() password = faker.pystr() campaign = create_model( EmailCampaign, status=EmailCampaignStatus.IN_PROGRESS, ) html = "html content
" css = "p { color: red; }" with ( override_settings( stripo_autosave_username=username, stripo_autosave_password=password, ), pytest.raises(EmailCampaignMustBeDraftError), ): handler.handle( AutosaveEmailRequest( key=faker.pystr(), email_id=campaign.id, html=html, css=css, username=username, password=password, ) ) @pytest.mark.db def test_autosave_campaign_incorrect_password( self, handler: AutosaveCampaignHandler, create_model: CreateModel, faker: Faker, ) -> None: username = faker.pystr() password = faker.pystr() campaign = create_model( EmailCampaign, status=EmailCampaignStatus.DRAFT, ) html = "html content
" css = "p { color: red; }" with ( override_settings( stripo_autosave_username=username, stripo_autosave_password=password, ), pytest.raises(AutosaveUnauthorizedError), ): handler.handle( AutosaveEmailRequest( key=faker.pystr(), email_id=campaign.id, html=html, css=css, username=username, password=faker.pystr(), ) )