import pytest from dirty_equals import IsList from faker import Faker from fansifter_common.auth.account import Account from dmp.ad_reporting.exceptions import AdReportingCampaignIsNotAllowedError from dmp.ad_reporting.handlers import ( CreateAdReportingReportHandler, CreateAdReportingReportRequest, ) 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 TestCreateAdReportingReportHandler: @pytest.mark.db def test_create_report( self, handler: CreateAdReportingReportHandler, create_model: CreateModel, create_reporting_model: CreateReportingModel, identity_id: str, account: Account, fake: FakerTyped, ) -> 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, ) name = fake.name() report = handler.handle( CreateAdReportingReportRequest( identity_id=identity_id, name=name, campaign_ids={campaign.id}, search=None, global_participant_id=None, platform=None, objective=None, ) ) assert report.name == name assert report.campaign_ids == [campaign.id] assert report.identity_id == identity_id @pytest.mark.db def test_create_report_select_all( self, handler: CreateAdReportingReportHandler, create_model: CreateModel, create_reporting_model: CreateReportingModel, identity_id: str, account: Account, fake: FakerTyped, ) -> 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, ) name = fake.name() report = handler.handle( CreateAdReportingReportRequest( identity_id=identity_id, name=name, campaign_ids=None, search=None, global_participant_id=None, platform=None, objective=None, ) ) assert report.name == name assert report.campaign_ids == [campaign.id] assert report.identity_id == identity_id @pytest.mark.db def test_create_report_select_filtered( self, handler: CreateAdReportingReportHandler, create_model: CreateModel, create_reporting_model: CreateReportingModel, identity_id: str, account: Account, faker: Faker, ) -> None: global_participant_id_1 = faker.uuid4() global_participant_id_2 = faker.uuid4() 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, global_participant_id=global_participant_id_1, ) _ = create_reporting_model( AdReportingCampaignDbt, account_id=ad_account.external_id, global_participant_id=global_participant_id_2, ) campaign_3 = create_reporting_model( AdReportingCampaignDbt, account_id=ad_account.external_id, global_participant_id=global_participant_id_1, ) report = handler.handle( CreateAdReportingReportRequest( identity_id=identity_id, name=faker.name(), campaign_ids=None, search=None, global_participant_id=global_participant_id_1, platform=None, objective=None, ) ) assert report.campaign_ids == IsList( campaign_1.id, campaign_3.id, check_order=False, ) @pytest.mark.db def test_create_report_not_allowed_account( self, handler: CreateAdReportingReportHandler, create_reporting_model: CreateReportingModel, identity_id: str, fake: FakerTyped, ) -> None: campaign = create_reporting_model(AdReportingCampaignDbt) with pytest.raises(AdReportingCampaignIsNotAllowedError): handler.handle( CreateAdReportingReportRequest( identity_id=identity_id, name=fake.name(), campaign_ids={campaign.id}, search=None, global_participant_id=None, platform=None, objective=None, ) )