from unittest import mock import pytest from anydi import Container from fansifter_common.identifiers.types import FansifterProfileIdentifier from preference_center.profile.dispatcher import ProfileDispatcher from preference_center.profile.handlers import ( UnsubscribeAllHandler, UnsubscribeAllRequest, ) from preference_center.profile.models import ( Profile, Subscription, ) from tests.unit.types import CreateModel, CreateProfileToken class TestUnsubscribeAllHandler: @pytest.mark.db def test_unsubscribe_all( self, container: Container, handler: UnsubscribeAllHandler, create_model: CreateModel, create_profile_token: CreateProfileToken, ) -> None: profile = create_model(Profile) token = create_profile_token( FansifterProfileIdentifier.model_construct(profile_id=profile.id) ) subscription_1 = create_model( Subscription, profile_id=profile.id, is_active=False, ) subscription_2 = create_model( Subscription, profile_id=profile.id, is_active=True, ) dispatcher_mock = mock.MagicMock(spec=ProfileDispatcher) with container.override(ProfileDispatcher, dispatcher_mock): handler.handle(UnsubscribeAllRequest(token=token)) assert not subscription_1.is_active assert not subscription_2.is_active dispatcher_mock.dispatch_subscriptions_updated.assert_called_once_with( profile, subscriptions=[subscription_2], origin_id=None, origin_type=None, automated_email_trigger_id=None, ) @pytest.mark.db @pytest.mark.parametrize( ("campaign_id", "expected_origin_id", "expected_origin_type"), [ ("campaign-id", "campaign-id", "EMAIL_CAMPAIGN"), (12345, None, None), ], ) def test_unsubscribe_all_token_email_campaign_id_filter( self, container: Container, handler: UnsubscribeAllHandler, create_model: CreateModel, create_profile_token: CreateProfileToken, campaign_id: str | int, expected_origin_id: str | None, expected_origin_type: str | None, ) -> None: profile = create_model(Profile) token = create_profile_token( FansifterProfileIdentifier.model_construct( profile_id=profile.id, email_campaign_id=campaign_id, ) ) subscription_1 = create_model( Subscription, profile_id=profile.id, is_active=False, ) subscription_2 = create_model( Subscription, profile_id=profile.id, is_active=True, ) dispatcher_mock = mock.MagicMock(spec=ProfileDispatcher) with container.override(ProfileDispatcher, dispatcher_mock): handler.handle(UnsubscribeAllRequest(token=token)) assert not subscription_1.is_active assert not subscription_2.is_active dispatcher_mock.dispatch_subscriptions_updated.assert_called_once_with( profile, subscriptions=[subscription_2], origin_id=expected_origin_id, origin_type=expected_origin_type, automated_email_trigger_id=None, ) @pytest.mark.db def test_unsubscribe_all_not_changed( self, container: Container, handler: UnsubscribeAllHandler, create_model: CreateModel, create_profile_token: CreateProfileToken, ) -> None: profile = create_model(Profile) token = create_profile_token( FansifterProfileIdentifier.model_construct(profile_id=profile.id) ) subscription_1 = create_model( Subscription, profile_id=profile.id, is_active=False, ) subscription_2 = create_model( Subscription, profile_id=profile.id, is_active=False, ) dispatcher_mock = mock.MagicMock(spec=ProfileDispatcher) with container.override(ProfileDispatcher, dispatcher_mock): handler.handle(UnsubscribeAllRequest(token=token)) assert not subscription_1.is_active assert not subscription_2.is_active dispatcher_mock.dispatch_subscriptions_updated.assert_not_called()