def run_test(self, key, digests): """ Simple integration test to make sure that digests are firing as expected. """ backend = RedisBackend() rule = Rule.objects.create(project=self.project, label="Test Rule", data={}) event = self.store_event( data={ "timestamp": iso_format(before_now(days=1)), "fingerprint": ["group-1"] }, project_id=self.project.id, ) event_2 = self.store_event( data={ "timestamp": iso_format(before_now(days=1)), "fingerprint": ["group-2"] }, project_id=self.project.id, ) key = f"mail:p:{self.project.id}" backend.add(key, event_to_record(event, [rule]), increment_delay=0, maximum_delay=0) backend.add(key, event_to_record(event_2, [rule]), increment_delay=0, maximum_delay=0) digests.digest = backend.digest with self.tasks(): deliver_digest(key) assert "2 new alerts since" in mail.outbox[0].subject
def test_digest_enabled(self, digests, mock_func): """ Test that with digests enabled, but Slack notification settings (and not email settings), we send a Slack notification """ backend = RedisBackend() digests.digest = backend.digest digests.enabled.return_value = True rule = Rule.objects.create(project=self.project, label="my rule") event = self.store_event( data={"message": "Hello world", "level": "error"}, project_id=self.project.id ) key = f"mail:p:{self.project.id}" backend.add(key, event_to_record(event, [rule]), increment_delay=0, maximum_delay=0) with self.tasks(): deliver_digest(key) assert digests.call_count == 0 attachment, text = get_attachment() assert attachment["title"] == "Hello world" assert attachment["text"] == ""
def run_test(self, digests, event_count: int): backend = RedisBackend() digests.digest = backend.digest for i in range(event_count): self.add_event(f"group-{i}", backend) with self.tasks(): deliver_digest(self.key) assert len(mail.outbox) == USER_COUNT
def test_issue_alert_team_issue_owners_user_settings_off_digests( self, digests, mock_func): """Test that issue alerts are sent to a team in Slack via an Issue Owners rule action even when the users' issue alert notification settings are off and digests are triggered.""" backend = RedisBackend() digests.digest = backend.digest digests.enabled.return_value = True # turn off the user's issue alert notification settings # there was a bug where issue alerts to a team's Slack channel # were only firing if this was set to ALWAYS NotificationSetting.objects.update_settings( ExternalProviders.SLACK, NotificationSettingTypes.ISSUE_ALERTS, NotificationSettingOptionValues.NEVER, user=self.user, ) # add a second user to the team so we can be sure it's only # sent once (to the team, and not to each individual user) user2 = self.create_user(is_superuser=False) self.create_member(teams=[self.team], user=user2, organization=self.organization) self.idp = IdentityProvider.objects.create(type="slack", external_id="TXXXXXXX2", config={}) self.identity = Identity.objects.create( external_id="UXXXXXXX2", idp=self.idp, user=user2, status=IdentityStatus.VALID, scopes=[], ) NotificationSetting.objects.update_settings( ExternalProviders.SLACK, NotificationSettingTypes.ISSUE_ALERTS, NotificationSettingOptionValues.NEVER, user=user2, ) # update the team's notification settings ExternalActor.objects.create( actor=self.team.actor, organization=self.organization, integration=self.integration, provider=ExternalProviders.SLACK.value, external_name="goma", external_id="CXXXXXXX2", ) NotificationSetting.objects.update_settings( ExternalProviders.SLACK, NotificationSettingTypes.ISSUE_ALERTS, NotificationSettingOptionValues.ALWAYS, team=self.team, ) rule = GrammarRule(Matcher("path", "*"), [Owner("team", self.team.slug)]) ProjectOwnership.objects.create(project_id=self.project.id, schema=dump_schema([rule]), fallthrough=True) event = self.store_event( data={ "message": "Hello world", "level": "error", "stacktrace": { "frames": [{ "filename": "foo.py" }] }, }, project_id=self.project.id, ) action_data = { "id": "sentry.mail.actions.NotifyEmailAction", "targetType": "IssueOwners", "targetIdentifier": "", } rule = Rule.objects.create( project=self.project, label="ja rule", data={ "match": "all", "actions": [action_data], }, ) key = f"mail:p:{self.project.id}" backend.add(key, event_to_record(event, [rule]), increment_delay=0, maximum_delay=0) with self.tasks(): deliver_digest(key) # check that only one was sent out - more would mean each user is being notified # rather than the team assert len(responses.calls) == 1 # check that the team got a notification data = parse_qs(responses.calls[0].request.body) assert data["channel"] == ["CXXXXXXX2"] assert "attachments" in data attachments = json.loads(data["attachments"][0]) assert len(attachments) == 1 assert attachments[0]["title"] == "Hello world" assert ( attachments[0]["footer"] == f"{self.project.slug} | <http://testserver/settings/{self.organization.slug}/teams/{self.team.slug}/notifications/?referrer=alert-rule-slack-team|Notification Settings>" )
def test_no_records(self): # This shouldn't error if no records are present deliver_digest(f"mail:p:{self.project.id}:IssueOwners:")