Skip to content

Commit 4fad183

Browse files
committed
Fix tests and types
1 parent 9f38993 commit 4fad183

File tree

18 files changed

+285
-150
lines changed

18 files changed

+285
-150
lines changed

src/sentry/integrations/slack/message_builder/base/block.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,24 @@ def get_markdown_block(text: str, emoji: str | None = None) -> SlackBlock:
4040
}
4141

4242
@staticmethod
43-
def get_rich_text_link(emojis: list[str], text: str, link: str) -> SlackBlock:
44-
elements = []
43+
def get_rich_text_link(emojis: list[str], text: str, link: str | None = None) -> SlackBlock:
44+
elements: list[dict[str, Any]] = []
4545
for emoji in emojis:
4646
elements.append({"type": "emoji", "name": emoji})
4747
elements.append({"type": "text", "text": " "})
4848

49-
elements.append({"type": "link", "url": link, "text": text, "style": {"bold": True}})
49+
url: dict[str, Any] = {}
50+
if link:
51+
url = {
52+
"type": "link",
53+
"url": link,
54+
"text": text,
55+
"style": {"bold": True},
56+
}
57+
else:
58+
url = {"type": "text", "text": text}
59+
60+
elements.append(url)
5061

5162
return {
5263
"type": "rich_text",

src/sentry/integrations/slack/message_builder/issues.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -465,19 +465,19 @@ def get_title_block(
465465
def get_title_emoji(self, has_action: bool) -> list[str]:
466466
is_error_issue = self.group.issue_category == GroupCategory.ERROR
467467

468-
title_emojis = []
468+
title_emojis: list[str] = []
469469
if has_action:
470470
# if issue is resolved, archived, or assigned, replace circle emojis with white circle
471471
title_emojis = (
472472
ACTION_EMOJI
473473
if is_error_issue
474-
else ACTIONED_CATEGORY_TO_EMOJI.get(self.group.issue_category)
474+
else ACTIONED_CATEGORY_TO_EMOJI.get(self.group.issue_category, [])
475475
)
476476
elif is_error_issue:
477477
level_text = LOG_LEVELS[self.group.level]
478-
title_emojis = LEVEL_TO_EMOJI.get(level_text)
478+
title_emojis = LEVEL_TO_EMOJI.get(level_text, [])
479479
else:
480-
title_emojis = CATEGORY_TO_EMOJI.get(self.group.issue_category)
480+
title_emojis = CATEGORY_TO_EMOJI.get(self.group.issue_category, [])
481481

482482
return title_emojis
483483

src/sentry/integrations/slack/message_builder/types.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
GroupCategory.CRON: ["large_yellow_circle", "spiral_calendar_pad"],
3333
}
3434

35-
ACTIONED_CATEGORY_TO_EMOJI = {
35+
ACTIONED_CATEGORY_TO_EMOJI: dict[GroupCategory, list[str]] = {
3636
GroupCategory.PERFORMANCE: [ACTION_EMOJI, "chart_with_upwards_trend"],
3737
GroupCategory.FEEDBACK: [ACTION_EMOJI, "busts_in_silhouette"],
3838
GroupCategory.CRON: [ACTION_EMOJI, "spiral_calendar_pad"],

src/sentry/testutils/cases.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2835,14 +2835,17 @@ def assert_performance_issue_blocks_with_culprit_blocks(
28352835
alert_type: FineTuningAPIKey = FineTuningAPIKey.WORKFLOW,
28362836
issue_link_extra_params=None,
28372837
):
2838-
notification_uuid = self.get_notification_uuid(blocks[1]["text"]["text"])
2838+
notification_uuid = self.get_notification_uuid(
2839+
blocks[1]["elements"][0]["elements"][-1]["url"]
2840+
)
28392841
issue_link = f"http://testserver/organizations/{org.slug}/issues/{group.id}/?referrer={referrer}&notification_uuid={notification_uuid}"
28402842
if issue_link_extra_params is not None:
28412843
issue_link += issue_link_extra_params
2842-
assert (
2843-
blocks[1]["text"]["text"]
2844-
== f":large_blue_circle: :chart_with_upwards_trend: <{issue_link}|*N+1 Query*>"
2845-
)
2844+
emoji = "large_blue_circle"
2845+
text = "N+1 Query"
2846+
assert blocks[1]["elements"][0]["elements"][0]["name"] == emoji
2847+
assert blocks[1]["elements"][0]["elements"][-1]["url"] == issue_link
2848+
assert blocks[1]["elements"][0]["elements"][-1]["text"] == text
28462849
assert blocks[2]["elements"][0]["text"] == "/books/"
28472850
assert (
28482851
blocks[3]["text"]["text"]
@@ -2866,14 +2869,18 @@ def assert_generic_issue_blocks(
28662869
issue_link_extra_params=None,
28672870
with_culprit=False,
28682871
):
2869-
notification_uuid = self.get_notification_uuid(blocks[1]["text"]["text"])
2872+
notification_uuid = self.get_notification_uuid(
2873+
blocks[1]["elements"][0]["elements"][-1]["url"]
2874+
)
28702875
issue_link = f"http://testserver/organizations/{org.slug}/issues/{group.id}/?referrer={referrer}&notification_uuid={notification_uuid}"
28712876
if issue_link_extra_params is not None:
28722877
issue_link += issue_link_extra_params
2873-
assert (
2874-
blocks[1]["text"]["text"]
2875-
== f":red_circle: <{issue_link}|*{TEST_ISSUE_OCCURRENCE.issue_title}*>"
2876-
)
2878+
emoji = "red_circle"
2879+
text = f"{TEST_ISSUE_OCCURRENCE.issue_title}"
2880+
assert blocks[1]["elements"][0]["elements"][0]["name"] == emoji
2881+
assert blocks[1]["elements"][0]["elements"][-1]["url"] == issue_link
2882+
assert blocks[1]["elements"][0]["elements"][-1]["text"] == text
2883+
28772884
if with_culprit:
28782885
assert blocks[2]["elements"][0]["text"] == "raven.tasks.run_a_test"
28792886
evidence_index = 3

tests/sentry/integrations/slack/actions/notification/test_slack_notify_service_action.py

Lines changed: 57 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,12 @@ def test_after(self, mock_api_call, mock_post, mock_record):
9999
blocks = mock_post.call_args.kwargs["blocks"]
100100
blocks = orjson.loads(blocks)
101101

102-
assert (
103-
blocks[0]["text"]["text"]
104-
== f":large_yellow_circle: <http://testserver/organizations/{self.organization.slug}/issues/{self.event.group.id}/?referrer=slack|*Hello world*>"
105-
)
102+
emoji = "large_yellow_circle"
103+
url = f"http://testserver/organizations/{self.organization.slug}/issues/{self.event.group.id}/?referrer=slack"
104+
text = "Hello world"
105+
assert blocks[0]["elements"][0]["elements"][0]["name"] == emoji
106+
assert blocks[0]["elements"][0]["elements"][-1]["url"] == url
107+
assert blocks[0]["elements"][0]["elements"][-1]["text"] == text
106108

107109
assert NotificationMessage.objects.all().count() == 0
108110

@@ -139,10 +141,12 @@ def test_after_slo_halt(self, mock_post, mock_record):
139141
blocks = mock_post.call_args.kwargs["blocks"]
140142
blocks = orjson.loads(blocks)
141143

142-
assert (
143-
blocks[0]["text"]["text"]
144-
== f":large_yellow_circle: <http://testserver/organizations/{self.organization.slug}/issues/{self.event.group.id}/?referrer=slack|*Hello world*>"
145-
)
144+
emoji = "large_yellow_circle"
145+
url = f"http://testserver/organizations/{self.organization.slug}/issues/{self.event.group.id}/?referrer=slack"
146+
text = "Hello world"
147+
assert blocks[0]["elements"][0]["elements"][0]["name"] == emoji
148+
assert blocks[0]["elements"][0]["elements"][-1]["url"] == url
149+
assert blocks[0]["elements"][0]["elements"][-1]["text"] == text
146150

147151
assert NotificationMessage.objects.all().count() == 0
148152

@@ -200,10 +204,12 @@ def test_after_with_threads(self, mock_api_call, mock_post, mock_record):
200204
blocks = mock_post.call_args.kwargs["blocks"]
201205
blocks = orjson.loads(blocks)
202206

203-
assert (
204-
blocks[0]["text"]["text"]
205-
== f":large_yellow_circle: <http://testserver/organizations/{self.organization.slug}/issues/{self.event.group.id}/?referrer=slack&alert_rule_id={self.rule.id}&alert_type=issue|*Hello world*>"
206-
)
207+
emoji = "large_yellow_circle"
208+
url = f"http://testserver/organizations/{self.organization.slug}/issues/{self.event.group.id}/?referrer=slack&alert_rule_id={self.rule.id}&alert_type=issue"
209+
text = "Hello world"
210+
assert blocks[0]["elements"][0]["elements"][0]["name"] == emoji
211+
assert blocks[0]["elements"][0]["elements"][-1]["url"] == url
212+
assert blocks[0]["elements"][0]["elements"][-1]["text"] == text
207213

208214
assert NotificationMessage.objects.all().count() == 1
209215

@@ -257,10 +263,12 @@ def test_after_reply_in_thread(self, mock_api_call, mock_post, mock_record):
257263
blocks = mock_post.call_args.kwargs["blocks"]
258264
blocks = orjson.loads(blocks)
259265

260-
assert (
261-
blocks[0]["text"]["text"]
262-
== f":large_yellow_circle: <http://testserver/organizations/{self.organization.slug}/issues/{self.event.group.id}/?referrer=slack&alert_rule_id={self.rule.id}&alert_type=issue|*Hello world*>"
263-
)
266+
emoji = "large_yellow_circle"
267+
url = f"http://testserver/organizations/{self.organization.slug}/issues/{self.event.group.id}/?referrer=slack&alert_rule_id={self.rule.id}&alert_type=issue"
268+
text = "Hello world"
269+
assert blocks[0]["elements"][0]["elements"][0]["name"] == emoji
270+
assert blocks[0]["elements"][0]["elements"][-1]["url"] == url
271+
assert blocks[0]["elements"][0]["elements"][-1]["text"] == text
264272

265273
assert NotificationMessage.objects.all().count() == 2
266274
assert (
@@ -302,10 +310,13 @@ def test_after_noa(self, mock_api_call, mock_post, mock_record):
302310
blocks = mock_post.call_args.kwargs["blocks"]
303311
blocks = orjson.loads(blocks)
304312

305-
assert (
306-
blocks[0]["text"]["text"]
307-
== f":large_yellow_circle: <http://testserver/organizations/{self.organization.slug}/issues/{self.event.group.id}/?referrer=slack&alert_rule_id={action_data['legacy_rule_id']}&alert_type=issue|*Hello world*>"
308-
)
313+
emoji = "large_yellow_circle"
314+
url = f"http://testserver/organizations/{self.organization.slug}/issues/{self.event.group.id}/?referrer=slack&alert_rule_id={action_data['legacy_rule_id']}&alert_type=issue"
315+
text = "Hello world"
316+
317+
assert blocks[0]["elements"][0]["elements"][0]["name"] == emoji
318+
assert blocks[0]["elements"][0]["elements"][-1]["url"] == url
319+
assert blocks[0]["elements"][0]["elements"][-1]["text"] == text
309320

310321
assert NotificationMessage.objects.all().count() == 1
311322

@@ -345,10 +356,13 @@ def test_after_noa_test_action(self, mock_api_call, mock_post, mock_record):
345356
blocks = mock_post.call_args.kwargs["blocks"]
346357
blocks = orjson.loads(blocks)
347358

348-
assert (
349-
blocks[0]["text"]["text"]
350-
== f":large_yellow_circle: <http://testserver/organizations/{self.organization.slug}/issues/{self.event.group.id}/?referrer=slack&alert_rule_id={action_data['legacy_rule_id']}&alert_type=issue|*Hello world*>"
351-
)
359+
emoji = "large_yellow_circle"
360+
url = f"http://testserver/organizations/{self.organization.slug}/issues/{self.event.group.id}/?referrer=slack&alert_rule_id={action_data['legacy_rule_id']}&alert_type=issue"
361+
text = "Hello world"
362+
363+
assert blocks[0]["elements"][0]["elements"][0]["name"] == emoji
364+
assert blocks[0]["elements"][0]["elements"][-1]["url"] == url
365+
assert blocks[0]["elements"][0]["elements"][-1]["text"] == text
352366

353367
# Test action should not create a notification message
354368
assert NotificationMessage.objects.all().count() == 0
@@ -386,10 +400,13 @@ def test_after_noa_new_ui(self, mock_api_call, mock_post, mock_record):
386400
blocks = mock_post.call_args.kwargs["blocks"]
387401
blocks = orjson.loads(blocks)
388402

389-
assert (
390-
blocks[0]["text"]["text"]
391-
== f":large_yellow_circle: <http://testserver/organizations/{self.organization.slug}/issues/{self.event.group.id}/?referrer=slack&workflow_id={action_data['workflow_id']}&alert_type=issue|*Hello world*>"
392-
)
403+
emoji = "large_yellow_circle"
404+
url = f"http://testserver/organizations/{self.organization.slug}/issues/{self.event.group.id}/?referrer=slack&workflow_id={action_data['workflow_id']}&alert_type=issue"
405+
text = "Hello world"
406+
407+
assert blocks[0]["elements"][0]["elements"][0]["name"] == emoji
408+
assert blocks[0]["elements"][0]["elements"][-1]["url"] == url
409+
assert blocks[0]["elements"][0]["elements"][-1]["text"] == text
393410

394411
assert NotificationMessage.objects.all().count() == 1
395412

@@ -429,10 +446,12 @@ def test_after_with_threads_noa(self, mock_api_call, mock_post, mock_record):
429446
blocks = mock_post.call_args.kwargs["blocks"]
430447
blocks = orjson.loads(blocks)
431448

432-
assert (
433-
blocks[0]["text"]["text"]
434-
== f":large_yellow_circle: <http://testserver/organizations/{self.organization.slug}/issues/{self.event.group.id}/?referrer=slack&alert_rule_id={action_data['legacy_rule_id']}&alert_type=issue|*Hello world*>"
435-
)
449+
emoji = "large_yellow_circle"
450+
url = f"http://testserver/organizations/{self.organization.slug}/issues/{self.event.group.id}/?referrer=slack&alert_rule_id={action_data['legacy_rule_id']}&alert_type=issue"
451+
text = "Hello world"
452+
assert blocks[0]["elements"][0]["elements"][0]["name"] == emoji
453+
assert blocks[0]["elements"][0]["elements"][-1]["url"] == url
454+
assert blocks[0]["elements"][0]["elements"][-1]["text"] == text
436455

437456
assert NotificationMessage.objects.all().count() == 1
438457

@@ -488,10 +507,12 @@ def test_after_reply_in_thread_noa(self, mock_api_call, mock_post, mock_record):
488507
blocks = mock_post.call_args.kwargs["blocks"]
489508
blocks = orjson.loads(blocks)
490509

491-
assert (
492-
blocks[0]["text"]["text"]
493-
== f":large_yellow_circle: <http://testserver/organizations/{self.organization.slug}/issues/{self.event.group.id}/?referrer=slack&alert_rule_id={action_data['legacy_rule_id']}&alert_type=issue|*Hello world*>"
494-
)
510+
emoji = "large_yellow_circle"
511+
url = f"http://testserver/organizations/{self.organization.slug}/issues/{self.event.group.id}/?referrer=slack&alert_rule_id={action_data['legacy_rule_id']}&alert_type=issue"
512+
text = "Hello world"
513+
assert blocks[0]["elements"][0]["elements"][0]["name"] == emoji
514+
assert blocks[0]["elements"][0]["elements"][-1]["url"] == url
515+
assert blocks[0]["elements"][0]["elements"][-1]["text"] == text
495516

496517
assert NotificationMessage.objects.all().count() == 2
497518
assert (

tests/sentry/integrations/slack/notifications/test_assigned.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,17 @@ def test_assignment_block(self):
9898
fallback_text = self.mock_post.call_args.kwargs["text"]
9999
assert fallback_text == f"Issue assigned to {self.name} by themselves"
100100
assert blocks[0]["text"]["text"] == fallback_text
101-
notification_uuid = self.get_notification_uuid(blocks[1]["text"]["text"])
102-
assert (
103-
blocks[1]["text"]["text"]
104-
== f":red_circle: <http://testserver/organizations/{self.organization.slug}/issues/{self.group.id}/?referrer=assigned_activity-slack&notification_uuid={notification_uuid}|*{self.group.title}*>"
101+
102+
notification_uuid = self.get_notification_uuid(
103+
blocks[1]["elements"][0]["elements"][-1]["url"]
105104
)
105+
emoji = "red_circle"
106+
url = f"http://testserver/organizations/{self.organization.slug}/issues/{self.group.id}/?referrer=assigned_activity-slack&notification_uuid={notification_uuid}"
107+
text = f"{self.group.title}"
108+
assert blocks[1]["elements"][0]["elements"][0]["name"] == emoji
109+
assert blocks[1]["elements"][0]["elements"][-1]["url"] == url
110+
assert blocks[1]["elements"][0]["elements"][-1]["text"] == text
111+
106112
assert (
107113
blocks[3]["elements"][0]["text"]
108114
== f"{self.project.slug} | <http://testserver/settings/account/notifications/workflow/?referrer=assigned_activity-slack-user&notification_uuid={notification_uuid}&organizationId={self.organization.id}|Notification Settings>"

0 commit comments

Comments
 (0)