Skip to content

Commit a586e16

Browse files
ceorourkeandrewshie-sentry
authored andcommitted
feat(ACI): Create shared test base class for workflow engine serializers (#90869)
Create a shared base class for the workflow engine serializer tests because they were redoing the same thing a lot.
1 parent 419471b commit a586e16

File tree

4 files changed

+162
-242
lines changed

4 files changed

+162
-242
lines changed

tests/sentry/incidents/serializers/test_workflow_engine_action.py

Lines changed: 9 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,46 +3,19 @@
33
WorkflowEngineActionSerializer,
44
)
55
from sentry.incidents.models.alert_rule import AlertRuleTriggerAction
6-
from sentry.testutils.cases import TestCase
7-
from sentry.testutils.helpers.datetime import freeze_time
86
from sentry.workflow_engine.migration_helpers.alert_rule import (
9-
migrate_alert_rule,
107
migrate_metric_action,
118
migrate_metric_data_conditions,
129
)
10+
from tests.sentry.incidents.serializers.test_workflow_engine_base import TestWorklowEngineSerializer
1311

1412

15-
@freeze_time("2018-12-11 03:21:34")
16-
class TestActionSerializer(TestCase):
17-
def setUp(self) -> None:
18-
self.alert_rule = self.create_alert_rule()
19-
self.critical_trigger = self.create_alert_rule_trigger(
20-
alert_rule=self.alert_rule, label="critical"
21-
)
22-
self.critical_trigger_action = self.create_alert_rule_trigger_action(
23-
alert_rule_trigger=self.critical_trigger
24-
)
25-
migrate_alert_rule(self.alert_rule)
26-
migrate_metric_data_conditions(self.critical_trigger)
27-
self.action, _, _ = migrate_metric_action(self.critical_trigger_action)
28-
29-
self.expected = {
30-
"id": str(self.critical_trigger_action.id),
31-
"alertRuleTriggerId": str(self.critical_trigger.id),
32-
"type": "email",
33-
"targetType": "user",
34-
"targetIdentifier": str(self.user.id),
35-
"inputChannelId": None,
36-
"integrationId": None,
37-
"sentryAppId": None,
38-
"dateCreated": self.action.date_added,
39-
"desc": f"Send a notification to {self.user.email}",
40-
"priority": self.action.data.get("priority"),
41-
}
42-
13+
class TestActionSerializer(TestWorklowEngineSerializer):
4314
def test_simple(self) -> None:
44-
serialized_action = serialize(self.action, self.user, WorkflowEngineActionSerializer())
45-
assert serialized_action == self.expected
15+
serialized_action = serialize(
16+
self.critical_action, self.user, WorkflowEngineActionSerializer()
17+
)
18+
assert serialized_action == self.expected_critical_action[0]
4619

4720
def test_warning_trigger(self) -> None:
4821
"""
@@ -63,7 +36,7 @@ def test_warning_trigger(self) -> None:
6336
serialized_action = serialize(
6437
self.warning_action, self.user, WorkflowEngineActionSerializer()
6538
)
66-
warning_expected = self.expected.copy()
39+
warning_expected = self.expected_critical_action[0].copy()
6740
warning_expected["id"] = str(self.warning_trigger_action.id)
6841
warning_expected["alertRuleTriggerId"] = str(self.warning_trigger.id)
6942
warning_expected["targetType"] = "team"
@@ -103,7 +76,7 @@ def test_sentry_app_action(self) -> None:
10376
serialized_action = serialize(
10477
self.sentry_app_action, self.user, WorkflowEngineActionSerializer()
10578
)
106-
sentry_app_expected = self.expected.copy()
79+
sentry_app_expected = self.expected_critical_action[0].copy()
10780
sentry_app_expected["type"] = "sentry_app"
10881
sentry_app_expected["id"] = str(self.sentry_app_trigger_action.id)
10982
sentry_app_expected["alertRuleTriggerId"] = str(self.sentry_app_trigger.id)
@@ -137,7 +110,7 @@ def test_slack_action(self) -> None:
137110
serialized_action = serialize(
138111
self.slack_action, self.user, WorkflowEngineActionSerializer()
139112
)
140-
slack_expected = self.expected.copy()
113+
slack_expected = self.expected_critical_action[0].copy()
141114
slack_expected["type"] = self.integration.provider
142115
slack_expected["id"] = str(self.slack_trigger_action.id)
143116
slack_expected["alertRuleTriggerId"] = str(self.slack_trigger.id)
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
from django.utils import timezone
2+
3+
from sentry.incidents.models.alert_rule import AlertRuleStatus, AlertRuleThresholdType
4+
from sentry.incidents.models.incident import IncidentTrigger, TriggerStatus
5+
from sentry.models.groupopenperiod import GroupOpenPeriod
6+
from sentry.testutils.cases import TestCase
7+
from sentry.testutils.helpers.datetime import freeze_time
8+
from sentry.types.group import PriorityLevel
9+
from sentry.workflow_engine.migration_helpers.alert_rule import (
10+
migrate_alert_rule,
11+
migrate_metric_action,
12+
migrate_metric_data_conditions,
13+
migrate_resolve_threshold_data_condition,
14+
)
15+
from sentry.workflow_engine.models import ActionGroupStatus
16+
17+
18+
@freeze_time("2024-12-11 03:21:34")
19+
class TestWorklowEngineSerializer(TestCase):
20+
def setUp(self) -> None:
21+
self.now = timezone.now()
22+
self.alert_rule = self.create_alert_rule()
23+
self.critical_trigger = self.create_alert_rule_trigger(
24+
alert_rule=self.alert_rule, label="critical"
25+
)
26+
self.critical_trigger_action = self.create_alert_rule_trigger_action(
27+
alert_rule_trigger=self.critical_trigger
28+
)
29+
_, _, _, self.detector, _, _, _, _ = migrate_alert_rule(self.alert_rule)
30+
self.critical_detector_trigger, _ = migrate_metric_data_conditions(self.critical_trigger)
31+
32+
self.critical_action, _, _ = migrate_metric_action(self.critical_trigger_action)
33+
self.resolve_trigger_data_condition = migrate_resolve_threshold_data_condition(
34+
self.alert_rule
35+
)
36+
self.expected_critical_action = [
37+
{
38+
"id": str(self.critical_trigger_action.id),
39+
"alertRuleTriggerId": str(self.critical_trigger.id),
40+
"type": "email",
41+
"targetType": "user",
42+
"targetIdentifier": str(self.user.id),
43+
"inputChannelId": None,
44+
"integrationId": None,
45+
"sentryAppId": None,
46+
"dateCreated": self.critical_trigger_action.date_added,
47+
"desc": f"Send a notification to {self.user.email}",
48+
"priority": self.critical_action.data.get("priority"),
49+
}
50+
]
51+
self.expected_triggers = [
52+
{
53+
"id": str(self.critical_trigger.id),
54+
"alertRuleId": str(self.alert_rule.id),
55+
"label": "critical",
56+
"thresholdType": AlertRuleThresholdType.ABOVE.value,
57+
"alertThreshold": self.critical_detector_trigger.comparison,
58+
"resolveThreshold": AlertRuleThresholdType.BELOW,
59+
"dateCreated": self.critical_trigger.date_added,
60+
"actions": self.expected_critical_action,
61+
},
62+
]
63+
64+
self.expected = {
65+
"id": str(self.alert_rule.id),
66+
"name": self.detector.name,
67+
"organizationId": self.detector.project.organization_id,
68+
"status": AlertRuleStatus.PENDING.value,
69+
"query": self.alert_rule.snuba_query.query,
70+
"aggregate": self.alert_rule.snuba_query.aggregate,
71+
"timeWindow": self.alert_rule.snuba_query.time_window,
72+
"resolution": self.alert_rule.snuba_query.resolution,
73+
"thresholdPeriod": self.detector.config.get("thresholdPeriod"),
74+
"triggers": self.expected_triggers,
75+
"projects": [self.project.slug],
76+
"owner": self.detector.owner_user_id,
77+
"dateModified": self.detector.date_updated,
78+
"dateCreated": self.detector.date_added,
79+
"createdBy": {},
80+
"description": self.detector.description or "",
81+
"detectionType": self.detector.type,
82+
}
83+
84+
def add_warning_trigger(self) -> None:
85+
self.warning_trigger = self.create_alert_rule_trigger(
86+
alert_rule=self.alert_rule, label="warning"
87+
)
88+
self.warning_trigger_action = self.create_alert_rule_trigger_action(
89+
alert_rule_trigger=self.warning_trigger
90+
)
91+
self.warning_detector_trigger, _ = migrate_metric_data_conditions(self.warning_trigger)
92+
self.warning_action, _, _ = migrate_metric_action(self.warning_trigger_action)
93+
self.expected_warning_action = [
94+
{
95+
"id": str(self.warning_trigger_action.id),
96+
"alertRuleTriggerId": str(self.warning_trigger.id),
97+
"type": "email",
98+
"targetType": "user",
99+
"targetIdentifier": str(self.user.id),
100+
"inputChannelId": None,
101+
"integrationId": None,
102+
"sentryAppId": None,
103+
"dateCreated": self.warning_trigger_action.date_added,
104+
"desc": f"Send a notification to {self.user.email}",
105+
"priority": self.warning_action.data.get("priority"),
106+
}
107+
]
108+
self.expected_warning_trigger = {
109+
"id": str(self.warning_trigger.id),
110+
"alertRuleId": str(self.alert_rule.id),
111+
"label": "warning",
112+
"thresholdType": AlertRuleThresholdType.ABOVE.value,
113+
"alertThreshold": self.critical_detector_trigger.comparison,
114+
"resolveThreshold": AlertRuleThresholdType.BELOW,
115+
"dateCreated": self.critical_trigger.date_added,
116+
"actions": self.expected_warning_action,
117+
}
118+
self.expected_triggers.append(self.expected_warning_trigger)
119+
120+
def add_incident_data(self) -> None:
121+
self.incident = self.create_incident(alert_rule=self.alert_rule, date_started=self.now)
122+
IncidentTrigger.objects.create(
123+
incident=self.incident,
124+
alert_rule_trigger=self.critical_trigger,
125+
status=TriggerStatus.ACTIVE.value,
126+
)
127+
128+
self.group.priority = PriorityLevel.HIGH
129+
self.group.save()
130+
ActionGroupStatus.objects.create(action=self.critical_action, group=self.group)
131+
GroupOpenPeriod.objects.create(
132+
group=self.group, project=self.detector.project, date_started=self.incident.date_started
133+
)

tests/sentry/incidents/serializers/test_workflow_engine_data_condition.py

Lines changed: 11 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -3,71 +3,20 @@
33
WorkflowEngineDataConditionSerializer,
44
)
55
from sentry.incidents.endpoints.utils import translate_data_condition_type
6-
from sentry.incidents.models.alert_rule import (
7-
AlertRule,
8-
AlertRuleThresholdType,
9-
AlertRuleTrigger,
10-
AlertRuleTriggerAction,
11-
)
12-
from sentry.testutils.cases import TestCase
13-
from sentry.testutils.helpers.datetime import freeze_time
6+
from sentry.incidents.models.alert_rule import AlertRule, AlertRuleTrigger, AlertRuleTriggerAction
147
from sentry.workflow_engine.migration_helpers.alert_rule import (
158
migrate_alert_rule,
169
migrate_metric_action,
1710
migrate_metric_data_conditions,
1811
migrate_resolve_threshold_data_condition,
1912
)
13+
from tests.sentry.incidents.serializers.test_workflow_engine_base import TestWorklowEngineSerializer
2014

2115

22-
@freeze_time("2018-12-11 03:21:34")
23-
class TestDataConditionSerializer(TestCase):
16+
class TestDataConditionSerializer(TestWorklowEngineSerializer):
2417
def setUp(self) -> None:
25-
self.alert_rule = self.create_alert_rule()
26-
self.critical_trigger = self.create_alert_rule_trigger(
27-
alert_rule=self.alert_rule, label="critical"
28-
)
29-
self.critical_trigger_action = self.create_alert_rule_trigger_action(
30-
alert_rule_trigger=self.critical_trigger
31-
)
32-
self.warning_trigger = self.create_alert_rule_trigger(
33-
alert_rule=self.alert_rule, label="warning"
34-
)
35-
self.warning_trigger_action = self.create_alert_rule_trigger_action(
36-
alert_rule_trigger=self.warning_trigger
37-
)
38-
_, _, _, self.detector, _, _, _, _ = migrate_alert_rule(self.alert_rule)
39-
self.critical_detector_trigger, _ = migrate_metric_data_conditions(self.critical_trigger)
40-
self.warning_detector_trigger, _ = migrate_metric_data_conditions(self.warning_trigger)
41-
self.critical_action, _, _ = migrate_metric_action(self.critical_trigger_action)
42-
self.warning_action, _, _ = migrate_metric_action(self.warning_trigger_action)
43-
self.resolve_trigger_data_condition = migrate_resolve_threshold_data_condition(
44-
self.alert_rule
45-
)
46-
self.expected_actions = [
47-
{
48-
"id": str(self.critical_trigger_action.id),
49-
"alertRuleTriggerId": str(self.critical_trigger.id),
50-
"type": "email",
51-
"targetType": "user",
52-
"targetIdentifier": str(self.user.id),
53-
"inputChannelId": None,
54-
"integrationId": None,
55-
"sentryAppId": None,
56-
"dateCreated": self.critical_trigger_action.date_added,
57-
"desc": f"Send a notification to {self.user.email}",
58-
"priority": self.critical_action.data.get("priority"),
59-
},
60-
]
61-
self.expected_trigger = {
62-
"id": str(self.critical_trigger.id),
63-
"alertRuleId": str(self.alert_rule.id),
64-
"label": "critical",
65-
"thresholdType": AlertRuleThresholdType.ABOVE.value,
66-
"alertThreshold": self.critical_detector_trigger.comparison,
67-
"resolveThreshold": AlertRuleThresholdType.BELOW,
68-
"dateCreated": self.critical_trigger.date_added,
69-
"actions": self.expected_actions,
70-
}
18+
super().setUp()
19+
self.add_warning_trigger()
7120

7221
def create_rule_triggers_and_actions(
7322
self,
@@ -102,29 +51,15 @@ def test_simple(self) -> None:
10251
self.user,
10352
WorkflowEngineDataConditionSerializer(),
10453
)
105-
assert serialized_data_condition == self.expected_trigger
54+
assert serialized_data_condition == self.expected_triggers[0]
10655

10756
def test_warning_trigger(self) -> None:
10857
serialized_data_condition = serialize(
10958
self.warning_detector_trigger,
11059
self.user,
11160
WorkflowEngineDataConditionSerializer(),
11261
)
113-
expected_actions = self.expected_actions.copy()
114-
expected_actions[0]["id"] = str(self.warning_trigger_action.id)
115-
expected_actions[0]["alertRuleTriggerId"] = str(self.warning_trigger.id)
116-
117-
expected_trigger = self.expected_trigger.copy()
118-
expected_trigger["actions"] = expected_actions
119-
expected_trigger["alertThreshold"] = translate_data_condition_type(
120-
self.detector.config.get("comparison_delta"),
121-
self.resolve_trigger_data_condition.type,
122-
self.warning_detector_trigger.comparison,
123-
)
124-
expected_trigger["id"] = str(self.warning_trigger.id)
125-
expected_trigger["alertRuleId"] = str(self.alert_rule.id)
126-
expected_trigger["label"] = "warning"
127-
assert serialized_data_condition == expected_trigger
62+
assert serialized_data_condition == self.expected_triggers[1]
12863

12964
def test_multiple_actions(self) -> None:
13065
self.critical_trigger_action_2 = self.create_alert_rule_trigger_action(
@@ -136,7 +71,7 @@ def test_multiple_actions(self) -> None:
13671
self.user,
13772
WorkflowEngineDataConditionSerializer(),
13873
)
139-
expected_actions = self.expected_actions.copy()
74+
expected_actions = self.expected_critical_action.copy()
14075
actions_2 = {
14176
"id": str(self.critical_trigger_action_2.id),
14277
"alertRuleTriggerId": str(self.critical_trigger.id),
@@ -151,7 +86,7 @@ def test_multiple_actions(self) -> None:
15186
"priority": self.critical_action.data.get("priority"),
15287
}
15388
expected_actions.append(actions_2)
154-
expected_trigger = self.expected_trigger.copy()
89+
expected_trigger = self.expected_triggers[0].copy()
15590
expected_trigger["actions"] = expected_actions
15691
assert serialized_data_condition == expected_trigger
15792

@@ -173,11 +108,11 @@ def test_comparison_delta(self) -> None:
173108
self.user,
174109
WorkflowEngineDataConditionSerializer(),
175110
)
176-
expected_actions = self.expected_actions.copy()
111+
expected_actions = self.expected_critical_action.copy()
177112
expected_actions[0]["id"] = str(comparison_delta_trigger_action.id)
178113
expected_actions[0]["alertRuleTriggerId"] = str(comparison_delta_trigger.id)
179114

180-
expected_trigger = self.expected_trigger.copy()
115+
expected_trigger = self.expected_triggers[0].copy()
181116
expected_trigger["actions"] = expected_actions
182117
expected_trigger["alertThreshold"] = translate_data_condition_type(
183118
detector.config.get("comparison_delta"),

0 commit comments

Comments
 (0)