From 7007d2d0850948fba40658c0bf27a68ce65026da Mon Sep 17 00:00:00 2001 From: Colleen O'Rourke Date: Mon, 1 Dec 2025 13:32:25 -0800 Subject: [PATCH] fix(rules): Skip none on combined rule serialization --- .../endpoints/serializers/alert_rule.py | 8 ++++-- .../endpoints/serializers/test_alert_rule.py | 25 +++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/sentry/incidents/endpoints/serializers/alert_rule.py b/src/sentry/incidents/endpoints/serializers/alert_rule.py index d4a604060baeb6..386f28603082a0 100644 --- a/src/sentry/incidents/endpoints/serializers/alert_rule.py +++ b/src/sentry/incidents/endpoints/serializers/alert_rule.py @@ -377,7 +377,9 @@ def get_attrs( serialized_alert_rules = serialize(alert_rules, user=user) serialized_alert_rule_map_by_id = { - serialized_alert["id"]: serialized_alert for serialized_alert in serialized_alert_rules + serialized_alert["id"]: serialized_alert + for serialized_alert in serialized_alert_rules + if serialized_alert } serialized_issue_rules = serialize( @@ -386,7 +388,9 @@ def get_attrs( serializer=RuleSerializer(expand=self.expand), ) serialized_issue_rule_map_by_id = { - serialized_rule["id"]: serialized_rule for serialized_rule in serialized_issue_rules + serialized_rule["id"]: serialized_rule + for serialized_rule in serialized_issue_rules + if serialized_rule } uptime_detectors = [ diff --git a/tests/sentry/incidents/endpoints/serializers/test_alert_rule.py b/tests/sentry/incidents/endpoints/serializers/test_alert_rule.py index 54f0285fe90190..e0fec74e1c9d6c 100644 --- a/tests/sentry/incidents/endpoints/serializers/test_alert_rule.py +++ b/tests/sentry/incidents/endpoints/serializers/test_alert_rule.py @@ -291,6 +291,31 @@ def test_combined_serializer(self) -> None: serialized_uptime_monitor["type"] = "uptime" assert result[3] == serialized_uptime_monitor + @patch("sentry.api.serializers.models.rule.RuleSerializer.serialize") + @patch("sentry.api.serializers.base.logger") + def test_combined_serializer_failure(self, mock_logger, mock_serialize: MagicMock) -> None: + mock_serialize.side_effect = Exception + + projects = [self.project, self.create_project()] + alert_rule = self.create_alert_rule(projects=projects) + issue_rule = self.create_issue_alert_rule( + data={ + "project": self.project, + "name": "Issue Rule Test", + "conditions": [], + "actions": [], + "actionMatch": "all", + } + ) + result = serialize( + [alert_rule, issue_rule], + serializer=CombinedRuleSerializer(), + ) + assert mock_logger.exception.call_count == 1 + self.assert_alert_rule_serialized(alert_rule, result[0]) + # we have limited data here because of the exception + assert result[1] == {"type": "rule"} + def test_alert_snoozed(self) -> None: projects = [self.project, self.create_project()] alert_rule = self.create_alert_rule(projects=projects)