Ejemplo n.º 1
0
 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
Ejemplo n.º 2
0
    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"] == ""
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
    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>"
        )
Ejemplo n.º 5
0
 def test_no_records(self):
     # This shouldn't error if no records are present
     deliver_digest(f"mail:p:{self.project.id}:IssueOwners:")