import pytest from campaigns.auth.dtos import User from campaigns.connectors.db import Database from campaigns.meta.enums import AudienceGender from campaigns.meta.handlers import ( CreateOrUpdateCampaignTargetingAudienceHandler, CreateOrUpdateCampaignTargetingAudienceRequest, ) from campaigns.meta.models import Campaign, TargetingAudience from campaigns.meta.repositories import CampaignRepository from campaigns.meta.services import CampaignService from tests.unit.faker import FakerTyped from tests.unit.types import CreateModel @pytest.fixture def handler( db: Database, campaign_repository: CampaignRepository, campaign_service: CampaignService, ) -> CreateOrUpdateCampaignTargetingAudienceHandler: return CreateOrUpdateCampaignTargetingAudienceHandler( db=db, campaign_repository=campaign_repository, campaign_service=campaign_service, ) async def test_create_campaign_targeting_audience( handler: CreateOrUpdateCampaignTargetingAudienceHandler, create_model: CreateModel, user: User, ) -> None: campaign = await create_model(Campaign, targeting_auidience=None) request = CreateOrUpdateCampaignTargetingAudienceRequest( user=user, campaign_id=campaign.id, locations=[], age_min=18, age_max=65, genders=[AudienceGender.MALE], interests=[], ) audience = await handler.handle(request=request) assert campaign.targeting_audience == audience assert audience.locations == request.locations assert audience.age_min == request.age_min assert audience.age_max == request.age_max assert audience.genders == request.genders assert audience.interests == request.interests async def test_update_campaign_targeting_audience( handler: CreateOrUpdateCampaignTargetingAudienceHandler, create_model: CreateModel, user: User, fake: FakerTyped, ) -> None: targeting_audience = await create_model(TargetingAudience) campaign = await create_model(Campaign, targeting_audience=targeting_audience) request = CreateOrUpdateCampaignTargetingAudienceRequest( user=user, campaign_id=campaign.id, locations=[], age_min=18, age_max=65, genders=[AudienceGender.MALE], interests=[], ) result = await handler.handle(request=request) assert result.locations == request.locations assert result.age_min == request.age_min assert result.age_max == request.age_max assert result.genders == request.genders assert result.interests == request.interests