from unittest import mock import pytest from anydi import Container from dmp.audiences.enums import AudienceTarget from dmp.audiences.handlers import ( UpsertAudienceFansHandler, UpsertAudienceFansRequest, ) from dmp.audiences.models import Audience, AudienceFanDataList from dmp.fandata.models import ( FansifterTeamPersonalDataDbt, 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, OverrideSettings class TestUpsertAudienceFansHandler: @pytest.mark.db def test_upsert_email_audience( self, container: Container, handler: UpsertAudienceFansHandler, create_model: CreateModel, create_reporting_model: CreateReportingModel, fake: FakerTyped, override_settings: OverrideSettings, ) -> 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, ), override_settings(audience_email_to_fansifter_only=False), ): fan_count = handler.handle( UpsertAudienceFansRequest(audience_id=audience.id) ) assert fan_count == 1 assert audience.fan_count == fan_count @pytest.mark.db def test_upsert_email_audience_fansifter_only( self, handler: UpsertAudienceFansHandler, create_model: CreateModel, create_reporting_model: CreateReportingModel, fake: FakerTyped, override_settings: OverrideSettings, ) -> None: global_participant_id = fake.uuid4_string() create_reporting_model(FansifterTeamPersonalDataDbt) create_reporting_model(FansifterTeamPersonalDataDbt) audience = create_model( Audience, fandata_lists=[ AudienceFanDataList( list_id=global_participant_id, type=FanDataListType.ARTIST, ), ], fan_count=10, target=AudienceTarget.EMAIL, ) with ( override_settings(audience_email_to_fansifter_only=True), ): fan_count = handler.handle( UpsertAudienceFansRequest(audience_id=audience.id) ) assert fan_count == 2 assert audience.fan_count == fan_count