from collections.abc import Iterator from unittest import mock import pytest from anydi import Container from fansifter_common.auth.account import Account from starlette.testclient import TestClient from email_campaigns.automated.handlers import GetSourceCampaignAutomatedEmailsHandler from email_campaigns.automated.models import ( AutomatedEmail, AutomatedEmailTrigger, SourceCampaign, ) from email_campaigns.emails.models import EmailDomain from tests.unit.types import CreateModel @pytest.fixture(autouse=True) def _mock_find_potential_mailing_list_ids( container: Container, ) -> Iterator[mock.MagicMock]: handler = container.resolve(GetSourceCampaignAutomatedEmailsHandler) with mock.patch.object( handler.source_campaign_repository, "find_potential_mailing_list_ids", return_value={}, ) as mocked: yield mocked @pytest.mark.db def test_get_source_campaigns( client: TestClient, create_model: CreateModel, account: Account, ) -> None: source_campaign_1 = create_model( SourceCampaign, name="Alpha Campaign", campaign_id="campaign-1", source="smf", url="https://smf.com/campaign-1", vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, ) source_campaign_2 = create_model( SourceCampaign, name="Beta Campaign", campaign_id="campaign-2", source="smf", url=None, vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, ) response = client.post( "/source-campaigns/list", json={"orderBy": ["name.asc"], "limit": 10, "offset": 0}, ) assert response.status_code == 200 assert response.json() == { "total": 2, "items": [ { "id": source_campaign_1.id, "campaignId": "campaign-1", "source": "smf", "name": "Alpha Campaign", "url": "https://smf.com/campaign-1", "status": source_campaign_1.status, "fanDataListId": { "id": source_campaign_1.global_participant_id, "type": "ARTIST", }, "hasOtherConnections": None, }, { "id": source_campaign_2.id, "campaignId": "campaign-2", "source": "smf", "name": "Beta Campaign", "url": None, "status": source_campaign_2.status, "fanDataListId": { "id": source_campaign_2.global_participant_id, "type": "ARTIST", }, "hasOtherConnections": None, }, ], "limit": 10, "offset": 0, } @pytest.mark.db def test_get_source_campaign_automated_emails( client: TestClient, create_model: CreateModel, ) -> None: email_domain = create_model(EmailDomain) source_campaign = create_model( SourceCampaign, source="smf", campaign_id="campaign-123", ) automated_email = create_model( AutomatedEmail, email_domain=email_domain, sender_name="My Brand", email_username="hello", subject="Welcome!", preview_text="Check this out", source_campaign_connections=[ AutomatedEmailTrigger(source_campaign_id=source_campaign.id) ], ) response = client.get( "/source-campaigns/smf/campaign-123/automated-emails", ) assert response.status_code == 200 assert response.json() == { "isParticipationEmailAutomated": True, "isSubscriptionEmailAutomated": False, "items": [ { "id": automated_email.id, "name": automated_email.name, "type": automated_email.type, "subject": "Welcome!", "previewText": "Check this out", "senderName": "My Brand", "emailUsername": "hello", "emailDomain": { "id": email_domain.id, "domain": email_domain.domain, "brand": email_domain.brand, }, "subscriptionOnly": False, "potentialMailingListIds": [], }, ], } @pytest.mark.db def test_get_source_campaign_automated_emails_subscription_only( client: TestClient, create_model: CreateModel, ) -> None: source_campaign = create_model( SourceCampaign, source="smf", campaign_id="campaign-sub", ) create_model( AutomatedEmail, source_campaign_connections=[ AutomatedEmailTrigger( source_campaign_id=source_campaign.id, subscription_only=True, ) ], ) response = client.get( "/source-campaigns/smf/campaign-sub/automated-emails", ) assert response.status_code == 200 data = response.json() assert data["isParticipationEmailAutomated"] is False assert data["isSubscriptionEmailAutomated"] is True assert data["items"][0]["subscriptionOnly"] is True @pytest.mark.db def test_get_source_campaign_automated_emails_not_found( client: TestClient, ) -> None: response = client.get( "/source-campaigns/smf/nonexistent/automated-emails", ) assert response.status_code == 404 @pytest.mark.db def test_get_source_campaign_automated_emails_mismatched_source( client: TestClient, create_model: CreateModel, ) -> None: create_model( SourceCampaign, source="smf", campaign_id="campaign-123", ) response = client.get( "/source-campaigns/wyng/campaign-123/automated-emails", ) assert response.status_code == 404