def test_send_alert_event_with_additional_payload(self, safe_urlopen): event = self.store_event(data={}, project_id=self.project.id) settings = { "alert_prefix": "[Not Good]", "channel": "#ignored-errors", "best_emoji": ":fire:", } rule_future = RuleFuture( rule=self.rule, kwargs={"sentry_app": self.sentry_app, "schema_defined_settings": settings}, ) with self.tasks(): notify_sentry_app(event, [rule_future]) payload = json.loads(faux(safe_urlopen).kwargs["data"]) assert payload["action"] == "triggered" assert payload["data"]["triggered_rule"] == self.rule.label assert payload["data"]["issue_alert"] == { "id": self.rule.id, "title": self.rule.label, "sentry_app_id": self.sentry_app.id, "settings": settings, } buffer = SentryAppWebhookRequestsBuffer(self.sentry_app) requests = buffer.get_requests() assert len(requests) == 1 assert requests[0]["response_code"] == 200 assert requests[0]["event_type"] == "event_alert.triggered"
def test_send_alert_event(self, safe_urlopen): group = self.create_group(project=self.project) event = self.create_event(group=group) rule_future = RuleFuture(rule=self.rule, kwargs={"sentry_app": self.sentry_app}) with self.tasks(): notify_sentry_app(event, [rule_future]) data = json.loads(faux(safe_urlopen).kwargs["data"]) assert data == { "action": "triggered", "installation": { "uuid": self.install.uuid }, "data": { "event": DictContaining( event_id=event.event_id, url=absolute_uri( reverse( "sentry-api-0-project-event-details", args=[ self.organization.slug, self.project.slug, event.event_id ], )), web_url=absolute_uri( reverse( "sentry-organization-event-detail", args=[ self.organization.slug, group.id, event.event_id ], )), issue_url=absolute_uri("/api/0/issues/{}/".format( group.id)), ), "triggered_rule": self.rule.label, }, "actor": { "type": "application", "id": "sentry", "name": "Sentry" }, } assert faux(safe_urlopen).kwarg_equals( "headers", DictContaining( "Content-Type", "Request-ID", "Sentry-Hook-Resource", "Sentry-Hook-Timestamp", "Sentry-Hook-Signature", ), )
def test_send_alert_event(self, safe_urlopen): group = self.create_group(project=self.project) event = self.create_event(group=group) rule_future = RuleFuture( rule=self.rule, kwargs={'sentry_app': self.sentry_app}, ) with self.tasks(): notify_sentry_app(event, [rule_future]) data = json.loads(faux(safe_urlopen).kwargs['data']) assert data == { 'action': 'triggered', 'installation': { 'uuid': self.install.uuid, }, 'data': { 'event': DictContaining( event_id=event.event_id, url=absolute_uri( reverse('sentry-api-0-project-event-details', args=[ self.organization.slug, self.project.slug, event.id, ])), web_url=absolute_uri( reverse('sentry-group-event', args=[ self.organization.slug, self.project.slug, group.id, event.id, ])), issue_url=absolute_uri( '/api/0/issues/{}/'.format(group.id), ), ), 'triggered_rule': self.rule.label, }, 'actor': { 'type': 'application', 'id': 'sentry', 'name': 'Sentry', } } assert faux(safe_urlopen).kwarg_equals( 'headers', DictContaining( 'Content-Type', 'Request-ID', 'Sentry-Hook-Resource', 'Sentry-Hook-Timestamp', 'Sentry-Hook-Signature', ))
def test_no_sentry_app_in_future(self, safe_urlopen): event = self.store_event(data={}, project_id=self.project.id) rule_future = RuleFuture(rule=self.rule, kwargs={}) with self.tasks(): notify_sentry_app(event, [rule_future]) assert not safe_urlopen.called
def test_no_sentry_app_in_future(self, safe_urlopen): group = self.create_group(project=self.project) event = self.create_event(group=group) rule_future = RuleFuture(rule=self.rule, kwargs={}) with self.tasks(): notify_sentry_app(event, [rule_future]) assert not safe_urlopen.called
def test_no_installation(self, safe_urlopen): sentry_app = self.create_sentry_app(organization=self.organization) event = self.store_event(data={}, project_id=self.project.id) rule_future = RuleFuture(rule=self.rule, kwargs={"sentry_app": sentry_app}) with self.tasks(): notify_sentry_app(event, [rule_future]) assert not safe_urlopen.called
def test_no_installation(self, safe_urlopen): sentry_app = self.create_sentry_app(organization=self.organization) group = self.create_group(project=self.project) event = self.create_event(group=group) rule_future = RuleFuture(rule=self.rule, kwargs={"sentry_app": sentry_app}) with self.tasks(): notify_sentry_app(event, [rule_future]) assert not safe_urlopen.called
def test_no_sentry_app_in_future(self, safe_urlopen): group = self.create_group(project=self.project) event = self.create_event(group=group) rule_future = RuleFuture( rule=self.rule, kwargs={}, ) with self.tasks(): notify_sentry_app(event, [rule_future]) assert not safe_urlopen.called
def test_send_alert_event(self, safe_urlopen): group = self.create_group(project=self.project) event = self.create_event(group=group) rule_future = RuleFuture( rule=self.rule, kwargs={'sentry_app': self.sentry_app}, ) with self.feature('organizations:sentry10'): with self.tasks(): notify_sentry_app(event, [rule_future]) data = json.loads(faux(safe_urlopen).kwargs['data']) assert data == { 'action': 'triggered', 'installation': { 'uuid': self.install.uuid, }, 'data': { 'event': DictContaining( event_id=event.event_id, url=absolute_uri(reverse('sentry-api-0-project-event-details', args=[ self.organization.slug, self.project.slug, event.id, ])), web_url=absolute_uri(reverse('sentry-organization-event-detail', args=[ self.organization.slug, group.id, event.id, ])), issue_url=absolute_uri( '/api/0/issues/{}/'.format(group.id), ), ), 'triggered_rule': self.rule.label, }, 'actor': { 'type': 'application', 'id': 'sentry', 'name': 'Sentry', } } assert faux(safe_urlopen).kwarg_equals('headers', DictContaining( 'Content-Type', 'Request-ID', 'Sentry-Hook-Resource', 'Sentry-Hook-Timestamp', 'Sentry-Hook-Signature', ))
def test_send_alert_event(self, safe_urlopen): event = self.store_event(data={}, project_id=self.project.id) group = event.group rule_future = RuleFuture(rule=self.rule, kwargs={"sentry_app": self.sentry_app}) with self.tasks(): notify_sentry_app(event, [rule_future]) data = json.loads(faux(safe_urlopen).kwargs["data"]) assert data == { "action": "triggered", "installation": {"uuid": self.install.uuid}, "data": { "event": DictContaining( event_id=event.event_id, url=absolute_uri( reverse( "sentry-api-0-project-event-details", args=[self.organization.slug, self.project.slug, event.event_id], ) ), web_url=absolute_uri( reverse( "sentry-organization-event-detail", args=[self.organization.slug, group.id, event.event_id], ) ), issue_url=absolute_uri(f"/api/0/issues/{group.id}/"), ), "triggered_rule": self.rule.label, }, "actor": {"type": "application", "id": "sentry", "name": "Sentry"}, } assert faux(safe_urlopen).kwarg_equals( "headers", DictContaining( "Content-Type", "Request-ID", "Sentry-Hook-Resource", "Sentry-Hook-Timestamp", "Sentry-Hook-Signature", ), ) buffer = SentryAppWebhookRequestsBuffer(self.sentry_app) requests = buffer.get_requests() assert len(requests) == 1 assert requests[0]["response_code"] == 200 assert requests[0]["event_type"] == "event_alert.triggered"
def test_no_installation(self, safe_urlopen): sentry_app = self.create_sentry_app( organization=self.organization ) group = self.create_group(project=self.project) event = self.create_event(group=group) rule_future = RuleFuture( rule=self.rule, kwargs={'sentry_app': sentry_app}, ) with self.tasks(): notify_sentry_app(event, [rule_future]) assert not safe_urlopen.called
def test_send_alert_event(self, safe_urlopen): group = self.create_group(project=self.project) event = self.create_event(group=group) rule_future = RuleFuture( rule=self.rule, kwargs={'sentry_app': self.sentry_app}, ) event_data = self._get_event_data(event) with self.tasks(): notify_sentry_app(event, [rule_future]) data = faux(safe_urlopen).kwargs['data'] assert data == { 'action': 'triggered', 'installation': { 'uuid': self.install.uuid, }, 'data': { 'event': event_data, 'triggered_rule': self.rule.label, }, 'actor': { 'type': 'application', 'id': 'sentry', 'name': 'Sentry', } } assert faux(safe_urlopen).kwarg_equals('headers', DictContaining( 'Content-Type', 'Request-ID', 'Sentry-Hook-Resource', 'Sentry-Hook-Timestamp', 'Sentry-Hook-Signature', ))