from datetime import timedelta import pytest from fansifter_common.utils import timezone from email_campaigns.campaigns.enums import EmailCampaignStatus from email_campaigns.campaigns.exceptions import ( CampaignAlreadyQueuedError, EmailCampaignMustBeScheduledError, ) from email_campaigns.campaigns.handlers import ( UnscheduleCampaignHandler, UnscheduleCampaignRequest, ) from email_campaigns.campaigns.models import EmailCampaign from tests.unit.types import CreateModel class TestUnscheduleCampaignHandler: @pytest.mark.db def test_unschedule_campaign( self, handler: UnscheduleCampaignHandler, create_model: CreateModel, identity_id: str, ) -> None: campaign = create_model( EmailCampaign, status=EmailCampaignStatus.SCHEDULED, send_at=timezone.now() + timedelta(days=1), scheduled_at=timezone.now() - timedelta(days=1), ) handler.handle( UnscheduleCampaignRequest( identity_id=identity_id, campaign_id=campaign.id, ) ) assert campaign.status == EmailCampaignStatus.DRAFT assert campaign.send_at is None assert campaign.scheduled_at is None assert campaign.send_at_timezone is None assert campaign.recipients_count == 0 @pytest.mark.db def test_unschedule_campaign_is_not_scheduled( self, handler: UnscheduleCampaignHandler, create_model: CreateModel, identity_id: str, ) -> None: campaign = create_model( EmailCampaign, status=EmailCampaignStatus.SENT, ) with pytest.raises(EmailCampaignMustBeScheduledError): handler.handle( UnscheduleCampaignRequest( identity_id=identity_id, campaign_id=campaign.id, ) ) @pytest.mark.db def test_unschedule_campaign_send_at_in_allowed_window( self, handler: UnscheduleCampaignHandler, create_model: CreateModel, identity_id: str, ) -> None: send_at = timezone.now() - timedelta() campaign = create_model( EmailCampaign, status=EmailCampaignStatus.SCHEDULED, send_at=send_at, ) with pytest.raises(CampaignAlreadyQueuedError): handler.handle( UnscheduleCampaignRequest( identity_id=identity_id, campaign_id=campaign.id, ) )