Browse Source

ref(notifications): stop using update settings tests p2 (#60500)

Removing additional instances of
`NotificationSetting.objects.update_settings` from tests so we can
remove the model and manager.
Stephen Cefali 1 year ago
parent
commit
cfd77bb7e1

+ 31 - 39
src/sentry/testutils/cases.py

@@ -77,7 +77,8 @@ from sentry.models.environment import Environment
 from sentry.models.files.file import File
 from sentry.models.groupmeta import GroupMeta
 from sentry.models.identity import Identity, IdentityProvider, IdentityStatus
-from sentry.models.notificationsetting import NotificationSetting
+from sentry.models.notificationsettingoption import NotificationSettingOption
+from sentry.models.notificationsettingprovider import NotificationSettingProvider
 from sentry.models.options.project_option import ProjectOption
 from sentry.models.options.user_option import UserOption
 from sentry.models.organization import Organization
@@ -90,7 +91,6 @@ from sentry.models.rule import RuleSource
 from sentry.models.user import User
 from sentry.models.useremail import UserEmail
 from sentry.monitors.models import Monitor, MonitorEnvironment, MonitorType, ScheduleType
-from sentry.notifications.types import NotificationSettingOptionValues, NotificationSettingTypes
 from sentry.plugins.base import plugins
 from sentry.replays.lib.event_linking import transform_event_for_linking_payload
 from sentry.replays.models import ReplayRecordingSegment
@@ -119,7 +119,6 @@ from sentry.testutils.helpers.notifications import TEST_ISSUE_OCCURRENCE
 from sentry.testutils.helpers.slack import install_slack
 from sentry.testutils.pytest.selenium import Browser
 from sentry.types.condition_activity import ConditionActivity, ConditionActivityType
-from sentry.types.integrations import ExternalProviders
 from sentry.utils import json
 from sentry.utils.auth import SsoSession
 from sentry.utils.dates import to_timestamp
@@ -2564,24 +2563,17 @@ class SlackActivityNotificationTest(ActivityTestCase):
 
     def setUp(self):
         with assume_test_silo_mode(SiloMode.CONTROL):
-            NotificationSetting.objects.update_settings(
-                ExternalProviders.SLACK,
-                NotificationSettingTypes.WORKFLOW,
-                NotificationSettingOptionValues.ALWAYS,
-                user_id=self.user.id,
-            )
-            NotificationSetting.objects.update_settings(
-                ExternalProviders.SLACK,
-                NotificationSettingTypes.DEPLOY,
-                NotificationSettingOptionValues.ALWAYS,
-                user_id=self.user.id,
-            )
-            NotificationSetting.objects.update_settings(
-                ExternalProviders.SLACK,
-                NotificationSettingTypes.ISSUE_ALERTS,
-                NotificationSettingOptionValues.ALWAYS,
-                user_id=self.user.id,
-            )
+            base_params = {
+                "user_id": self.user.id,
+                "scope_identifier": self.user.id,
+                "scope_type": "user",
+                "value": "always",
+            }
+            for type in ["workflow", "deploy", "alerts"]:
+                NotificationSettingOption.objects.create(
+                    type=type,
+                    **base_params,
+                )
             UserOption.objects.create(user=self.user, key="self_notifications", value="1")
             self.integration = install_slack(self.organization)
             self.idp = IdentityProvider.objects.create(
@@ -2638,24 +2630,24 @@ class SlackActivityNotificationTest(ActivityTestCase):
 class MSTeamsActivityNotificationTest(ActivityTestCase):
     def setUp(self):
         with assume_test_silo_mode(SiloMode.CONTROL):
-            NotificationSetting.objects.update_settings(
-                ExternalProviders.MSTEAMS,
-                NotificationSettingTypes.WORKFLOW,
-                NotificationSettingOptionValues.ALWAYS,
-                user_id=self.user.id,
-            )
-            NotificationSetting.objects.update_settings(
-                ExternalProviders.MSTEAMS,
-                NotificationSettingTypes.ISSUE_ALERTS,
-                NotificationSettingOptionValues.ALWAYS,
-                user_id=self.user.id,
-            )
-            NotificationSetting.objects.update_settings(
-                ExternalProviders.MSTEAMS,
-                NotificationSettingTypes.DEPLOY,
-                NotificationSettingOptionValues.ALWAYS,
-                user_id=self.user.id,
-            )
+            base_params = {
+                "user_id": self.user.id,
+                "scope_identifier": self.user.id,
+                "scope_type": "user",
+                "value": "always",
+            }
+            for type in ["workflow", "deploy", "alerts"]:
+                NotificationSettingOption.objects.create(
+                    type=type,
+                    **base_params,
+                )
+                # need to enable the provider options since msteams is disabled by default
+                NotificationSettingProvider.objects.create(
+                    provider="msteams",
+                    type=type,
+                    **base_params,
+                )
+
             UserOption.objects.create(user=self.user, key="self_notifications", value="1")
 
         self.tenant_id = "50cccd00-7c9c-4b32-8cda-58a084f9334a"

+ 28 - 24
tests/sentry/mail/activity/test_note.py

@@ -1,14 +1,12 @@
 from sentry.models.activity import Activity
-from sentry.models.notificationsetting import NotificationSetting
+from sentry.models.notificationsettingoption import NotificationSettingOption
 from sentry.models.options.user_option import UserOption
 from sentry.notifications.notifications.activity.note import NoteActivityNotification
-from sentry.notifications.types import (
-    GroupSubscriptionReason,
-    NotificationSettingOptionValues,
-    NotificationSettingTypes,
-)
+from sentry.notifications.types import GroupSubscriptionReason
 from sentry.services.hybrid_cloud.actor import RpcActor
+from sentry.silo.base import SiloMode
 from sentry.testutils.cases import ActivityTestCase
+from sentry.testutils.silo import assume_test_silo_mode
 from sentry.types.activity import ActivityType
 from sentry.types.integrations import ExternalProviders
 
@@ -31,12 +29,14 @@ class NoteTestCase(ActivityTestCase):
         assert self.email.get_participants_with_group_subscription_reason().is_empty()
 
     def test_allow_self_notifications(self):
-        NotificationSetting.objects.update_settings(
-            ExternalProviders.EMAIL,
-            NotificationSettingTypes.WORKFLOW,
-            NotificationSettingOptionValues.ALWAYS,
-            user_id=self.user.id,
-        )
+        with assume_test_silo_mode(SiloMode.CONTROL):
+            NotificationSettingOption.objects.create(
+                user_id=self.user.id,
+                scope_type="user",
+                scope_identifier=self.user.id,
+                type="workflow",
+                value="always",
+            )
         UserOption.objects.create(user=self.user, key="self_notifications", value="1")
 
         participants = self.email.get_participants_with_group_subscription_reason()
@@ -47,24 +47,28 @@ class NoteTestCase(ActivityTestCase):
         assert actual == expected
 
     def test_disable_self_notifications(self):
-        NotificationSetting.objects.update_settings(
-            ExternalProviders.EMAIL,
-            NotificationSettingTypes.WORKFLOW,
-            NotificationSettingOptionValues.ALWAYS,
-            user_id=self.user.id,
-        )
+        with assume_test_silo_mode(SiloMode.CONTROL):
+            NotificationSettingOption.objects.create(
+                user_id=self.user.id,
+                scope_type="user",
+                scope_identifier=self.user.id,
+                type="workflow",
+                value="always",
+            )
         UserOption.objects.create(user=self.user, key="self_notifications", value="0")
 
         participants = self.email.get_participants_with_group_subscription_reason()
         assert len(participants.get_participants_by_provider(ExternalProviders.EMAIL)) == 0
 
     def test_note_with_braces(self):
-        NotificationSetting.objects.update_settings(
-            ExternalProviders.EMAIL,
-            NotificationSettingTypes.WORKFLOW,
-            NotificationSettingOptionValues.ALWAYS,
-            user_id=self.user.id,
-        )
+        with assume_test_silo_mode(SiloMode.CONTROL):
+            NotificationSettingOption.objects.create(
+                user_id=self.user.id,
+                scope_type="user",
+                scope_identifier=self.user.id,
+                type="workflow",
+                value="always",
+            )
         UserOption.objects.create(user=self.user, key="self_notifications", value="1")
         email = NoteActivityNotification(
             Activity(

+ 14 - 27
tests/sentry/models/test_team.py

@@ -2,7 +2,8 @@ import pytest
 from django.test import override_settings
 from rest_framework.serializers import ValidationError
 
-from sentry.models.notificationsetting import NotificationSetting
+from sentry.models.notificationsettingoption import NotificationSettingOption
+from sentry.models.notificationsettingprovider import NotificationSettingProvider
 from sentry.models.organizationmember import OrganizationMember
 from sentry.models.organizationmemberteam import OrganizationMemberTeam
 from sentry.models.project import Project
@@ -10,13 +11,11 @@ from sentry.models.projectteam import ProjectTeam
 from sentry.models.release import Release, ReleaseProject
 from sentry.models.releaseprojectenvironment import ReleaseProjectEnvironment
 from sentry.models.team import Team
-from sentry.notifications.types import NotificationSettingOptionValues, NotificationSettingTypes
 from sentry.silo.base import SiloMode
 from sentry.tasks.deletion.hybrid_cloud import schedule_hybrid_cloud_foreign_key_jobs_control
 from sentry.testutils.cases import TestCase
 from sentry.testutils.outbox import outbox_runner
 from sentry.testutils.silo import assume_test_silo_mode, region_silo_test
-from sentry.types.integrations import ExternalProviders
 
 
 @region_silo_test
@@ -185,24 +184,18 @@ class TeamDeletionTest(TestCase):
     def test_hybrid_cloud_deletion(self):
         org = self.create_organization()
         team = self.create_team(org)
-
+        base_params = {
+            "team_id": team.id,
+            "scope_type": "team",
+            "scope_identifier": team.id,
+            "value": "always",
+        }
         with assume_test_silo_mode(SiloMode.CONTROL):
-            NotificationSetting.objects.update_settings(
-                ExternalProviders.EMAIL,
-                NotificationSettingTypes.ISSUE_ALERTS,
-                NotificationSettingOptionValues.ALWAYS,
-                team_id=team.id,
-            )
+            NotificationSettingOption.objects.create(**base_params)
+            NotificationSettingProvider.objects.create(provider="slack", **base_params)
 
         assert Team.objects.filter(id=team.id).exists()
 
-        with assume_test_silo_mode(SiloMode.CONTROL):
-            assert NotificationSetting.objects.find_settings(
-                provider=ExternalProviders.EMAIL,
-                type=NotificationSettingTypes.ISSUE_ALERTS,
-                team_id=team.id,
-            ).exists()
-
         team_id = team.id
         with outbox_runner():
             team.delete()
@@ -211,11 +204,8 @@ class TeamDeletionTest(TestCase):
 
         with assume_test_silo_mode(SiloMode.CONTROL):
             # cascade is asynchronous, ensure there is still related search,
-            assert NotificationSetting.objects.find_settings(
-                provider=ExternalProviders.EMAIL,
-                type=NotificationSettingTypes.ISSUE_ALERTS,
-                team_id=team_id,
-            ).exists()
+            assert NotificationSettingOption.objects.filter(**base_params).exists()
+            assert NotificationSettingProvider.objects.filter(**base_params).exists()
 
         # Run foreign key cascades to remove control silo state.
         with self.tasks(), assume_test_silo_mode(SiloMode.CONTROL):
@@ -223,11 +213,8 @@ class TeamDeletionTest(TestCase):
 
         assert not Team.objects.filter(id=team_id).exists()
         with assume_test_silo_mode(SiloMode.CONTROL):
-            assert not NotificationSetting.objects.find_settings(
-                provider=ExternalProviders.EMAIL,
-                type=NotificationSettingTypes.ISSUE_ALERTS,
-                team_id=team_id,
-            ).exists()
+            assert not NotificationSettingOption.objects.filter(**base_params).exists()
+            assert not NotificationSettingProvider.objects.filter(**base_params).exists()
 
     def test_cannot_delete_last_owner_team(self):
         org = self.create_organization()

+ 16 - 20
tests/sentry/notifications/test_helpers.py

@@ -2,7 +2,7 @@ import types
 from urllib.parse import parse_qs, urlparse
 
 from sentry.models.integrations.external_actor import ExternalActor
-from sentry.models.notificationsetting import NotificationSetting
+from sentry.models.notificationsettingoption import NotificationSettingOption
 from sentry.models.rule import Rule
 from sentry.notifications.helpers import (
     collect_groups_by_project,
@@ -39,25 +39,21 @@ def mock_event(*, transaction, data=None):
 class NotificationHelpersTest(TestCase):
     def setUp(self):
         super().setUp()
-
-        NotificationSetting.objects.update_settings(
-            ExternalProviders.SLACK,
-            NotificationSettingTypes.WORKFLOW,
-            NotificationSettingOptionValues.ALWAYS,
-            user_id=self.user.id,
-        )
-        NotificationSetting.objects.update_settings(
-            ExternalProviders.SLACK,
-            NotificationSettingTypes.DEPLOY,
-            NotificationSettingOptionValues.ALWAYS,
-            user_id=self.user.id,
-        )
-        NotificationSetting.objects.update_settings(
-            ExternalProviders.SLACK,
-            NotificationSettingTypes.ISSUE_ALERTS,
-            NotificationSettingOptionValues.ALWAYS,
-            user_id=self.user.id,
-        )
+        with assume_test_silo_mode(SiloMode.CONTROL):
+            NotificationSettingOption.objects.create(
+                user_id=self.user.id,
+                scope_type="user",
+                scope_identifier=self.user.id,
+                type="workflow",
+                value="always",
+            )
+            NotificationSettingOption.objects.create(
+                user_id=self.user.id,
+                scope_type="user",
+                scope_identifier=self.user.id,
+                type="deploy",
+                value="always",
+            )
 
     def test_get_deploy_values_by_provider_empty_settings(self):
         values_by_provider = get_values_by_provider_by_type(