from unittest import mock import pytest from campaigns.assets.services import AssetService from campaigns.meta.enums import AssetPositionGroup from campaigns.meta.models import Campaign, 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 campaign_image_service( facebook_client_mock: mock.MagicMock, campaign_image_repository: CampaignImageRepository, asset_service: AssetService, ) -> CampaignImageService: return CampaignImageService( facebook_client=facebook_client_mock, campaign_image_repository=campaign_image_repository, asset_service=asset_service, ) async def test_create_campaign_image( campaign_image_service: CampaignImageService, create_model: CreateModel, ) -> None: campaign = await create_model(Campaign) position_group = AssetPositionGroup.RATIO_1_1 image, credentials = await campaign_image_service.create_campaign_image( campaign, filename="test.jpg", position_group=position_group, ) assert credentials.asset_id == image.asset_id assert credentials.upload_metadata == { "meta_campaign_id": campaign.id, "meta_campaign_image_id": image.id, "meta_campaign_image_position_group": image.position_group, } async def test_delete_campaign_image( campaign_image_service: CampaignImageService, facebook_client_mock: mock.MagicMock, create_model: CreateModel, fake: FakerTyped, ) -> None: image_hash = fake.pystr() image = await create_model(CampaignImage, image_hash=image_hash) await campaign_image_service.delete_image(image) facebook_client_mock.delete_ad_image.assert_called_once_with(image.image_hash)