from unittest import mock import pytest from campaigns.connectors.facebook.exceptions import FacebookClientError from campaigns.connectors.facebook.models import InstagramMedia, PagePost from campaigns.meta.enums import CampaignPlatform from campaigns.meta.exceptions import CampaignPostDoesNotExist from campaigns.meta.models import Campaign from campaigns.meta.services import CampaignPostService from tests.unit.faker import FakerTyped from tests.unit.types import BuildModel, CreateModel async def test_get_campaign_post_no_external( campaign_post_service: CampaignPostService, create_model: CreateModel ) -> None: campaign = await create_model( Campaign, facebook_post_external_id=None, instagram_post_external_id=None, ) with pytest.raises(CampaignPostDoesNotExist): await campaign_post_service.get_campaign_post(campaign) async def test_get_campaign_post_facebook_post_found( campaign_post_service: CampaignPostService, build_model: BuildModel, create_model: CreateModel, facebook_client_mock: mock.MagicMock, ) -> None: facebook_post = build_model(PagePost) campaign = await create_model( Campaign, facebook_post_external_id=facebook_post.id, instagram_post_external_id=None, ) facebook_client_mock.get_post.return_value = facebook_post post = await campaign_post_service.get_campaign_post(campaign) assert post.id == facebook_post.id assert post.platform == CampaignPlatform.FACEBOOK assert post.title == facebook_post.message assert post.permalink_url == facebook_post.permalink_url assert post.picture_url == facebook_post.full_picture assert post.thumbnail_url == facebook_post.picture assert post.created_at == facebook_post.created_time async def test_get_campaign_post_instagram_post_found( campaign_post_service: CampaignPostService, build_model: BuildModel, create_model: CreateModel, facebook_client_mock: mock.MagicMock, ) -> None: instagram_post = build_model(InstagramMedia) campaign = await create_model( Campaign, facebook_post_external_id=None, instagram_post_external_id=instagram_post.id, ) facebook_client_mock.get_post.side_effect = FacebookClientError() facebook_client_mock.get_instagram_media_item.return_value = instagram_post post = await campaign_post_service.get_campaign_post(campaign) assert post.id == instagram_post.id assert post.platform == CampaignPlatform.INSTAGRAM assert post.title == instagram_post.caption assert post.permalink_url == instagram_post.permalink assert post.picture_url == instagram_post.media_url assert post.thumbnail_url == instagram_post.thumbnail_url assert post.created_at == instagram_post.timestamp async def test_get_campaign_post_instagram_not_found( campaign_post_service: CampaignPostService, create_model: CreateModel, facebook_client_mock: mock.MagicMock, fake: FakerTyped, ) -> None: campaign = await create_model( Campaign, facebook_post_external_id=None, instagram_post_external_id=fake.numeric_string(), ) facebook_client_mock.get_post.side_effect = FacebookClientError() facebook_client_mock.get_instagram_media_item.side_effect = FacebookClientError() with pytest.raises(CampaignPostDoesNotExist): await campaign_post_service.get_campaign_post(campaign)