def test_build_group_attachment_color_warning(self): warning_event = self.store_event(data={"level": "warning"}, project_id=self.project.id) assert build_group_attachment( warning_event.group)["color"] == "#FFC227" assert build_group_attachment(warning_event.group, warning_event)["color"] == "#FFC227"
def test_valid_token(self): responses.add(responses.POST, "https://slack.com/api/chat.unfurl", json={"ok": True}) org2 = self.create_organization(name="biz") project1 = self.create_project(organization=self.org) project2 = self.create_project(organization=org2) min_ago = iso_format(before_now(minutes=1)) group1 = self.create_group(project=project1) group2 = self.create_group(project=project2) event = self.store_event(data={ "fingerprint": ["group3"], "timestamp": min_ago }, project_id=project1.id) group3 = event.group alert_rule = self.create_alert_rule() incident = self.create_incident(status=2, organization=self.org, projects=[project1], alert_rule=alert_rule) incident.update(identifier=123) resp = self.post_webhook(event_data=json.loads( LINK_SHARED_EVENT % { "group1": group1.id, "group2": group2.id, "group3": group3.id, "incident": incident.identifier, "org1": self.org.slug, "org2": org2.slug, "event": event.event_id, })) assert resp.status_code == 200, resp.content data = dict(parse_qsl(responses.calls[0].request.body)) unfurls = json.loads(data["unfurls"]) issue_url = "http://testserver/organizations/%s/issues/%s/bar/" % ( self.org.slug, group1.id) incident_url = "http://testserver/organizations/%s/incidents/%s/" % ( self.org.slug, incident.identifier, ) event_url = "http://testserver/organizations/%s/issues/%s/events/%s/" % ( self.org.slug, group3.id, event.event_id, ) assert unfurls == { issue_url: build_group_attachment(group1), incident_url: build_incident_attachment(incident), event_url: build_group_attachment(group3, event=event, link_to_event=True), } assert data["token"] == "xoxp-xxxxxxxxx-xxxxxxxxxx-xxxxxxxxxxxx"
def unfurl_issues(request, integration, links: List[UnfurlableUrl]) -> UnfurledUrl: """ Returns a map of the attachments used in the response we send to Slack for a particular issue by the URL of the yet-unfurled links a user included in their Slack message. """ group_by_id = { g.id: g for g in Group.objects.filter( id__in={link.args["issue_id"] for link in links}, project__in=Project.objects.filter( organization__in=integration.organizations.all()), ) } if not group_by_id: return {} out = {} for link in links: issue_id = link.args["issue_id"] if issue_id in group_by_id: group = group_by_id[issue_id] # lookup the event by the id event_id = link.args["event_id"] event = eventstore.get_event_by_id(group.project_id, event_id) if event_id else None out[link.url] = build_group_attachment(group_by_id[issue_id], event=event, link_to_event=True) return out
def test_valid_token(self): responses.add(responses.POST, 'https://slack.com/api/chat.unfurl', json={'ok': True}) org2 = self.create_organization(name='biz') project1 = self.create_project(organization=self.org) project2 = self.create_project(organization=org2) group1 = self.create_group(project=project1) group2 = self.create_group(project=project2) incident = self.create_incident(organization=self.org, projects=[project1]) incident.update(identifier=123) resp = self.post_webhook(event_data=json.loads(LINK_SHARED_EVENT % { 'group1': group1.id, 'group2': group2.id, 'incident': incident.identifier, 'org1': self.org.slug, 'org2': org2.slug, })) assert resp.status_code == 200, resp.content data = dict(parse_qsl(responses.calls[0].request.body)) unfurls = json.loads(data['unfurls']) issue_url = 'http://testserver/organizations/%s/issues/%s/bar/' % ( self.org.slug, group1.id, ) incident_url = 'http://testserver/organizations/%s/incidents/%s/' % ( self.org.slug, incident.identifier, ) assert unfurls == { issue_url: build_group_attachment(group1), incident_url: build_incident_attachment(incident), }
def test_build_group_attachment_color_unxpected_level_error_fallback(self): unexpected_level_event = self.store_event(data={"level": "trace"}, project_id=self.project.id, assert_no_errors=False) assert build_group_attachment( unexpected_level_event.group)["color"] == "#E03E2F"
def test_build_group_attachment_color_no_event_error_fallback(self): group_with_no_events = self.create_group(project=self.project) assert build_group_attachment( group_with_no_events)["color"] == "#E03E2F"
def test_build_group_attachment(self): self.user = self.create_user("*****@*****.**") self.org = self.create_organization(name="Rowdy Tiger", owner=None) self.team = self.create_team(organization=self.org, name="Mariachi Band") self.project = self.create_project( organization=self.org, teams=[self.team], name="Bengal-Elephant-Giraffe-Tree-House") self.create_member(user=self.user, organization=self.org, role="owner", teams=[self.team]) group = self.create_group(project=self.project) ts = group.last_seen assert build_group_attachment(group) == { "color": "#E03E2F", "text": "", "actions": [ { "name": "status", "text": "Resolve", "type": "button", "value": "resolved" }, { "text": "Ignore", "type": "button", "name": "status", "value": "ignored" }, { "option_groups": [ { "text": "Teams", "options": [{ "text": u"#mariachi-band", "value": u"team:" + six.text_type(self.team.id), }], }, { "text": "People", "options": [{ "text": u"*****@*****.**", "value": u"user:"******"text": "Select Assignee...", "selected_options": [None], "type": "select", "name": "assign", }, ], "mrkdwn_in": ["text"], "title": group.title, "fields": [], "footer": u"BENGAL-ELEPHANT-GIRAFFE-TREE-HOUSE-1", "ts": to_timestamp(ts), "title_link": u"http://testserver/organizations/rowdy-tiger/issues/" + six.text_type(group.id) + "/?referrer=slack", "callback_id": '{"issue":' + six.text_type(group.id) + "}", "fallback": u"[{}] {}".format(self.project.slug, group.title), "footer_icon": u"http://testserver/_static/{version}/sentry/images/sentry-email-avatar.png", } event = self.store_event(data={}, project_id=self.project.id) ts = event.datetime assert build_group_attachment(group, event) == { "color": "#E03E2F", "text": "", "actions": [ { "name": "status", "text": "Resolve", "type": "button", "value": "resolved" }, { "text": "Ignore", "type": "button", "name": "status", "value": "ignored" }, { "option_groups": [ { "text": "Teams", "options": [{ "text": u"#mariachi-band", "value": u"team:" + six.text_type(self.team.id), }], }, { "text": "People", "options": [{ "text": u"*****@*****.**", "value": u"user:"******"text": "Select Assignee...", "selected_options": [None], "type": "select", "name": "assign", }, ], "mrkdwn_in": ["text"], "title": event.title, "fields": [], "footer": u"BENGAL-ELEPHANT-GIRAFFE-TREE-HOUSE-1", "ts": to_timestamp(ts), "title_link": u"http://testserver/organizations/rowdy-tiger/issues/" + six.text_type(group.id) + "/?referrer=slack", "callback_id": '{"issue":' + six.text_type(group.id) + "}", "fallback": u"[{}] {}".format(self.project.slug, event.title), "footer_icon": u"http://testserver/_static/{version}/sentry/images/sentry-email-avatar.png", } assert build_group_attachment(group, event, link_to_event=True) == { "color": "#E03E2F", "text": "", "actions": [ { "name": "status", "text": "Resolve", "type": "button", "value": "resolved" }, { "text": "Ignore", "type": "button", "name": "status", "value": "ignored" }, { "option_groups": [ { "text": "Teams", "options": [{ "text": u"#mariachi-band", "value": u"team:" + six.text_type(self.team.id), }], }, { "text": "People", "options": [{ "text": u"*****@*****.**", "value": u"user:"******"text": "Select Assignee...", "selected_options": [None], "type": "select", "name": "assign", }, ], "mrkdwn_in": ["text"], "title": event.title, "fields": [], "footer": u"BENGAL-ELEPHANT-GIRAFFE-TREE-HOUSE-1", "ts": to_timestamp(ts), "title_link": u"http://testserver/organizations/rowdy-tiger/issues/{}/events/{}/" .format(group.id, event.event_id) + "?referrer=slack", "callback_id": '{"issue":' + six.text_type(group.id) + "}", "fallback": u"[{}] {}".format(self.project.slug, event.title), "footer_icon": u"http://testserver/_static/{version}/sentry/images/sentry-email-avatar.png", }