Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 17 additions & 8 deletions src/sentry/rules/actions/notify_event_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,18 +103,27 @@ def find_alert_rule_action_ui_component(app_platform_event: AppPlatformEvent) ->
Loop through the triggers for the alert rule event. For each trigger, check
if an action is an alert rule UI Component
"""
triggers = (
getattr(app_platform_event, "data", {})
.get("metric_alert", {})
.get("alert_rule", {})
.get("triggers", [])
)
data = getattr(app_platform_event, "data", {}) or {}

metric_alert = data.get("metric_alert") or {}
if not isinstance(metric_alert, dict):
metric_alert = {}

alert_rule = metric_alert.get("alert_rule") or {}
if not isinstance(alert_rule, dict):
alert_rule = {}

triggers = alert_rule.get("triggers") or []
if not isinstance(triggers, list):
triggers = []

actions = [
action
for trigger in triggers
for action in trigger.get("actions", {})
if (action.get("type") == "sentry_app" and action.get("settings") is not None)
if isinstance(trigger, dict)
for action in trigger.get("actions") or []
if isinstance(action, dict)
if action.get("type") == "sentry_app" and action.get("settings") is not None
]

return bool(len(actions))
Expand Down
37 changes: 35 additions & 2 deletions tests/sentry/rules/actions/test_notify_event_service.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
from types import SimpleNamespace
from unittest.mock import MagicMock, patch

from django.utils import timezone

from sentry.rules.actions.notify_event_service import NotifyEventServiceAction
from sentry.rules.actions.notify_event_service import (
NotifyEventServiceAction,
find_alert_rule_action_ui_component,
)
from sentry.sentry_apps.tasks.sentry_apps import notify_sentry_app
from sentry.silo.base import SiloMode
from sentry.testutils.cases import RuleTestCase
from sentry.testutils.cases import RuleTestCase, TestCase
from sentry.testutils.silo import assume_test_silo_mode
from sentry.testutils.skips import requires_snuba

Expand Down Expand Up @@ -90,3 +94,32 @@ def test_sentry_app_installed(self) -> None:

results = rule.get_services()
assert len(results) == 0


class FindAlertRuleActionUiComponentTest(TestCase):
def test_handles_null_metric_alert_payload(self) -> None:
event = SimpleNamespace(data={"metric_alert": None})

assert not find_alert_rule_action_ui_component(event)

def test_detects_sentry_app_action(self) -> None:
event = SimpleNamespace(
data={
"metric_alert": {
"alert_rule": {
"triggers": [
{
"actions": [
{
"type": "sentry_app",
"settings": {"foo": "bar"},
}
]
}
]
}
}
}
)

assert find_alert_rule_action_ui_component(event)
Loading