From 2aae5705c96bb34f8441015c817a1776cb9962c3 Mon Sep 17 00:00:00 2001 From: Yeger Date: Thu, 31 Oct 2024 10:49:57 +0200 Subject: [PATCH] don't crash when there is no data (#7208) * don't crash when there is no data * Add test --- redash/models/__init__.py | 4 ++-- tests/models/test_alerts.py | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/redash/models/__init__.py b/redash/models/__init__.py index f3483bfa3a..063ced3e62 100644 --- a/redash/models/__init__.py +++ b/redash/models/__init__.py @@ -968,9 +968,9 @@ def get_by_id_and_org(cls, object_id, org): return super(Alert, cls).get_by_id_and_org(object_id, org, Query) def evaluate(self): - data = self.query_rel.latest_query_data.data + data = self.query_rel.latest_query_data.data if self.query_rel.latest_query_data else None - if data["rows"] and self.options["column"] in data["rows"][0]: + if data and data["rows"] and self.options["column"] in data["rows"][0]: op = OPERATORS.get(self.options["op"], lambda v, t: False) if "selector" not in self.options: diff --git a/tests/models/test_alerts.py b/tests/models/test_alerts.py index 3bcfff0108..6c614db096 100644 --- a/tests/models/test_alerts.py +++ b/tests/models/test_alerts.py @@ -111,6 +111,13 @@ def test_evaluates_correctly_with_max_selector(self): alert.options["selector"] = "max" self.assertEqual(alert.evaluate(), Alert.UNKNOWN_STATE) + def test_evaluate_alerts_without_query_rel(self): + query = self.factory.create_query(latest_query_data_id=None) + alert = self.factory.create_alert( + query_rel=query, options={"selector": "first", "op": "equals", "column": "foo", "value": "1"} + ) + self.assertEqual(alert.evaluate(), Alert.UNKNOWN_STATE) + class TestNextState(TestCase): def test_numeric_value(self):