import pytest from dirty_equals import IsList from faker import Faker from fansifter_common.auth.account import Account from dmp.ad_reporting.enums import AdReportingPlatform from dmp.ad_reporting.exceptions import ( AdReportingCampaignNotFoundError, AdReportingReportNotFoundError, ) from dmp.ad_reporting.handlers import ( AddAdReportingReportToCampaignsHandler, AddAdReportingReportToCampaignsRequest, ) from dmp.ad_reporting.models import AdReportingCampaignDbt, AdReportingReport from dmp.meta.models import MetaAdAccount, MetaUserAdAccount from tests.unit.types import CreateModel, CreateReportingModel class TestAddAdReportingReportToCampaignsHandler: @pytest.mark.db def test_add_report_to_campaigns( self, handler: AddAdReportingReportToCampaignsHandler, 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_1 = create_reporting_model( AdReportingCampaignDbt, account_id=ad_account.external_id, platform=AdReportingPlatform.META, ) campaign_2 = create_reporting_model( AdReportingCampaignDbt, account_id=ad_account.external_id, platform=AdReportingPlatform.META, ) report = create_reporting_model( AdReportingReport, identity_id=identity_id, ) campaigns_added = handler.handle( AddAdReportingReportToCampaignsRequest( identity_id=identity_id, campaign_ids={campaign_1.id, campaign_2.id}, report_id=report.id, search=None, global_participant_id=None, countries=None, platform=None, objective=None, ) ) assert campaigns_added == 2 assert campaign_1.id in report.campaign_ids assert campaign_2.id in report.campaign_ids @pytest.mark.db def test_add_report_to_campaigns_select_all( self, handler: AddAdReportingReportToCampaignsHandler, 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_1 = create_reporting_model( AdReportingCampaignDbt, account_id=ad_account.external_id, platform=AdReportingPlatform.META, ) campaign_2 = create_reporting_model( AdReportingCampaignDbt, account_id=ad_account.external_id, platform=AdReportingPlatform.META, ) report = create_reporting_model( AdReportingReport, identity_id=identity_id, ) campaigns_added = handler.handle( AddAdReportingReportToCampaignsRequest( identity_id=identity_id, report_id=report.id, campaign_ids=None, search=None, global_participant_id=None, countries=None, platform=None, objective=None, ) ) assert campaigns_added == 2 assert report.campaign_ids == IsList( campaign_1.id, campaign_2.id, check_order=False, ) @pytest.mark.db def test_add_report_to_campaigns_already_added( self, handler: AddAdReportingReportToCampaignsHandler, 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, ) report = create_reporting_model( AdReportingReport, identity_id=identity_id, campaign_ids=[campaign.id], ) campaigns_added = handler.handle( AddAdReportingReportToCampaignsRequest( identity_id=identity_id, campaign_ids={campaign.id}, report_id=report.id, search=None, global_participant_id=None, countries=None, platform=None, objective=None, ) ) assert campaigns_added == 0 assert campaign.id in report.campaign_ids @pytest.mark.db def test_add_report_to_campaigns_invalid_report_id( self, handler: AddAdReportingReportToCampaignsHandler, create_model: CreateModel, create_reporting_model: CreateReportingModel, identity_id: str, account: Account, faker: Faker, ) -> 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, ) report_id = faker.uuid4() with pytest.raises(AdReportingReportNotFoundError): handler.handle( AddAdReportingReportToCampaignsRequest( identity_id=identity_id, campaign_ids={campaign.id}, report_id=report_id, search=None, global_participant_id=None, countries=None, platform=None, objective=None, ) ) @pytest.mark.db def test_add_report_to_campaigns_no_allowed_accounts_to_all_campaigns( self, handler: AddAdReportingReportToCampaignsHandler, create_model: CreateModel, create_reporting_model: CreateReportingModel, identity_id: str, account: Account, faker: Faker, ) -> 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, ) create_reporting_model( AdReportingCampaignDbt, account_id=ad_account.external_id, platform=AdReportingPlatform.META, ) report = create_reporting_model( AdReportingReport, identity_id=identity_id, ) with pytest.raises(AdReportingCampaignNotFoundError): handler.handle( AddAdReportingReportToCampaignsRequest( identity_id=identity_id, campaign_ids={faker.uuid4()}, report_id=report.id, search=None, global_participant_id=None, countries=None, platform=None, objective=None, ) )