from unittest import mock import freezegun import pytest from anydi import Container from fansifter_common.auth.identity import Identity from fansifter_common.utils import timezone from dmp.audiences.enums import AudienceTarget from dmp.audiences.handlers import RefreshAudienceHandler, RefreshAudienceRequest from dmp.audiences.models import Audience, AudienceFanDataList from dmp.fandata.models import ( AudienceFiltersAdCampaignDbt, GlobalAudienceFiltersEmailCampaignDbt, ) from dmp.rosters.enums import FanDataListType from dmp.rosters.models import ArtistRosterMainRep from dmp.rosters.services import GlobalFanDataAccessService from tests.unit.faker import FakerTyped from tests.unit.types import CreateModel, CreateReportingModel class TestRefreshAudienceHandler: @pytest.mark.db def test_refresh_audience_with_events( self, handler: RefreshAudienceHandler, identity: Identity, create_model: CreateModel, create_reporting_model: CreateReportingModel, fake: FakerTyped, ) -> None: global_participant_id = fake.uuid4_string() audience_filters = create_reporting_model( AudienceFiltersAdCampaignDbt, global_participant_id=global_participant_id, ) audience = create_model( Audience, vendor_id=audience_filters.vendor_id, subaccount_id=audience_filters.subaccount_id, fandata_lists=[ AudienceFanDataList( list_id=global_participant_id, type=FanDataListType.ARTIST, ) ], fan_count=10, ) refreshed_at = timezone.now() with freezegun.freeze_time(refreshed_at): audience = handler.handle( RefreshAudienceRequest( identity=identity, audience_id=audience.id, ) ) assert audience.fan_count == 1 assert audience.refreshed_at == refreshed_at assert audience.refreshed_by == identity.id @pytest.mark.db def test_refresh_audience_is_global( self, container: Container, handler: RefreshAudienceHandler, identity: Identity, create_model: CreateModel, create_reporting_model: CreateReportingModel, fake: FakerTyped, ) -> None: global_participant_id = fake.uuid4_string() audience = create_model( Audience, fandata_lists=[ AudienceFanDataList( list_id=global_participant_id, type=FanDataListType.ARTIST, ), ], fan_count=10, target=AudienceTarget.EMAIL, ) create_reporting_model( ArtistRosterMainRep, vendor_id=audience.vendor_id, subaccount_id=audience.subaccount_id, global_participant_id=global_participant_id, ) create_reporting_model( GlobalAudienceFiltersEmailCampaignDbt, global_participant_id=global_participant_id, ) global_fandata_access_service_mock = mock.MagicMock( spec=GlobalFanDataAccessService, is_enabled_for_any_vendor=mock.MagicMock(return_value=True), ) with container.override( GlobalFanDataAccessService, instance=global_fandata_access_service_mock, ): audience = handler.handle( RefreshAudienceRequest( identity=identity, audience_id=audience.id, ) ) assert audience.fan_count == 1