from unittest import mock import pytest from campaigns.assets.models import Asset from campaigns.assets.services import AssetService from campaigns.connectors.db import Database from campaigns.connectors.facebook.models import CreatedAdImage from campaigns.meta.handlers import ( CreateCampaignAdImageHandler, CreateCampaignAdImageRequest, ) from campaigns.meta.models import CampaignImage from campaigns.meta.repositories import CampaignImageRepository from campaigns.meta.services import CampaignImageService from tests.unit.faker import FakerTyped from tests.unit.types import CreateModel @pytest.fixture def handler( db: Database, facebook_client_mock: mock.MagicMock, campaign_image_repository: CampaignImageRepository, campaign_image_service: CampaignImageService, asset_service: AssetService, ) -> CreateCampaignAdImageHandler: return CreateCampaignAdImageHandler( db=db, facebook_client=facebook_client_mock, campaign_image_repository=campaign_image_repository, campaign_image_service=campaign_image_service, asset_service=asset_service, ) async def test_create_ad_image_has_image_hash( handler: CreateCampaignAdImageHandler, create_model: CreateModel, facebook_client_mock: mock.MagicMock, fake: FakerTyped, ) -> None: image_url = fake.image_url() image_hash = fake.pystr() image = await create_model(CampaignImage, image_hash=image_hash) result = await handler.handle( request=CreateCampaignAdImageRequest( image_id=image.id, image_url=image_url, ), ) facebook_client_mock.create_ad_image.assert_not_called() assert result.image_hash == image_hash async def test_create_ad_image_without_image_hash( handler: CreateCampaignAdImageHandler, facebook_client_mock: mock.MagicMock, create_model: CreateModel, fake: FakerTyped, ) -> None: image_url = fake.image_url() image_hash = fake.pystr() asset = await create_model(Asset) image = await create_model(CampaignImage, asset=asset) facebook_client_mock.create_ad_image.return_value = CreatedAdImage( hash=image_hash, url=fake.image_url(), url_256=fake.image_url(), ) result = await handler.handle( request=CreateCampaignAdImageRequest( image_id=image.id, image_url=image_url, ), ) assert result.image_hash == image_hash assert result.asset.id == asset.id assert result.asset.thumbnail_key == asset.thumbnail_key assert result.thumbnail_url assert result.thumbnail_url.endswith(asset.filename)