from unittest import mock import pytest from audience_common.auth.account import AccountAccess from campaigns.auth.dtos import User, UserId from campaigns.campaigns.enums import CampaignStatus from campaigns.connectors.db import Database from campaigns.connectors.facebook.models import ( InstagramBusinessAccountWithId, InstagramUser, ) from campaigns.connectors.ows_product import Product from campaigns.meta.enums import CampaignObjective from campaigns.meta.handlers import CreateCampaignHandler, CreateCampaignRequest from campaigns.meta.models import FacebookPageLabel from campaigns.meta.repositories import CampaignRepository 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, facebook_client_mock: mock.MagicMock, campaign_validator: CampaignValidator, campaign_repository: CampaignRepository, ) -> CreateCampaignHandler: return CreateCampaignHandler( db=db, facebook_client=facebook_client_mock, campaign_validator=campaign_validator, campaign_repository=campaign_repository, ) async def test_create_campaign( handler: CreateCampaignHandler, facebook_client_mock: mock.MagicMock, ows_product_mock: mock.MagicMock, build_model: BuildModel, create_model: CreateModel, user_id: UserId, fake: FakerTyped, ) -> None: instagram_account = build_model(InstagramBusinessAccountWithId) instagram_user = build_model(InstagramUser) page_label = await create_model(FacebookPageLabel) page = page_label.page product = Product( product_id=fake.integer(), upc=fake.numeric_string(), vendor_id=page_label.vendor_id, subaccount_id=page_label.subaccount_id, status="in_content", ) request = CreateCampaignRequest( user=User( id=user_id, account_access=AccountAccess( accounts=[page_label.account], ), ), name="Test", vendor_id=page_label.vendor_id, subaccount_id=page_label.subaccount_id, global_participant_id=fake.uuid4_string(), product_id=product.product_id, objective=CampaignObjective.TRAFFIC, facebook_page_id=page.id, ) ows_product_mock.get_product_by_id.return_value = product facebook_client_mock.get_instagram_business_account_for_page.return_value = ( instagram_account ) facebook_client_mock.get_instagram_user_for_page.return_value = instagram_user campaign = await handler.handle(request) assert campaign.name == request.name assert campaign.vendor_id == request.vendor_id assert campaign.subaccount_id == request.subaccount_id assert campaign.global_participant_id == request.global_participant_id assert campaign.product_id == product.product_id assert campaign.product_upc == product.upc assert campaign.facebook_page_id == request.facebook_page_id assert campaign.instagram_account_external_id == instagram_account.id assert campaign.instagram_user_external_id == instagram_user.id assert campaign.objective == request.objective assert campaign.status == CampaignStatus.DRAFT assert campaign.created_by == request.user.id.identity_id assert campaign.updated_by == request.user.id.identity_id