import pytest from campaigns.connectors.facebook.enums import AdSetFacebookPosition from campaigns.meta.dtos import AdFormat from campaigns.meta.enums import ( AdFormatGroup, AssetPositionGroup, CampaignContentType, CampaignPlatform, ) from campaigns.meta.models import Campaign, CampaignImage from campaigns.meta.repositories.ad_format import AdFormatRepository from campaigns.meta.services.ad_format import AdFormatService from tests.unit.types import CreateModel @pytest.fixture def ad_format() -> AdFormat: return AdFormat( id="DESKTOP_FEED_STANDARD", name="Facebook Feed", group=AdFormatGroup.FEED, position_group=AssetPositionGroup.RATIO_1_1, platform=CampaignPlatform.FACEBOOK, position=AdSetFacebookPosition.FEED, height=100, width=100, ) @pytest.fixture def ad_format_repository(ad_format: AdFormat) -> AdFormatRepository: ad_format_repository = AdFormatRepository() ad_format_repository.formats = [ad_format] return ad_format_repository @pytest.fixture def ad_format_service(ad_format_repository: AdFormatRepository) -> AdFormatService: return AdFormatService(ad_format_repository=ad_format_repository) async def test_get_campaign_available_ad_formats_post( ad_format_service: AdFormatService, ad_format_repository: AdFormatRepository, create_model: CreateModel, ad_format: AdFormat, ) -> None: campaign = await create_model(Campaign) result = ad_format_service.get_campaign_available_ad_formats( campaign, content_type=CampaignContentType.POST, platforms=[CampaignPlatform.FACEBOOK], ) assert result == [ad_format] async def test_get_campaign_available_ad_formats( ad_format_service: AdFormatService, create_model: CreateModel, ad_format: AdFormat ) -> None: image = await create_model( CampaignImage, position_group=ad_format.position_group, is_valid=True ) campaign = await create_model(Campaign, images=[image]) result = ad_format_service.get_campaign_available_ad_formats( campaign=campaign, content_type=CampaignContentType.IMAGE, platforms=[ad_format.platform], ) assert result == [ad_format] async def test_get_campaign_available_ad_formats_invalid_asset( ad_format_service: AdFormatService, create_model: CreateModel, ) -> None: image = await create_model( CampaignImage, position_group=AssetPositionGroup.RATIO_9_16, is_valid=False, ) campaign = await create_model(Campaign, images=[image]) result = ad_format_service.get_campaign_available_ad_formats( campaign=campaign, content_type=CampaignContentType.IMAGE, platforms=[CampaignPlatform.INSTAGRAM], ) assert result == []