import pytest from fansifter_common.auth.account import Account from fansifter_common.auth.identity import Identity from dmp.adapters.features import ( AUDIENCE_SHOW_ADD_SECONDARY_FANS_TOGGLE, AUDIENCE_SHOW_SMS_CAMPAIGNS_PAGE, ) from dmp.audiences.enums import AudienceTarget from dmp.audiences.exceptions import AudienceTargetNotSupportedError from dmp.audiences.filters import AudienceFilters, FanSegmentInFilter, Operator from dmp.audiences.handlers import GetAudienceHandler, GetAudienceRequest from dmp.audiences.models import Audience from dmp.fandata.enums import FanSegment from tests.unit.types import CreateModel, EnableFeatures class TestGetAudienceHandler: @pytest.mark.db def test_get_audience( self, handler: GetAudienceHandler, create_model: CreateModel, identity: Identity, account: Account, ) -> None: audience = create_model( Audience, vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, ) response = handler.handle( GetAudienceRequest( identity=identity, audience_id=audience.id, ) ) assert response == audience @pytest.mark.db def test_get_audience_include_secondary_fans( self, handler: GetAudienceHandler, create_model: CreateModel, internal_employee_identity: Identity, account: Account, enable_features: EnableFeatures, ) -> None: audience = create_model( Audience, vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, filters=AudienceFilters.model_construct( fan_segments=FanSegmentInFilter.model_construct( value=[FanSegment.SECONDARY_FANS], operator=Operator.INCLUDE, ), ), ) with enable_features([AUDIENCE_SHOW_ADD_SECONDARY_FANS_TOGGLE]): response = handler.handle( GetAudienceRequest( identity=internal_employee_identity, audience_id=audience.id, ) ) assert response.filters.include_secondary_fans is True @pytest.mark.db def test_get_audience_include_secondary_fans_not_in_fan_segments( self, handler: GetAudienceHandler, create_model: CreateModel, internal_employee_identity: Identity, account: Account, enable_features: EnableFeatures, ) -> None: audience = create_model( Audience, vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, filters=AudienceFilters.model_construct( fan_segments=FanSegmentInFilter.model_construct( value=[FanSegment.NEW_FANS], operator=Operator.INCLUDE, ), ), ) with enable_features([AUDIENCE_SHOW_ADD_SECONDARY_FANS_TOGGLE]): response = handler.handle( GetAudienceRequest( identity=internal_employee_identity, audience_id=audience.id, ) ) assert response.filters.include_secondary_fans is False @pytest.mark.db def test_get_audience_include_secondary_fans_feature_not_enabled( self, handler: GetAudienceHandler, create_model: CreateModel, identity: Identity, account: Account, ) -> None: audience = create_model( Audience, vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, filters=AudienceFilters.model_construct( fan_segments=FanSegmentInFilter.model_construct( value=[FanSegment.SECONDARY_FANS], operator=Operator.INCLUDE, ), ), ) response = handler.handle( GetAudienceRequest( identity=identity, audience_id=audience.id, ) ) assert response.filters.include_secondary_fans is None @pytest.mark.db def test_get_text_target_without_feature_flag_raise_error( self, handler: GetAudienceHandler, create_model: CreateModel, identity: Identity, account: Account, ) -> None: audience = create_model( Audience, vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, target=AudienceTarget.TEXT, ) with pytest.raises(AudienceTargetNotSupportedError): handler.handle( GetAudienceRequest( identity=identity, audience_id=audience.id, ) ) @pytest.mark.db def test_get_text_target_with_feature_flag( self, handler: GetAudienceHandler, create_model: CreateModel, identity: Identity, enable_features: EnableFeatures, account: Account, ) -> None: audience = create_model( Audience, vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, target=AudienceTarget.TEXT, ) with enable_features([AUDIENCE_SHOW_SMS_CAMPAIGNS_PAGE]): response = handler.handle( GetAudienceRequest( identity=identity, audience_id=audience.id, ) ) assert response == audience