from unittest import mock from freezegun import freeze_time from preference_center.config import Settings from preference_center.profile.dispatcher import ProfileDispatcher from preference_center.profile.events import ( ProfileDeletedV1, ProfileSubscriptionsUpdatedV1, ProfileUpdatedV1, ) from preference_center.profile.models import Profile, Subscription from tests.unit.types import BuildModel class TestProfileDispatcher: def test_dispatch_profile_updated_changed( self, dispatcher: ProfileDispatcher, settings: Settings, build_model: BuildModel, producer_mock: mock.MagicMock, ) -> None: profile = build_model(Profile, first_name="Peter") profile.first_name = "John" dispatcher.dispatch_profile_updated(profile) producer_mock.publish.assert_called_once_with( topic=settings.kafka_topic_fan_update, key=profile.id, value=ProfileUpdatedV1.from_profile(profile).model_dump_json(by_alias=True), ) @freeze_time("2021-01-01") def test_dispatch_profile_deleted( self, dispatcher: ProfileDispatcher, build_model: BuildModel, producer_mock: mock.MagicMock, settings: Settings, ) -> None: profile = build_model(Profile) dispatcher.dispatch_profile_deleted(profile, origin_id=None, origin_type=None) producer_mock.publish.assert_called_once_with( topic=settings.kafka_topic_fan_delete, key=profile.id, value=ProfileDeletedV1.from_profile( profile, origin_id=None, origin_type=None ).model_dump_json(by_alias=True), ) @freeze_time("2021-01-01") def test_dispatch_subscriptions_updated_changed( self, dispatcher: ProfileDispatcher, settings: Settings, build_model: BuildModel, producer_mock: mock.MagicMock, ) -> None: profile = build_model(Profile) subscription = build_model(Subscription, profile_id=profile.id, is_active=True) subscription.is_active = False dispatcher.dispatch_subscriptions_updated( profile, subscriptions=[subscription], origin_id=None, origin_type=None ) producer_mock.publish.assert_called_once_with( topic=settings.kafka_topic_fan_subscriptions_update, key=profile.id, value=ProfileSubscriptionsUpdatedV1.from_profile_subscriptions( profile, subscriptions=[subscription], origin_id=None, origin_type=None ).model_dump_json(by_alias=True), )