from unittest import mock import pytest from campaigns.auth.dtos import User from campaigns.connectors.db import Database from campaigns.connectors.facebook.models import PagePost from campaigns.meta.enums import ( CampaignCallToAction, CampaignContentType, CampaignLinkType, CampaignPlatform, ) from campaigns.meta.handlers import ( UpdateCampaignCreativeHandler, UpdateCampaignCreativeRequest, ) from campaigns.meta.models import Campaign from campaigns.meta.repositories import CampaignRepository from campaigns.meta.services import CampaignPostService, CampaignService from campaigns.meta.validators import CampaignValidator from tests.unit.faker import FakerTyped from tests.unit.types import BuildModel, CreateModel @pytest.fixture def handler( db: Database, campaign_validator: CampaignValidator, campaign_repository: CampaignRepository, campaign_service: CampaignService, campaign_post_service: CampaignPostService, ) -> UpdateCampaignCreativeHandler: return UpdateCampaignCreativeHandler( db=db, campaign_validator=campaign_validator, campaign_repository=campaign_repository, campaign_service=campaign_service, campaign_post_service=campaign_post_service, ) async def test_update_campaign_creative_image( handler: UpdateCampaignCreativeHandler, create_model: CreateModel, user: User, fake: FakerTyped, ) -> None: content_type = CampaignContentType.IMAGE campaign = await create_model(Campaign, content_type=content_type) request = UpdateCampaignCreativeRequest( user=user, campaign_id=campaign.id, content_type=content_type, platforms=[CampaignPlatform.FACEBOOK], post_external_id=None, primary_text=fake.pystr(), headline=fake.pystr(), description=fake.pystr(), link_type=CampaignLinkType.WEBSITE, website_url=fake.uri(), landing_page_path=None, landing_page_product_id=None, call_to_action=CampaignCallToAction.SHOP_NOW, ) result = await handler.handle(request) assert result.content_type == request.content_type assert result.platforms == request.platforms assert result.facebook_post_external_id is None assert result.instagram_post_external_id is None assert result.primary_text == request.primary_text assert result.description == request.description assert result.link_type == request.link_type assert result.landing_page_path == request.landing_page_path assert result.landing_page_product_id == request.landing_page_product_id assert result.call_to_action == request.call_to_action assert result.updated_by == request.user.id.identity_id async def test_update_campaign_creative_post( handler: UpdateCampaignCreativeHandler, facebook_client_mock: mock.MagicMock, build_model: BuildModel, create_model: CreateModel, user: User, fake: FakerTyped, ) -> None: content_type = CampaignContentType.POST facebook_post = build_model(PagePost) campaign = await create_model(Campaign, content_type=content_type) request = UpdateCampaignCreativeRequest( user=user, campaign_id=campaign.id, content_type=content_type, platforms=[CampaignPlatform.FACEBOOK], post_external_id=facebook_post.id, primary_text=fake.pystr(), headline=fake.pystr(), description=fake.pystr(), link_type=CampaignLinkType.WEBSITE, website_url=fake.uri(), landing_page_path=None, landing_page_product_id=None, call_to_action=CampaignCallToAction.SHOP_NOW, ) facebook_client_mock.get_post.return_value = facebook_post result = await handler.handle(request) assert result.content_type == request.content_type assert result.platforms == request.platforms assert result.facebook_post_external_id == request.post_external_id assert result.instagram_post_external_id is None assert result.primary_text == request.primary_text assert result.description == request.description assert result.link_type == request.link_type assert result.website_url == request.website_url assert result.landing_page_path == request.landing_page_path assert result.landing_page_product_id == request.landing_page_product_id assert result.call_to_action == request.call_to_action assert result.updated_by == request.user.id.identity_id async def test_update_campaign_creative_landing_page( handler: UpdateCampaignCreativeHandler, create_model: CreateModel, user: User, fake: FakerTyped, ) -> None: campaign = await create_model(Campaign) request = UpdateCampaignCreativeRequest( user=user, campaign_id=campaign.id, content_type=campaign.content_type, platforms=[CampaignPlatform.FACEBOOK], post_external_id=None, primary_text=fake.pystr(), headline=fake.pystr(), description=fake.pystr(), link_type=CampaignLinkType.LANDING_PAGE, website_url=None, landing_page_path="/test", landing_page_product_id=fake.integer(), call_to_action=CampaignCallToAction.SHOP_NOW, ) result = await handler.handle(request) assert result.content_type == request.content_type assert result.platforms == request.platforms assert result.facebook_post_external_id is None assert result.instagram_post_external_id is None assert result.primary_text == request.primary_text assert result.description == request.description assert result.link_type == request.link_type assert result.landing_page_path == request.landing_page_path assert result.landing_page_product_id == request.landing_page_product_id assert result.call_to_action == request.call_to_action assert result.updated_by == request.user.id.identity_id