1
+ import uuid
1
2
from typing import Any
2
3
from unittest .mock import patch
3
4
4
5
from django .utils import timezone
5
6
6
7
from sentry .incidents .grouptype import MetricIssue
8
+ from sentry .incidents .models .incident import IncidentStatus
7
9
from sentry .issues .ingest import save_issue_occurrence
8
10
from sentry .issues .issue_occurrence import IssueOccurrenceData
9
- from sentry .models .groupopenperiod import GroupOpenPeriod
11
+ from sentry .models .group import GroupStatus
12
+ from sentry .models .groupopenperiod import GroupOpenPeriod , create_open_period
10
13
from sentry .testutils .cases import TestCase
11
14
from sentry .testutils .helpers .features import with_feature
12
15
from sentry .workflow_engine .models import IncidentGroupOpenPeriod
@@ -22,6 +25,14 @@ def setUp(self) -> None:
22
25
projects = [self .project ],
23
26
name = "Test Alert Rule" ,
24
27
)
28
+ self .detector = self .create_detector (
29
+ project = self .project ,
30
+ name = "Test Detector" ,
31
+ )
32
+ self .alert_rule_detector = self .create_alert_rule_detector (
33
+ alert_rule_id = self .alert_rule .id ,
34
+ detector = self .detector ,
35
+ )
25
36
self .group = self .create_group (project = self .project )
26
37
self .group .type = MetricIssue .type_id
27
38
self .group .save ()
@@ -32,14 +43,14 @@ def save_issue_occurrence(self, include_alert_id: bool = True) -> tuple[Any, Gro
32
43
)
33
44
34
45
occurrence_data : IssueOccurrenceData = {
35
- "id" : "1" ,
46
+ "id" : str ( uuid . uuid4 ()) ,
36
47
"project_id" : self .project .id ,
37
48
"event_id" : event .event_id ,
38
49
"fingerprint" : ["test-fingerprint" ],
39
50
"issue_title" : "Test Issue" ,
40
51
"subtitle" : "Test Subtitle" ,
41
52
"resource_id" : None ,
42
- "evidence_data" : {"alert_id " : self .alert_rule .id } if include_alert_id else {},
53
+ "evidence_data" : {"detector_id " : self .detector .id } if include_alert_id else {},
43
54
"evidence_display" : [
44
55
{"name" : "Test Evidence" , "value" : "Test Value" , "important" : True }
45
56
],
@@ -55,7 +66,9 @@ def save_issue_occurrence(self, include_alert_id: bool = True) -> tuple[Any, Gro
55
66
assert group_info is not None
56
67
assert group_info .group .type == MetricIssue .type_id
57
68
58
- open_period = GroupOpenPeriod .objects .get (group = group_info .group )
69
+ open_period = (
70
+ GroupOpenPeriod .objects .filter (group = group_info .group ).order_by ("-date_started" ).first ()
71
+ )
59
72
assert open_period is not None
60
73
assert open_period .date_ended is None
61
74
return occurrence , open_period
@@ -88,7 +101,7 @@ def test_create_from_occurrence_without_incident(self) -> None:
88
101
89
102
assert result is None
90
103
open_period .refresh_from_db ()
91
- assert open_period .data ["pending_incident_alert_id " ] == self .alert_rule .id
104
+ assert open_period .data ["pending_incident_detector_id " ] == self .detector .id
92
105
93
106
@with_feature ("organizations:issue-open-periods" )
94
107
def test_create_from_occurrence_no_alert_id (self ) -> None :
@@ -125,9 +138,9 @@ def test_create_relationship_new(self) -> None:
125
138
assert result .group_open_period == open_period
126
139
127
140
@with_feature ("organizations:issue-open-periods" )
128
- def test_create_relationship_existing (self ) -> None :
129
- """Test updating an existing relationship"""
130
- occurrence , open_period = self .save_issue_occurrence ()
141
+ def test_create_second_relationship (self ) -> None :
142
+ """Test creating a second relationship for a new incident """
143
+ _ , open_period = self .save_issue_occurrence ()
131
144
132
145
incident1 = self .create_incident (
133
146
organization = self .organization ,
@@ -139,42 +152,49 @@ def test_create_relationship_existing(self) -> None:
139
152
# Create initial relationship
140
153
relationship = IncidentGroupOpenPeriod .create_relationship (incident1 , open_period )
141
154
assert relationship .incident_id == incident1 .id
155
+ assert relationship .group_open_period == open_period
142
156
143
- # Create new incident and update relationship
157
+ incident1 .status = IncidentStatus .CLOSED .value
158
+ incident1 .save ()
159
+
160
+ open_period .group .update (status = GroupStatus .RESOLVED )
161
+ open_period .update (date_ended = timezone .now ())
162
+ open_period_2 = create_open_period (open_period .group , timezone .now ())
163
+
164
+ # Create new incident and new relationship
144
165
incident2 = self .create_incident (
145
166
organization = self .organization ,
146
167
title = "Test Incident 2" ,
147
168
date_started = timezone .now (),
148
169
alert_rule = self .alert_rule ,
149
170
)
150
171
151
- result = IncidentGroupOpenPeriod .create_relationship (incident2 , open_period )
152
-
172
+ result = IncidentGroupOpenPeriod .create_relationship (incident2 , open_period_2 )
153
173
assert result is not None
154
174
assert result .incident_id == incident2 .id
155
175
assert result .incident_identifier == incident2 .identifier
156
- assert result .group_open_period == open_period
176
+ assert result .group_open_period == open_period_2
157
177
158
178
@with_feature ("organizations:issue-open-periods" )
159
179
def test_create_placeholder_relationship (self ) -> None :
160
180
"""Test creating a placeholder relationship"""
161
181
occurrence , open_period = self .save_issue_occurrence ()
162
182
163
183
result = IncidentGroupOpenPeriod .create_placeholder_relationship (
164
- self .alert_rule .id , open_period , self .project
184
+ self .detector .id , open_period , self .project
165
185
)
166
186
167
187
assert result is None
168
188
open_period .refresh_from_db ()
169
- assert open_period .data ["pending_incident_alert_id " ] == self .alert_rule .id
189
+ assert open_period .data ["pending_incident_detector_id " ] == self .detector .id
170
190
171
191
@with_feature ("organizations:issue-open-periods" )
172
192
def test_create_pending_relationships_for_incident (self ) -> None :
173
193
"""Test creating relationships for pending open periods"""
174
194
occurrence , open_period = self .save_issue_occurrence ()
175
195
176
196
# Create a placeholder relationship
177
- open_period .data = {"pending_incident_alert_id " : self .alert_rule .id }
197
+ open_period .data = {"pending_incident_detector_id " : self .detector .id }
178
198
open_period .save ()
179
199
180
200
incident = self .create_incident (
@@ -193,7 +213,7 @@ def test_create_pending_relationships_for_incident(self) -> None:
193
213
194
214
# Check that placeholder was cleaned up
195
215
open_period .refresh_from_db ()
196
- assert "pending_incident_alert_id " not in open_period .data
216
+ assert "pending_incident_detector_id " not in open_period .data
197
217
198
218
@with_feature ("organizations:issue-open-periods" )
199
219
def test_create_pending_relationships_for_incident_no_pending (self ) -> None :
0 commit comments