from unittest import mock import pytest from audience_common.auth.account import AccountAccess from campaigns.auth.dtos import User, UserId from campaigns.connectors.db import Database from campaigns.connectors.facebook.models import InstagramBusinessAccountWithId from campaigns.connectors.ows_product import Product from campaigns.meta.enums import CampaignObjective from campaigns.meta.handlers import UpdateCampaignHandler, UpdateCampaignRequest from campaigns.meta.models import Campaign, FacebookPageLabel from campaigns.meta.repositories import CampaignRepository from campaigns.meta.services import 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, facebook_client_mock: mock.MagicMock, campaign_validator: CampaignValidator, campaign_repository: CampaignRepository, campaign_service: CampaignService, ) -> UpdateCampaignHandler: return UpdateCampaignHandler( db=db, facebook_client=facebook_client_mock, campaign_validator=campaign_validator, campaign_repository=campaign_repository, campaign_service=campaign_service, ) async def test_update_campaign( handler: UpdateCampaignHandler, 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) page_label = await create_model(FacebookPageLabel) page = page_label.page campaign = await create_model(Campaign) 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 = UpdateCampaignRequest( user=User( id=user_id, account_access=AccountAccess( accounts=[page_label.account], allowed_any_account=True, ), ), campaign_id=campaign.id, 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 ) result = await handler.handle(request) assert result.name == request.name assert result.vendor_id == request.vendor_id assert result.subaccount_id == request.subaccount_id or None assert result.global_participant_id == request.global_participant_id assert result.product_id == product.product_id assert result.product_upc == product.upc assert result.facebook_page_id == request.facebook_page_id assert result.instagram_account_external_id == instagram_account.id assert result.objective == request.objective assert result.status == campaign.status assert result.created_by == campaign.created_by assert result.updated_by == request.user.id.identity_id