from datetime import timedelta import pytest from fansifter_common.auth.account import Account from fansifter_common.utils import timezone from dmp.ad_reporting.dtos import AdReportingCampaignReport from dmp.ad_reporting.enums import AdReportingPlatform from dmp.ad_reporting.exceptions import AdReportingCampaignNotFoundError from dmp.ad_reporting.handlers import ( GetAdReportingCampaignReportsHandler, GetAdReportingCampaignReportsRequest, ) from dmp.ad_reporting.models import AdReportingCampaignDbt, AdReportingReport from dmp.meta.models import MetaAdAccount, MetaUserAdAccount from tests.unit.faker import FakerTyped from tests.unit.types import CreateModel, CreateReportingModel class TestGetAdReportingCampaignReportsHandler: @pytest.mark.db def test_get_campaign_reports( self, handler: GetAdReportingCampaignReportsHandler, 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, ) dt_now = timezone.now() report_1 = create_reporting_model( AdReportingReport, name="report_1", identity_id=identity_id, campaign_ids={campaign.id}, created_at=dt_now + timedelta(seconds=1), ) report_11 = create_reporting_model( AdReportingReport, name="report_11", identity_id=identity_id, campaign_ids={campaign.id}, created_at=dt_now + timedelta(seconds=2), ) report_111 = create_reporting_model( AdReportingReport, name="report_111", identity_id=identity_id, created_at=dt_now + timedelta(seconds=3), ) create_reporting_model( AdReportingReport, name="report_2", identity_id=identity_id, created_at=dt_now + timedelta(seconds=4), ) result = handler.handle( GetAdReportingCampaignReportsRequest( identity_id=identity_id, campaign_id=campaign.id, search="report_1", ) ) assert result == [ AdReportingCampaignReport( report_id=report_111.id, report_name=report_111.name, has_campaign_included=False, ), AdReportingCampaignReport( report_id=report_11.id, report_name=report_11.name, has_campaign_included=True, ), AdReportingCampaignReport( report_id=report_1.id, report_name=report_1.name, has_campaign_included=True, ), ] @pytest.mark.db def test_get_campaign_reports_not_found( self, handler: GetAdReportingCampaignReportsHandler, identity_id: str, fake: FakerTyped, ) -> None: with pytest.raises(AdReportingCampaignNotFoundError): handler.handle( GetAdReportingCampaignReportsRequest( identity_id=identity_id, campaign_id=fake.uuid4_string(), search=None, ) )