import pytest from fansifter_common.auth.account import Account from dmp.ad_reporting.enums import AdReportingBudgetType, AdReportingPlatform from dmp.ad_reporting.exceptions import AdReportingAdSetNotFoundError from dmp.ad_reporting.handlers import ( GetAdReportingAdSetHandler, GetAdReportingAdSetRequest, ) from dmp.ad_reporting.models import AdReportingAdSetDbt, AdReportingCampaignDbt from dmp.meta.models import MetaAdAccount, MetaUserAdAccount from tests.unit.faker import FakerTyped from tests.unit.types import CreateModel, CreateReportingModel class TestGetAdReportingAdSetHandler: @pytest.mark.db def test_get_ad_set( self, handler: GetAdReportingAdSetHandler, 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, ) ad_set = create_reporting_model( AdReportingAdSetDbt, account_id=ad_account.external_id, platform=AdReportingPlatform.META, campaign_id=campaign.id, ) result = handler.handle( GetAdReportingAdSetRequest( identity_id=identity_id, ad_set_id=ad_set.id, ) ) assert result.id == ad_set.id @pytest.mark.db def test_get_ad_set_no_allowed_accounts( self, handler: GetAdReportingAdSetHandler, create_reporting_model: CreateReportingModel, identity_id: str, ) -> None: ad_set = create_reporting_model( AdReportingAdSetDbt, platform=AdReportingPlatform.META ) with pytest.raises(AdReportingAdSetNotFoundError): handler.handle( GetAdReportingAdSetRequest( identity_id=identity_id, ad_set_id=ad_set.id, ) ) @pytest.mark.db def test_get_ad_set_not_found( self, handler: GetAdReportingAdSetHandler, identity_id: str, fake: FakerTyped ) -> None: with pytest.raises(AdReportingAdSetNotFoundError): handler.handle( GetAdReportingAdSetRequest( identity_id=identity_id, ad_set_id=fake.uuid4_string(), ) ) @pytest.mark.db def test_get_ad_set_daily_budget( self, handler: GetAdReportingAdSetHandler, 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, ) ad_set = create_reporting_model( AdReportingAdSetDbt, account_id=ad_account.external_id, platform=AdReportingPlatform.META, campaign_id=campaign.id, ) result = handler.handle( GetAdReportingAdSetRequest( identity_id=identity_id, ad_set_id=ad_set.id, ) ) assert result.budget == ad_set.daily_budget assert result.budget_usd == ad_set.daily_budget_usd assert result.currency == ad_set.currency assert result.budget_type == AdReportingBudgetType.DAILY_BUDGET @pytest.mark.db def test_get_ad_set_lifetime_budget( self, handler: GetAdReportingAdSetHandler, 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, ) ad_set = create_reporting_model( AdReportingAdSetDbt, account_id=ad_account.external_id, platform=AdReportingPlatform.META, campaign_id=campaign.id, daily_budget=None, daily_budget_usd=None, ) result = handler.handle( GetAdReportingAdSetRequest( identity_id=identity_id, ad_set_id=ad_set.id, ) ) assert result.budget == ad_set.lifetime_budget assert result.budget_usd == ad_set.lifetime_budget_usd assert result.currency == ad_set.currency assert result.budget_type == AdReportingBudgetType.LIFETIME_BUDGET @pytest.mark.db def test_get_ad_set_campaign_budget( self, handler: GetAdReportingAdSetHandler, 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, ) ad_set = create_reporting_model( AdReportingAdSetDbt, account_id=ad_account.external_id, platform=AdReportingPlatform.META, campaign_id=campaign.id, daily_budget=None, daily_budget_usd=None, lifetime_budget=None, lifetime_budget_usd=None, ) result = handler.handle( GetAdReportingAdSetRequest( identity_id=identity_id, ad_set_id=ad_set.id, ) ) assert result.budget is None assert result.budget_usd is None assert result.currency == ad_set.currency assert result.budget_type == AdReportingBudgetType.CAMPAIGN_BUDGET