|
5 | 5 | from django.utils.dateparse import parse_datetime |
6 | 6 |
|
7 | 7 | from sentry.api.serializers import serialize |
| 8 | +from sentry.constants import ObjectStatus |
8 | 9 | from sentry.incidents.charts import ( |
9 | 10 | build_metric_alert_chart, |
10 | 11 | fetch_metric_issue_open_periods, |
|
30 | 31 | from sentry.testutils.helpers.datetime import freeze_time |
31 | 32 | from sentry.testutils.helpers.features import with_feature |
32 | 33 | from sentry.types.group import PriorityLevel |
33 | | -from sentry.workflow_engine.models import DetectorGroup |
| 34 | +from sentry.workflow_engine.models import Detector, DetectorGroup |
34 | 35 | from tests.sentry.incidents.utils.test_metric_issue_base import BaseMetricIssueTest |
35 | 36 |
|
36 | 37 | now = "2022-05-16T20:00:00" |
@@ -272,6 +273,37 @@ def test_get_incidents_from_detector(self) -> None: |
272 | 273 | assert created_activity_resp["type"] == IncidentActivityType.CREATED.value |
273 | 274 | assert created_activity_resp["dateCreated"] == created_activity.date_added |
274 | 275 |
|
| 276 | + @freeze_time(frozen_time) |
| 277 | + @with_feature("organizations:incidents") |
| 278 | + def test_pending_deletion_detector_not_resolved_to_alert_rule(self) -> None: |
| 279 | + self.create_detector() # dummy so detector ID != alert rule ID |
| 280 | + detector = self.create_detector(project=self.project) |
| 281 | + alert_rule = self.create_alert_rule(organization=self.organization, projects=[self.project]) |
| 282 | + self.create_alert_rule_detector(detector=detector, alert_rule_id=alert_rule.id) |
| 283 | + incident = self.create_incident( |
| 284 | + date_started=must_parse_datetime("2022-05-16T18:55:00Z"), |
| 285 | + status=IncidentStatus.CRITICAL.value, |
| 286 | + alert_rule=alert_rule, |
| 287 | + ) |
| 288 | + self.create_incident_activity( |
| 289 | + incident, |
| 290 | + IncidentActivityType.DETECTED.value, |
| 291 | + date_added=incident.date_started, |
| 292 | + ) |
| 293 | + |
| 294 | + time_period = incident_date_range(60, incident.date_started, incident.date_closed) |
| 295 | + |
| 296 | + # Mark the detector as pending deletion (bypass custom manager) |
| 297 | + Detector.objects_for_deletion.filter(id=detector.id).update( |
| 298 | + status=ObjectStatus.PENDING_DELETION |
| 299 | + ) |
| 300 | + |
| 301 | + # The AlertRuleDetector lookup should skip the deleted detector, |
| 302 | + # so the detector ID won't be mapped to the alert rule ID and |
| 303 | + # no incidents will be found |
| 304 | + chart_data = fetch_metric_issue_open_periods(self.organization, detector.id, time_period) |
| 305 | + assert len(chart_data) == 0 |
| 306 | + |
275 | 307 | @freeze_time(frozen_time) |
276 | 308 | @with_feature("organizations:incidents") |
277 | 309 | @with_feature("organizations:workflow-engine-ui") |
|
0 commit comments