import pytest from campaigns.connectors.facebook.enums import ( AdSetFacebookPosition, AdSetInstagramPosition, ) from campaigns.meta.dtos import AdFormat from campaigns.meta.enums import AdFormatGroup, AssetPositionGroup, CampaignPlatform from campaigns.meta.repositories import AdFormatRepository from tests.unit.faker import FakerTyped test_formats = [ AdFormat( id="DESKTOP_FEED_STANDARD", name="Facebook Feed", position=AdSetFacebookPosition.FEED, group=AdFormatGroup.FEED, position_group=AssetPositionGroup.RATIO_1_1, platform=CampaignPlatform.FACEBOOK, height=100, width=100, ), AdFormat( id="FACEBOOK_STORY_MOBILE", name="Facebook Stories", position=AdSetFacebookPosition.STORY, group=AdFormatGroup.STORY, position_group=AssetPositionGroup.RATIO_9_16, platform=CampaignPlatform.FACEBOOK, height=100, width=100, ), AdFormat( id="INSTAGRAM_REELS", name="Facebook Reels", position=AdSetInstagramPosition.REELS, group=AdFormatGroup.STORY, position_group=AssetPositionGroup.RATIO_9_16, platform=CampaignPlatform.INSTAGRAM, height=100, width=100, ), AdFormat( id="INSTANT_ARTICLE_STANDARD", name="Facebook Instant Articles", position=AdSetFacebookPosition.INSTANT_ARTICLE, group=AdFormatGroup.OTHER, position_group=AssetPositionGroup.RATIO_1_1, platform=CampaignPlatform.FACEBOOK, height=100, width=100, ), ] @pytest.fixture def ad_format_repository() -> AdFormatRepository: ad_format_repository = AdFormatRepository() ad_format_repository.formats = test_formats return ad_format_repository def test_all(ad_format_repository: AdFormatRepository) -> None: result = ad_format_repository.all() assert result == test_formats def test_get_or_none_return_none( ad_format_repository: AdFormatRepository, fake: FakerTyped ) -> None: result = ad_format_repository.get_or_none(fake.pystr()) assert result is None def test_get_or_none_return_meta_campaign_audience( ad_format_repository: AdFormatRepository, fake: FakerTyped ) -> None: ad_format = fake.choice(test_formats) result = ad_format_repository.get_or_none(ad_format.id) assert result == ad_format @pytest.mark.parametrize( "position_groups, platforms, expected", [ ([], [], []), ([], [CampaignPlatform.INSTAGRAM, CampaignPlatform.FACEBOOK], []), ( [AssetPositionGroup.RATIO_9_16], [CampaignPlatform.INSTAGRAM], [test_formats[2]], ), ([AssetPositionGroup.RATIO_1_1], [CampaignPlatform.INSTAGRAM], []), ( [AssetPositionGroup.RATIO_9_16], [CampaignPlatform.INSTAGRAM], [test_formats[2]], ), ( [AssetPositionGroup.RATIO_1_1, AssetPositionGroup.RATIO_9_16], [CampaignPlatform.FACEBOOK], [test_formats[0], test_formats[1], test_formats[3]], ), ( [AssetPositionGroup.RATIO_9_16], [CampaignPlatform.INSTAGRAM, CampaignPlatform.FACEBOOK], [test_formats[1], test_formats[2]], ), ], ) def test_find_by_position_groups_and_platforms( ad_format_repository: AdFormatRepository, fake: FakerTyped, position_groups: list[AssetPositionGroup], platforms: list[CampaignPlatform], expected: list[AdFormat], ) -> None: result = ad_format_repository.find_by_position_groups_and_platforms( position_groups=position_groups, platforms=platforms ) assert result == expected