from unittest import mock import pytest from faker import Faker from fansifter_common.adapters.graphql_router import GlobalParticipant from fansifter_common.adapters.ows_account import Vendor from fansifter_common.auth.account import Account from fansifter_common.core.enums import Brand from email_campaigns.campaigns.handlers import ( CreateCampaignHandler, CreateCampaignRequest, ) from email_campaigns.emails.models import EmailDomain from email_campaigns.rosters.models import CustomList from email_campaigns.rosters.types import FanDataListId from tests.unit.types import BuildModel, CreateModel class TestCreateCampaignHandler: @pytest.mark.db def test_create_campaign( self, handler: CreateCampaignHandler, build_model: BuildModel, create_model: CreateModel, faker: Faker, identity_id: str, account: Account, ows_account_client_mock: mock.MagicMock, graphql_router_client_mock: mock.MagicMock, ) -> None: name = "Test Campaign" global_participant = GlobalParticipant(id=faker.uuid4(), name="Artist Name") vendor = build_model( Vendor, vendor_id=account.vendor_id, company_brand=Brand.SME ) email_domain = create_model( EmailDomain, brand=vendor.brand, domain="example.com", vendor_id=account.vendor_id, subaccount_id=0, ) ows_account_client_mock.get_vendor.return_value = vendor graphql_router_client_mock.get_global_participant_by_gp_id.return_value = ( global_participant ) campaign = handler.handle( CreateCampaignRequest( identity_id=identity_id, name=name, vendor_id=account.vendor_id, subaccount_id=0, fandata_list_id=FanDataListId.from_artist_id(global_participant.id), ) ) assert campaign.name == name assert campaign.vendor_id == account.vendor_id assert campaign.subaccount_id == account.subaccount_id assert campaign.email_domain_id == email_domain.id assert campaign.global_participant_id == global_participant.id assert campaign.sender_name == "Artist Name" assert campaign.email_username == "artistname" @pytest.mark.db def test_create_campaign_for_custom_list( self, handler: CreateCampaignHandler, build_model: BuildModel, create_model: CreateModel, identity_id: str, account: Account, ows_account_client_mock: mock.MagicMock, ) -> None: name = "Test Campaign" vendor = build_model( Vendor, vendor_id=account.vendor_id, company_brand=Brand.SME ) custom_list = create_model( CustomList, name="My List", vendor_id=account.vendor_id, subaccount_id=0, ) email_domain = create_model( EmailDomain, brand=vendor.brand, domain="example.com", vendor_id=account.vendor_id, subaccount_id=0, ) ows_account_client_mock.get_vendor.return_value = vendor campaign = handler.handle( CreateCampaignRequest( identity_id=identity_id, name=name, vendor_id=account.vendor_id, subaccount_id=0, fandata_list_id=FanDataListId.from_custom_list_id(custom_list.id), ) ) assert campaign.name == name assert campaign.vendor_id == account.vendor_id assert campaign.subaccount_id == 0 assert campaign.email_domain_id == email_domain.id assert campaign.global_participant_id is None assert campaign.custom_list_id == custom_list.id assert campaign.sender_name == custom_list.name assert campaign.email_username == "mylist" assert campaign.audience is None