Files
sentinel/tests/sentry/models/test_groupsubscription.py
2024-02-15 17:01:50 +00:00

803 lines
31 KiB
Python

from __future__ import annotations
from collections.abc import Mapping
from sentry.models.group import Group
from sentry.models.groupsubscription import GroupSubscription
from sentry.models.notificationsettingoption import NotificationSettingOption
from sentry.models.notificationsettingprovider import NotificationSettingProvider
from sentry.models.team import Team
from sentry.models.user import User
from sentry.notifications.types import (
GroupSubscriptionReason,
NotificationScopeEnum,
NotificationSettingEnum,
NotificationSettingsOptionEnum,
)
from sentry.services.hybrid_cloud.actor import RpcActor
from sentry.services.hybrid_cloud.user.service import user_service
from sentry.silo import SiloMode
from sentry.testutils.cases import TestCase
from sentry.testutils.helpers.features import with_feature
from sentry.testutils.helpers.slack import link_team
from sentry.testutils.silo import assume_test_silo_mode, region_silo_test
from sentry.types.integrations import ExternalProviderEnum, ExternalProviders
@region_silo_test
class SubscribeTest(TestCase):
def test_simple(self):
group = self.create_group()
user = self.create_user()
team = self.create_team()
GroupSubscription.objects.subscribe(group=group, subscriber=user)
assert GroupSubscription.objects.filter(group=group, user_id=user.id).exists()
# should not error
GroupSubscription.objects.subscribe(group=group, subscriber=user)
GroupSubscription.objects.subscribe(group=group, subscriber=team)
assert GroupSubscription.objects.filter(group=group, team=team).exists()
# should not error
GroupSubscription.objects.subscribe(group=group, subscriber=team)
def test_bulk(self):
group = self.create_group()
user_ids = []
for _ in range(20):
user = self.create_user()
user_ids.append(user.id)
GroupSubscription.objects.bulk_subscribe(group=group, user_ids=user_ids)
assert len(GroupSubscription.objects.filter(group=group)) == 20
one_more = self.create_user()
user_ids.append(one_more.id)
# should not error
GroupSubscription.objects.bulk_subscribe(group=group, user_ids=user_ids)
assert len(GroupSubscription.objects.filter(group=group)) == 21
def test_bulk_dupes(self):
group = self.create_group()
user_ids = []
user = self.create_user()
user_ids.append(user.id)
user_ids.append(user.id)
GroupSubscription.objects.bulk_subscribe(group=group, user_ids=user_ids)
assert len(GroupSubscription.objects.filter(group=group)) == 1
@with_feature("organizations:team-workflow-notifications")
def test_bulk_teams(self):
group = self.create_group()
team_ids = []
for _ in range(20):
team = self.create_team()
team_ids.append(team.id)
GroupSubscription.objects.bulk_subscribe(group=group, team_ids=team_ids)
assert len(GroupSubscription.objects.filter(group=group)) == 20
one_more = self.create_team()
team_ids.append(one_more.id)
# should not error
GroupSubscription.objects.bulk_subscribe(group=group, team_ids=team_ids)
assert len(GroupSubscription.objects.filter(group=group)) == 21
@with_feature("organizations:team-workflow-notifications")
def test_bulk_teams_dupes(self):
group = self.create_group()
team_ids = []
team = self.create_team()
team_ids.append(team.id)
team_ids.append(team.id)
GroupSubscription.objects.bulk_subscribe(group=group, team_ids=team_ids)
assert len(GroupSubscription.objects.filter(group=group)) == 1
@with_feature("organizations:team-workflow-notifications")
def test_bulk_users_and_teams(self):
group = self.create_group()
user_ids = []
team_ids = []
for _ in range(10):
user = self.create_user()
user_ids.append(user.id)
team = self.create_team()
team_ids.append(team.id)
GroupSubscription.objects.bulk_subscribe(group=group, user_ids=user_ids, team_ids=team_ids)
assert len(GroupSubscription.objects.filter(group=group)) == 20
@with_feature("organizations:team-workflow-notifications")
def test_bulk_user_on_team(self):
"""
Test that ensures bulk_subscribe subscribes users and teams individually, even if one of those users is part of one of those teams.
"""
group = self.create_group()
team = self.create_team()
user = self.create_user()
self.create_member(user=user, organization=self.organization, role="member", teams=[team])
team_ids = [team.id]
user_ids = [user.id]
GroupSubscription.objects.bulk_subscribe(group=group, user_ids=user_ids, team_ids=team_ids)
assert len(GroupSubscription.objects.filter(group=group)) == 2
def test_actor_user(self):
group = self.create_group()
user = self.create_user()
GroupSubscription.objects.subscribe_actor(group=group, actor=user)
assert GroupSubscription.objects.filter(group=group, user_id=user.id).exists()
# should not error
GroupSubscription.objects.subscribe_actor(group=group, actor=user)
def test_actor_team(self):
org = self.create_organization()
group = self.create_group()
user = self.create_user(email="[email protected]")
team = self.create_team(organization=org)
self.create_member(user=user, organization=org, role="owner", teams=[team])
self.create_member(email="[email protected]", organization=org, role="owner", teams=[team])
GroupSubscription.objects.subscribe_actor(group=group, actor=team)
assert GroupSubscription.objects.filter(group=group, user_id=user.id).exists()
# should not error
GroupSubscription.objects.subscribe_actor(group=group, actor=team)
@with_feature("organizations:team-workflow-notifications")
def test_subscribe_team(self):
org = self.create_organization()
group = self.create_group()
user = self.create_user(email="[email protected]")
team = self.create_team(organization=org)
self.create_member(user=user, organization=org, role="owner", teams=[team])
GroupSubscription.objects.subscribe_actor(group=group, actor=team)
assert not GroupSubscription.objects.filter(group=group, user_id=user.id).exists()
assert GroupSubscription.objects.filter(group=group, team=team).exists()
# should not error
GroupSubscription.objects.subscribe_actor(group=group, actor=team)
@region_silo_test
class GetParticipantsTest(TestCase):
def setUp(self):
self.org = self.create_organization()
self.team = self.create_team(organization=self.org)
self.project = self.create_project(teams=[self.team], organization=self.org)
self.group = self.create_group(project=self.project)
self.user = self.create_user()
self.create_member(user=self.user, organization=self.org, teams=[self.team])
self.update_user_settings_always()
self.user = user_service.get_user(self.user.id) # Redo the serialization for diffs
@assume_test_silo_mode(SiloMode.CONTROL)
def update_user_settings_always(self):
NotificationSettingOption.objects.update_or_create(
scope_type=NotificationScopeEnum.USER.value,
scope_identifier=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
user_id=self.user.id,
defaults={"value": NotificationSettingsOptionEnum.ALWAYS.value},
)
@assume_test_silo_mode(SiloMode.CONTROL)
def update_user_setting_subscribe_only(self):
NotificationSettingOption.objects.update_or_create(
scope_type=NotificationScopeEnum.USER.value,
scope_identifier=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
user_id=self.user.id,
defaults={"value": NotificationSettingsOptionEnum.SUBSCRIBE_ONLY.value},
)
NotificationSettingProvider.objects.update_or_create(
scope_type=NotificationScopeEnum.USER.value,
scope_identifier=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
user_id=self.user.id,
provider=ExternalProviderEnum.EMAIL.value,
defaults={"value": NotificationSettingsOptionEnum.SUBSCRIBE_ONLY.value},
)
@assume_test_silo_mode(SiloMode.CONTROL)
def update_user_setting_never(self):
NotificationSettingOption.objects.update_or_create(
scope_type=NotificationScopeEnum.USER.value,
scope_identifier=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
user_id=self.user.id,
defaults={"value": NotificationSettingsOptionEnum.NEVER.value},
)
NotificationSettingProvider.objects.update_or_create(
scope_type=NotificationScopeEnum.USER.value,
scope_identifier=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
user_id=self.user.id,
provider=ExternalProviderEnum.EMAIL.value,
defaults={"value": NotificationSettingsOptionEnum.NEVER.value},
)
@assume_test_silo_mode(SiloMode.CONTROL)
def update_project_setting_always(self):
NotificationSettingOption.objects.update_or_create(
scope_type=NotificationScopeEnum.PROJECT.value,
scope_identifier=self.group.project_id,
type=NotificationSettingEnum.WORKFLOW.value,
user_id=self.user.id,
defaults={"value": NotificationSettingsOptionEnum.ALWAYS.value},
)
NotificationSettingProvider.objects.update_or_create(
scope_type=NotificationScopeEnum.PROJECT.value,
scope_identifier=self.group.project_id,
type=NotificationSettingEnum.WORKFLOW.value,
user_id=self.user.id,
provider=ExternalProviderEnum.EMAIL.value,
defaults={"value": NotificationSettingsOptionEnum.ALWAYS.value},
)
@assume_test_silo_mode(SiloMode.CONTROL)
def update_project_setting_subscribe_only(self):
NotificationSettingOption.objects.update_or_create(
scope_type=NotificationScopeEnum.PROJECT.value,
scope_identifier=self.group.project_id,
type=NotificationSettingEnum.WORKFLOW.value,
user_id=self.user.id,
defaults={"value": NotificationSettingsOptionEnum.SUBSCRIBE_ONLY.value},
)
NotificationSettingProvider.objects.update_or_create(
scope_type=NotificationScopeEnum.PROJECT.value,
scope_identifier=self.group.project_id,
type=NotificationSettingEnum.WORKFLOW.value,
user_id=self.user.id,
provider=ExternalProviderEnum.EMAIL.value,
defaults={"value": NotificationSettingsOptionEnum.SUBSCRIBE_ONLY.value},
)
@assume_test_silo_mode(SiloMode.CONTROL)
def update_project_setting_never(self):
NotificationSettingOption.objects.update_or_create(
scope_type=NotificationScopeEnum.PROJECT.value,
scope_identifier=self.group.project_id,
type=NotificationSettingEnum.WORKFLOW.value,
user_id=self.user.id,
defaults={"value": NotificationSettingsOptionEnum.NEVER.value},
)
NotificationSettingProvider.objects.update_or_create(
scope_type=NotificationScopeEnum.PROJECT.value,
scope_identifier=self.group.project_id,
type=NotificationSettingEnum.WORKFLOW.value,
user_id=self.user.id,
provider=ExternalProviderEnum.EMAIL.value,
defaults={"value": NotificationSettingsOptionEnum.NEVER.value},
)
@assume_test_silo_mode(SiloMode.CONTROL)
def update_team_setting_subscribe_only(self, team_id: int):
NotificationSettingOption.objects.update_or_create(
scope_type=NotificationScopeEnum.TEAM.value,
scope_identifier=team_id,
type=NotificationSettingEnum.WORKFLOW.value,
team_id=team_id,
defaults={"value": NotificationSettingsOptionEnum.SUBSCRIBE_ONLY.value},
)
NotificationSettingProvider.objects.update_or_create(
scope_type=NotificationScopeEnum.TEAM.value,
scope_identifier=team_id,
type=NotificationSettingEnum.WORKFLOW.value,
team_id=team_id,
provider=ExternalProviderEnum.SLACK.value,
defaults={"value": NotificationSettingsOptionEnum.SUBSCRIBE_ONLY.value},
)
def _assert_subscribers_are(
self,
group: Group | None = None,
*,
email: Mapping[User, int] | Mapping[Team, int] | None = None,
slack: Mapping[User, int] | Mapping[Team, int] | None = None,
):
all_participants = GroupSubscription.objects.get_participants(group or self.group)
all_expected = {ExternalProviders.EMAIL: email, ExternalProviders.SLACK: slack}
for provider in ExternalProviders:
actual = dict(all_participants.get_participants_by_provider(provider))
expected = {
RpcActor.from_object(user): reason
for (user, reason) in (all_expected.get(provider) or {}).items()
}
assert actual == expected
def test_simple(self):
# Include an extra team here to prove the subquery works
team_2 = self.create_team(organization=self.org)
project = self.create_project(teams=[self.team, team_2], organization=self.org)
group = self.create_group(project=project)
user2 = self.create_user("[email protected]")
self.create_member(user=user2, organization=self.org)
# implicit membership
self._assert_subscribers_are(
group,
email={self.user: GroupSubscriptionReason.implicit},
slack={self.user: GroupSubscriptionReason.implicit},
)
# unsubscribed
GroupSubscription.objects.create(
user_id=self.user.id, group=group, project=project, is_active=False
)
self._assert_subscribers_are(group)
# not participating by default
GroupSubscription.objects.filter(user_id=self.user.id, group=group).delete()
self.update_user_setting_subscribe_only()
self._assert_subscribers_are(group)
# explicitly participating
GroupSubscription.objects.create(
user_id=self.user.id,
group=group,
project=project,
is_active=True,
reason=GroupSubscriptionReason.comment,
)
self._assert_subscribers_are(
group,
email={self.user: GroupSubscriptionReason.comment},
slack={self.user: GroupSubscriptionReason.comment},
)
@with_feature("organizations:team-workflow-notifications")
def test_simple_teams(self):
team = self.create_team(organization=self.org)
project = self.create_project(teams=[self.team, team], organization=self.org)
group = self.create_group(project=project)
user2 = self.create_user("[email protected]")
self.create_member(user=user2, organization=self.org)
link_team(team, self.integration, "#team-channel", "team_channel_id")
# explicit participation
GroupSubscription.objects.create(
team_id=team.id,
group=group,
project=project,
is_active=True,
reason=GroupSubscriptionReason.comment,
)
self._assert_subscribers_are(
group,
email={
self.user: GroupSubscriptionReason.implicit,
team: GroupSubscriptionReason.comment,
},
slack={
self.user: GroupSubscriptionReason.implicit,
team: GroupSubscriptionReason.comment,
},
)
@with_feature("organizations:team-workflow-notifications")
def test_simple_with_workflow(self):
# Include an extra team here to prove the subquery works
team_2 = self.create_team(organization=self.org)
project = self.create_project(teams=[self.team, team_2], organization=self.org)
group = self.create_group(project=project)
user2 = self.create_user("[email protected]")
self.create_member(user=user2, organization=self.org)
self.update_team_setting_subscribe_only(team_2.id)
# implicit membership
self._assert_subscribers_are(
group,
email={self.user: GroupSubscriptionReason.implicit},
slack={self.user: GroupSubscriptionReason.implicit},
)
# unsubscribed
GroupSubscription.objects.create(
user_id=self.user.id, group=group, project=project, is_active=False
)
self._assert_subscribers_are(group)
# not participating by default
GroupSubscription.objects.filter(user_id=self.user.id, group=group).delete()
self.update_user_setting_subscribe_only()
self._assert_subscribers_are(group)
# explicitly participating
GroupSubscription.objects.create(
user_id=self.user.id,
group=group,
project=project,
is_active=True,
reason=GroupSubscriptionReason.comment,
)
self._assert_subscribers_are(
group,
email={self.user: GroupSubscriptionReason.comment},
slack={self.user: GroupSubscriptionReason.comment},
)
def test_no_conversations(self):
# Implicit subscription, ensure the project setting overrides the
# default global option.
self._assert_subscribers_are(
email={self.user: GroupSubscriptionReason.implicit},
slack={self.user: GroupSubscriptionReason.implicit},
)
self.update_project_setting_never()
self._assert_subscribers_are()
with assume_test_silo_mode(SiloMode.CONTROL):
NotificationSettingOption.objects.filter(
user_id=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
).delete()
NotificationSettingProvider.objects.filter(
user_id=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
).delete()
# Implicit subscription, ensure the project setting overrides the
# explicit global option.
self.update_user_settings_always()
self._assert_subscribers_are(
email={self.user: GroupSubscriptionReason.implicit},
slack={self.user: GroupSubscriptionReason.implicit},
)
self.update_project_setting_never()
self._assert_subscribers_are()
with assume_test_silo_mode(SiloMode.CONTROL):
NotificationSettingOption.objects.filter(
user_id=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
).delete()
NotificationSettingProvider.objects.filter(
user_id=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
).delete()
# Explicit subscription, overridden by the global option.
GroupSubscription.objects.create(
user_id=self.user.id,
group=self.group,
project=self.project,
is_active=True,
reason=GroupSubscriptionReason.comment,
)
self._assert_subscribers_are(
email={self.user: GroupSubscriptionReason.comment},
slack={self.user: GroupSubscriptionReason.comment},
)
with assume_test_silo_mode(SiloMode.CONTROL):
NotificationSettingProvider.objects.update_or_create(
scope_type=NotificationScopeEnum.USER.value,
scope_identifier=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
user_id=self.user.id,
provider=ExternalProviderEnum.EMAIL.value,
defaults={"value": NotificationSettingsOptionEnum.NEVER.value},
)
self._assert_subscribers_are(slack={self.user: GroupSubscriptionReason.comment})
with assume_test_silo_mode(SiloMode.CONTROL):
NotificationSettingOption.objects.filter(
user_id=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
).delete()
NotificationSettingProvider.objects.filter(
user_id=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
).delete()
# Explicit subscription, overridden by the project option.
self.update_user_setting_subscribe_only()
self._assert_subscribers_are(
email={self.user: GroupSubscriptionReason.comment},
slack={self.user: GroupSubscriptionReason.comment},
)
with assume_test_silo_mode(SiloMode.CONTROL):
NotificationSettingProvider.objects.update_or_create(
scope_type=NotificationScopeEnum.PROJECT.value,
scope_identifier=self.group.project_id,
type=NotificationSettingEnum.WORKFLOW.value,
provider=ExternalProviderEnum.EMAIL.value,
user_id=self.user.id,
defaults={"value": NotificationSettingsOptionEnum.NEVER.value},
)
self._assert_subscribers_are(slack={self.user: GroupSubscriptionReason.comment})
with assume_test_silo_mode(SiloMode.CONTROL):
NotificationSettingOption.objects.filter(
user_id=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
).delete()
NotificationSettingProvider.objects.filter(
user_id=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
).delete()
# Explicit subscription, overridden by the project option which also
# overrides the default option.
self._assert_subscribers_are(
email={self.user: GroupSubscriptionReason.comment},
slack={self.user: GroupSubscriptionReason.comment},
)
with assume_test_silo_mode(SiloMode.CONTROL):
NotificationSettingProvider.objects.update_or_create(
scope_type=NotificationScopeEnum.PROJECT.value,
scope_identifier=self.group.project_id,
type=NotificationSettingEnum.WORKFLOW.value,
provider=ExternalProviderEnum.EMAIL.value,
user_id=self.user.id,
defaults={"value": NotificationSettingsOptionEnum.NEVER.value},
)
self._assert_subscribers_are(slack={self.user: GroupSubscriptionReason.comment})
def test_participating_only(self):
# Implicit subscription, ensure the project setting overrides the default global option.
self._assert_subscribers_are(
email={self.user: GroupSubscriptionReason.implicit},
slack={self.user: GroupSubscriptionReason.implicit},
)
with assume_test_silo_mode(SiloMode.CONTROL):
NotificationSettingOption.objects.update_or_create(
scope_type=NotificationScopeEnum.PROJECT.value,
scope_identifier=self.project.id,
type=NotificationSettingEnum.WORKFLOW.value,
user_id=self.user.id,
defaults={"value": NotificationSettingsOptionEnum.SUBSCRIBE_ONLY.value},
)
NotificationSettingProvider.objects.update_or_create(
scope_type=NotificationScopeEnum.PROJECT.value,
scope_identifier=self.project.id,
type=NotificationSettingEnum.WORKFLOW.value,
user_id=self.user.id,
provider=ExternalProviderEnum.EMAIL.value,
defaults={"value": NotificationSettingsOptionEnum.SUBSCRIBE_ONLY.value},
)
self._assert_subscribers_are()
with assume_test_silo_mode(SiloMode.CONTROL):
NotificationSettingOption.objects.filter(
user_id=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
).delete()
NotificationSettingProvider.objects.filter(
user_id=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
).delete()
# Implicit subscription, ensure the project setting overrides the
# explicit global option.
self.update_user_settings_always()
self._assert_subscribers_are(
email={self.user: GroupSubscriptionReason.implicit},
slack={self.user: GroupSubscriptionReason.implicit},
)
with assume_test_silo_mode(SiloMode.CONTROL):
NotificationSettingProvider.objects.update_or_create(
scope_type=NotificationScopeEnum.PROJECT.value,
scope_identifier=self.project.id,
type=NotificationSettingEnum.WORKFLOW.value,
provider=ExternalProviderEnum.EMAIL.value,
user_id=self.user.id,
defaults={"value": NotificationSettingsOptionEnum.NEVER.value},
)
self._assert_subscribers_are(
slack={self.user: GroupSubscriptionReason.implicit},
)
with assume_test_silo_mode(SiloMode.CONTROL):
NotificationSettingOption.objects.filter(
user_id=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
).delete()
NotificationSettingProvider.objects.filter(
user_id=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
).delete()
# Ensure the global default is applied.
self.update_user_setting_subscribe_only()
self._assert_subscribers_are()
subscription = GroupSubscription.objects.create(
user_id=self.user.id,
group=self.group,
project=self.project,
is_active=True,
reason=GroupSubscriptionReason.comment,
)
self._assert_subscribers_are(
email={self.user: GroupSubscriptionReason.comment},
slack={self.user: GroupSubscriptionReason.comment},
)
subscription.delete()
with assume_test_silo_mode(SiloMode.CONTROL):
NotificationSettingOption.objects.filter(
user_id=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
).delete()
NotificationSettingProvider.objects.filter(
user_id=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
).delete()
# Ensure the project setting overrides the global default.
self.update_project_setting_subscribe_only()
self._assert_subscribers_are()
subscription = GroupSubscription.objects.create(
user_id=self.user.id,
group=self.group,
project=self.project,
is_active=True,
reason=GroupSubscriptionReason.comment,
)
self._assert_subscribers_are(
email={self.user: GroupSubscriptionReason.comment},
slack={self.user: GroupSubscriptionReason.comment},
)
subscription.delete()
with assume_test_silo_mode(SiloMode.CONTROL):
NotificationSettingOption.objects.filter(
user_id=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
).delete()
NotificationSettingProvider.objects.filter(
user_id=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
).delete()
# Ensure the project setting overrides the global setting.
self.update_user_settings_always()
self.update_project_setting_subscribe_only()
self._assert_subscribers_are()
subscription = GroupSubscription.objects.create(
user_id=self.user.id,
group=self.group,
project=self.project,
is_active=True,
reason=GroupSubscriptionReason.comment,
)
self._assert_subscribers_are(
email={self.user: GroupSubscriptionReason.comment},
slack={self.user: GroupSubscriptionReason.comment},
)
subscription.delete()
with assume_test_silo_mode(SiloMode.CONTROL):
NotificationSettingOption.objects.filter(
user_id=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
).delete()
NotificationSettingProvider.objects.filter(
user_id=self.user.id,
type=NotificationSettingEnum.WORKFLOW.value,
).delete()
self.update_user_setting_subscribe_only()
self.update_project_setting_always()
self._assert_subscribers_are(
email={self.user: GroupSubscriptionReason.implicit},
slack={self.user: GroupSubscriptionReason.implicit},
)
subscription = GroupSubscription.objects.create(
user_id=self.user.id,
group=self.group,
project=self.project,
is_active=True,
reason=GroupSubscriptionReason.comment,
)
self._assert_subscribers_are(
email={self.user: GroupSubscriptionReason.comment},
slack={self.user: GroupSubscriptionReason.comment},
)
def test_does_not_include_nonmember(self):
org = self.create_organization()
team = self.create_team(organization=org)
project = self.create_project(teams=[team], organization=org)
group = self.create_group(project=project)
user = self.create_user("[email protected]")
# implicit participation, included by default
self._assert_subscribers_are(group)
GroupSubscription.objects.create(
user_id=user.id,
group=group,
project=project,
is_active=True,
reason=GroupSubscriptionReason.comment,
)
# explicit participation, included by default
self._assert_subscribers_are(group)
# explicit participation, participating only
self._assert_subscribers_are(group)
GroupSubscription.objects.filter(user_id=user.id, group=group).delete()
# implicit participation, participating only
self._assert_subscribers_are(group)
with assume_test_silo_mode(SiloMode.CONTROL):
NotificationSettingOption.objects.create(
scope_type="project",
scope_identifier=project.id,
type="workflow",
user_id=user.id,
value="always",
)
# explicit participation, explicit participating only
self._assert_subscribers_are(group)
GroupSubscription.objects.filter(user_id=user.id, group=group).update(
reason=GroupSubscriptionReason.implicit
)
# implicit participation, explicit participating only
self._assert_subscribers_are(group)