import pytest from django.utils.timezone import timedelta from apps.base.models import UserNotificationPolicy from apps.base.models.user_notification_policy import ( NotificationChannelAPIOptions, NotificationChannelOptions, NotificationChannelPublicAPIOptions, validate_channel_choice, ) from apps.base.tests.messaging_backend import TestOnlyBackend @pytest.mark.parametrize( "notification_type,kwargs, expected_verbal", [ ( UserNotificationPolicy.Step.WAIT, { "wait_delay": timedelta(minutes=5), }, "5 min", ), (UserNotificationPolicy.Step.NOTIFY, {"notify_by": UserNotificationPolicy.NotificationChannel.SLACK}, "Slack"), (UserNotificationPolicy.Step.WAIT, {}, "0 min"), (None, {}, "Not set"), ], ) @pytest.mark.django_db def test_short_verbal( make_organization, make_user_for_organization, make_user_notification_policy, notification_type, kwargs, expected_verbal, ): organization = make_organization() user = make_user_for_organization(organization) policy = make_user_notification_policy(user, notification_type, **kwargs) assert policy.short_verbal == expected_verbal @pytest.mark.django_db def test_short_verbals_for_user( make_organization, make_user_for_organization, make_user_notification_policy, ): organization = make_organization() user = make_user_for_organization(organization) make_user_notification_policy( user, UserNotificationPolicy.Step.NOTIFY, notify_by=UserNotificationPolicy.NotificationChannel.SLACK ) make_user_notification_policy(user, UserNotificationPolicy.Step.WAIT, wait_delay=timedelta(minutes=5)) make_user_notification_policy( user, UserNotificationPolicy.Step.NOTIFY, notify_by=UserNotificationPolicy.NotificationChannel.SMS, important=True, ) expected = (("Slack", "5 min"), ("SMS",)) assert UserNotificationPolicy.get_short_verbals_for_user(user) == expected @pytest.mark.django_db def test_extra_messaging_backends_details(): assert TestOnlyBackend.backend_id in UserNotificationPolicy.NotificationChannel.names assert TestOnlyBackend.backend_id not in NotificationChannelOptions.AVAILABLE_FOR_USE channel_choice = getattr(UserNotificationPolicy.NotificationChannel, TestOnlyBackend.backend_id) assert NotificationChannelAPIOptions.LABELS[channel_choice] == "Test Only Backend" assert NotificationChannelAPIOptions.SHORT_LABELS[channel_choice] == TestOnlyBackend.short_label assert NotificationChannelPublicAPIOptions.LABELS[channel_choice] == "notify_by_{}".format( TestOnlyBackend.backend_id.lower() ) assert validate_channel_choice(channel_choice) is None @pytest.mark.django_db def test_can_delete_last_notification_policy( make_organization, make_user_for_organization, make_user_notification_policy, ): organization = make_organization() user = make_user_for_organization(organization) first_policy = make_user_notification_policy( user, UserNotificationPolicy.Step.NOTIFY, notify_by=UserNotificationPolicy.NotificationChannel.SLACK ) second_policy = make_user_notification_policy( user, UserNotificationPolicy.Step.WAIT, wait_delay=timedelta(minutes=5) ) first_policy.delete() second_policy.delete()