import pytest from campaigns.auth.dtos import User from campaigns.connectors.db import Database from campaigns.connectors.facebook.enums import ( AudienceEventSourceType, EngagementAudienceEventValue, ) from campaigns.meta.dtos import EngagementAudienceEvent from campaigns.meta.enums import CampaignPlatform from campaigns.meta.handlers import ( GetEngagementAudienceEventsHandler, GetEngagementAudienceEventsRequest, ) from campaigns.meta.models import Campaign, FacebookPage from campaigns.meta.repositories.engagement_audience_event import ( EngagementAudienceEventRepository, ) from campaigns.meta.services import CampaignService from tests.unit.faker import FakerTyped from tests.unit.types import CreateModel test_events = [ EngagementAudienceEvent( id="instagram_profile_follow", name="Followed Instagram Profile", platform=CampaignPlatform.INSTAGRAM, source_type=AudienceEventSourceType.IG_BUSINESS, value=EngagementAudienceEventValue.IG_PROFILE_FOLLOW, ), EngagementAudienceEvent( id="page_post_interaction", name="Interacted With Facebook Post", platform=CampaignPlatform.FACEBOOK, source_type=AudienceEventSourceType.PAGE, value=EngagementAudienceEventValue.FB_PAGE_POST_INTERACTION, ), ] @pytest.fixture def engagement_audience_event_repository() -> EngagementAudienceEventRepository: return EngagementAudienceEventRepository(events=test_events) @pytest.fixture def handler( db: Database, campaign_service: CampaignService, engagement_audience_event_repository: EngagementAudienceEventRepository, ) -> GetEngagementAudienceEventsHandler: return GetEngagementAudienceEventsHandler( db=db, campaign_service=campaign_service, engagement_audience_event_repository=engagement_audience_event_repository, ) async def test_get_campaign_engagement_audience_events_all( handler: GetEngagementAudienceEventsHandler, create_model: CreateModel, fake: FakerTyped, user: User, ) -> None: facebook_page = await create_model(FacebookPage) campaign = await create_model( Campaign, facebook_page=facebook_page, instagram_account_external_id=fake.pystr(), ) result = await handler.handle( GetEngagementAudienceEventsRequest(user=user, campaign_id=campaign.id), ) assert result == test_events async def test_get_campaign_engagement_audience_events_without_instagram( handler: GetEngagementAudienceEventsHandler, create_model: CreateModel, fake: FakerTyped, user: User, ) -> None: facebook_page = await create_model(FacebookPage) campaign = await create_model( Campaign, facebook_page=facebook_page, instagram_account_id=None ) result = await handler.handle( GetEngagementAudienceEventsRequest(user=user, campaign_id=campaign.id), ) assert result == [ event for event in test_events if event.platform == CampaignPlatform.FACEBOOK ]