from unittest import mock import pytest from anydi import Container from fansifter_common.identifiers.types import CRMProfileIdentifier from preference_center.profile.dispatcher import ProfileDispatcher from preference_center.profile.handlers import ( UpdateSubscriptionsHandler, UpdateSubscriptionsRequest, ) from preference_center.profile.models import MailingList, Profile, Subscription from tests.unit.faker import FakerTyped from tests.unit.types import CreateModel, CreateProfileToken class TestUpdateSubscriptionsHandler: @pytest.mark.db def test_update_subscriptions( self, handler: UpdateSubscriptionsHandler, create_model: CreateModel, create_profile_token: CreateProfileToken, fake: FakerTyped, ) -> None: crm_id = fake.pystr() profile = create_model(Profile, crm_id=crm_id) token = create_profile_token(CRMProfileIdentifier(crmId=crm_id)) mailing_list_1 = create_model(MailingList, name="Subscription 1") mailing_list_2 = create_model(MailingList, name="Subscription 2") subscription_1 = create_model( Subscription, mailing_list=mailing_list_1, profile_id=profile.id, is_active=False, ) subscription_2 = create_model( Subscription, mailing_list=mailing_list_2, profile_id=profile.id, is_active=True, ) result = handler.handle( UpdateSubscriptionsRequest( token=token, data={subscription_1.id: True, subscription_2.id: False}, ) ) assert result == [subscription_1, subscription_2] assert subscription_1.is_active assert not subscription_2.is_active @pytest.mark.db def test_update_subscriptions_no_changes( self, container: Container, handler: UpdateSubscriptionsHandler, create_model: CreateModel, create_profile_token: CreateProfileToken, fake: FakerTyped, ) -> None: crm_id = fake.pystr() profile = create_model(Profile, crm_id=crm_id) token = create_profile_token(CRMProfileIdentifier(crmId=crm_id)) mailing_list_1 = create_model(MailingList, name="Subscription 1") mailing_list_2 = create_model(MailingList, name="Subscription 2") subscription_1 = create_model( Subscription, mailing_list=mailing_list_1, profile_id=profile.id, is_active=True, ) subscription_2 = create_model( Subscription, mailing_list=mailing_list_2, profile_id=profile.id, is_active=False, ) dispatcher_mock = mock.MagicMock(spec=ProfileDispatcher) with container.override(ProfileDispatcher, dispatcher_mock): result = handler.handle( UpdateSubscriptionsRequest( token=token, data={subscription_1.id: True, subscription_2.id: False}, ) ) assert result == [subscription_1, subscription_2] assert subscription_1.is_active is True assert subscription_2.is_active is False dispatcher_mock.dispatch_subscriptions_updated.assert_not_called() @pytest.mark.db def test_update_subscriptions_empty_payload( self, handler: UpdateSubscriptionsHandler, create_model: CreateModel, create_profile_token: CreateProfileToken, fake: FakerTyped, ) -> None: crm_id = fake.pystr() profile = create_model(Profile, crm_id=crm_id) token = create_profile_token(CRMProfileIdentifier(crmId=crm_id)) subscription = create_model( Subscription, profile_id=profile.id, is_active=True, ) result = handler.handle( UpdateSubscriptionsRequest( token=token, data={}, ) ) assert result == [] assert subscription.is_active is True