import pytest from fansifter_common.utils import timezone from app.enums import CampaignStatus from app.models import Campaign, CampaignBatch from tests.unit.helpers import create_model @pytest.mark.db class TestCampaign: def test_marks_sent_when_no_active_batches(self) -> None: campaign = create_model(Campaign, status=CampaignStatus.IN_PROGRESS) create_model( CampaignBatch, campaign_id=campaign.id, batch_size=3, batch_offset=3, completed_at=timezone.now(), ) result = Campaign.query.mark_sent_if_fully_delivered(campaign.id) assert result is True campaign.refresh() assert campaign.status == CampaignStatus.SENT def test_does_not_mark_sent_when_a_batch_is_still_active(self) -> None: campaign = create_model(Campaign, status=CampaignStatus.IN_PROGRESS) create_model( CampaignBatch, campaign_id=campaign.id, batch_size=3, batch_offset=3, completed_at=timezone.now(), ) create_model( CampaignBatch, campaign_id=campaign.id, batch_size=3, batch_offset=1, completed_at=None, cancelled_at=None, ) result = Campaign.query.mark_sent_if_fully_delivered(campaign.id) assert result is False campaign.refresh() assert campaign.status == CampaignStatus.IN_PROGRESS def test_treats_a_cancelled_batch_as_not_blocking(self) -> None: campaign = create_model(Campaign, status=CampaignStatus.IN_PROGRESS) create_model( CampaignBatch, campaign_id=campaign.id, batch_size=3, batch_offset=1, completed_at=None, cancelled_at=timezone.now(), ) result = Campaign.query.mark_sent_if_fully_delivered(campaign.id) assert result is True campaign.refresh() assert campaign.status == CampaignStatus.SENT def test_does_not_mark_sent_when_campaign_is_not_in_progress(self) -> None: campaign = create_model(Campaign, status=CampaignStatus.SCHEDULED) create_model( CampaignBatch, campaign_id=campaign.id, batch_size=3, batch_offset=3, completed_at=timezone.now(), ) result = Campaign.query.mark_sent_if_fully_delivered(campaign.id) assert result is False campaign.refresh() assert campaign.status == CampaignStatus.SCHEDULED