import pytest from fansifter_common.auth.account import Account from dmp.ad_reporting.enums import AdReportingBudgetType, AdReportingPlatform from dmp.ad_reporting.exceptions import AdReportingCampaignNotFoundError from dmp.ad_reporting.handlers import ( GetAdReportingCampaignHandler, GetAdReportingCampaignRequest, ) from dmp.ad_reporting.models import AdReportingCampaignDbt from dmp.meta.models import MetaAdAccount, MetaUserAdAccount from tests.unit.faker import FakerTyped from tests.unit.types import CreateModel, CreateReportingModel class TestGetAdReportingCampaignHandler: @pytest.mark.db def test_get_campaign( self, handler: GetAdReportingCampaignHandler, create_model: CreateModel, create_reporting_model: CreateReportingModel, identity_id: str, account: Account, ) -> None: ad_account = create_model(MetaAdAccount) create_model( MetaUserAdAccount, ad_account_id=ad_account.id, identity_id=identity_id, vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, ) campaign = create_reporting_model( AdReportingCampaignDbt, account_id=ad_account.external_id, platform=AdReportingPlatform.META, ) result = handler.handle( GetAdReportingCampaignRequest( identity_id=identity_id, campaign_id=campaign.id, ) ) assert result.id == campaign.id @pytest.mark.db def test_get_campaign_no_allowed_accounts( self, handler: GetAdReportingCampaignHandler, create_reporting_model: CreateReportingModel, identity_id: str, ) -> None: campaign = create_reporting_model( AdReportingCampaignDbt, platform=AdReportingPlatform.META, ) with pytest.raises(AdReportingCampaignNotFoundError): handler.handle( GetAdReportingCampaignRequest( identity_id=identity_id, campaign_id=campaign.id, ) ) @pytest.mark.db def test_get_campaign_not_found( self, handler: GetAdReportingCampaignHandler, identity_id: str, fake: FakerTyped ) -> None: with pytest.raises(AdReportingCampaignNotFoundError): handler.handle( GetAdReportingCampaignRequest( identity_id=identity_id, campaign_id=fake.uuid4_string(), ) ) @pytest.mark.db def test_get_campaign_daily_budget( self, handler: GetAdReportingCampaignHandler, create_model: CreateModel, create_reporting_model: CreateReportingModel, identity_id: str, account: Account, ) -> None: ad_account = create_model(MetaAdAccount) create_model( MetaUserAdAccount, ad_account_id=ad_account.id, identity_id=identity_id, vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, ) campaign = create_reporting_model( AdReportingCampaignDbt, account_id=ad_account.external_id, platform=AdReportingPlatform.META, ) result = handler.handle( GetAdReportingCampaignRequest( identity_id=identity_id, campaign_id=campaign.id, ) ) assert result.budget == campaign.daily_budget assert result.budget_usd == campaign.daily_budget_usd assert result.currency == campaign.currency assert result.budget_type == AdReportingBudgetType.DAILY_BUDGET @pytest.mark.db def test_get_campaign_lifetime_budget( self, handler: GetAdReportingCampaignHandler, create_model: CreateModel, create_reporting_model: CreateReportingModel, identity_id: str, account: Account, ) -> None: ad_account = create_model(MetaAdAccount) create_model( MetaUserAdAccount, ad_account_id=ad_account.id, identity_id=identity_id, vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, ) campaign = create_reporting_model( AdReportingCampaignDbt, account_id=ad_account.external_id, platform=AdReportingPlatform.META, daily_budget=None, daily_budget_usd=None, ) result = handler.handle( GetAdReportingCampaignRequest( identity_id=identity_id, campaign_id=campaign.id, ) ) assert result.budget == campaign.lifetime_budget assert result.budget_usd == campaign.lifetime_budget_usd assert result.currency == campaign.currency assert result.budget_type == AdReportingBudgetType.LIFETIME_BUDGET @pytest.mark.db def test_get_campaign_ad_set_budget( self, handler: GetAdReportingCampaignHandler, create_model: CreateModel, create_reporting_model: CreateReportingModel, identity_id: str, account: Account, ) -> None: ad_account = create_model(MetaAdAccount) create_model( MetaUserAdAccount, ad_account_id=ad_account.id, identity_id=identity_id, vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, ) campaign = create_reporting_model( AdReportingCampaignDbt, account_id=ad_account.external_id, platform=AdReportingPlatform.META, daily_budget=None, daily_budget_usd=None, lifetime_budget=None, lifetime_budget_usd=None, ) result = handler.handle( GetAdReportingCampaignRequest( identity_id=identity_id, campaign_id=campaign.id, ) ) assert result.budget is None assert result.budget_usd is None assert result.currency == campaign.currency assert result.budget_type == AdReportingBudgetType.AD_SET_BUDGET