from typing import get_args import pytest from dmp.ad_reporting.dtos import AdReportingAdSetCriteria from dmp.ad_reporting.enums import AdReportingObjective, AdReportingPlatform from dmp.ad_reporting.models import ( AdReportingAdSetDbt, AdReportingCampaignDbt, ) from dmp.ad_reporting.repositories import AdReportingAdSetRepository from dmp.ad_reporting.types import AdReportingAdSetOrderBy from tests.unit.faker import FakerTyped from tests.unit.types import CreateReportingModel class TestAdReportingAdSetRepository: @pytest.mark.db def test_find_by_criteria( self, repository: AdReportingAdSetRepository, fake: FakerTyped, ) -> None: repository.find_by_criteria( AdReportingAdSetCriteria( search="test", global_participant_id=fake.uuid4_string(), platform=AdReportingPlatform.META, objective=AdReportingObjective.OUTCOME_TRAFFIC, account_ids={fake.uuid4_string(), fake.uuid4_string()}, campaign_ids={fake.uuid4_string()}, ), limit=10, offset=5, ) @pytest.mark.db @pytest.mark.parametrize("order_by", get_args(AdReportingAdSetOrderBy)) def test_find_by_criteria_supported_order_by_columns( self, repository: AdReportingAdSetRepository, order_by: AdReportingAdSetOrderBy, ) -> None: repository.find_by_criteria( AdReportingAdSetCriteria(), order_by=[order_by], ) @pytest.mark.db def test_find_by_criteria_fields( self, repository: AdReportingAdSetRepository, create_reporting_model: CreateReportingModel, ) -> None: ad_set = create_reporting_model( AdReportingAdSetDbt, platform=AdReportingPlatform.META, ) ad_sets = repository.find_by_criteria( AdReportingAdSetCriteria(), limit=1, offset=0, ) assert len(ad_sets) == 1 result = ad_sets[0] assert result.id == ad_set.id assert result.name == ad_set.name assert result.campaign_id == ad_set.campaign_id assert result.campaign_name == ad_set.campaign_name assert result.account_id == ad_set.account_id assert result.accounts == set() assert result.global_participant_ids == {ad_set.campaign_global_participant_id} assert result.platform == ad_set.platform assert result.objective == ad_set.campaign_objective assert result.start_at == ad_set.start_at assert result.end_at == ad_set.end_at assert result.clicks == ad_set.clicks assert result.impressions == ad_set.impressions assert result.reach == ad_set.reach assert result.estimated_ad_recallers == ad_set.estimated_ad_recallers assert result.views_p25 == ad_set.views_p25 assert result.views == ad_set.views assert result.purchases == ad_set.purchases assert result.follows == ad_set.follows assert result.spend == ad_set.spend assert result.currency == ad_set.currency assert result.spend_usd == ad_set.spend_usd assert result.actions == ad_set.actions assert result.action_type == ad_set.action_type assert result.rate == ad_set.rate assert result.rate_type == ad_set.rate_type assert result.cost_per_action == ad_set.cost_per_action assert result.cost_per_action_usd == ad_set.cost_per_action_usd assert result.frequency == ad_set.frequency @pytest.mark.db def test_filter_ads_by_global_participant_id( self, repository: AdReportingAdSetRepository, create_reporting_model: CreateReportingModel, ) -> None: campaign_1 = create_reporting_model(AdReportingCampaignDbt) campaign_1.global_participant_ids = {"gp1", "gp2"} ad_set_1 = create_reporting_model( AdReportingAdSetDbt, campaign_id=campaign_1.id ) campaign_2 = create_reporting_model(AdReportingCampaignDbt) campaign_2.global_participant_ids = {"gp3", "gp4"} ad_set_2 = create_reporting_model( AdReportingAdSetDbt, campaign_id=campaign_2.id ) ad_sets = repository.find_by_criteria( AdReportingAdSetCriteria(global_participant_id="gp1") ) assert len(ad_sets) == 1 assert ad_sets[0].id == ad_set_1.id ad_sets = repository.find_by_criteria( AdReportingAdSetCriteria(global_participant_id="gp2") ) assert len(ad_sets) == 1 assert ad_sets[0].id == ad_set_1.id ad_sets = repository.find_by_criteria( AdReportingAdSetCriteria(global_participant_id="gp3") ) assert len(ad_sets) == 1 assert ad_sets[0].id == ad_set_2.id ad_sets = repository.find_by_criteria( AdReportingAdSetCriteria(global_participant_id="gp4") ) assert len(ad_sets) == 1 assert ad_sets[0].id == ad_set_2.id