Skip to content

Commit 4d27451

Browse files
authored
fix(typing): Type tests.sentry.workflow_engine.endpoints (#103103)
Mostly just adding missing types / generics.
1 parent 65f6034 commit 4d27451

20 files changed

+84
-58
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -863,7 +863,7 @@ module = [
863863
"tests.sentry.web.frontend.generic.*",
864864
"tests.sentry.web.frontend.test_cli",
865865
"tests.sentry.workflow_engine.detectors.*",
866-
"tests.sentry.workflow_engine.endpoints.utils.*",
866+
"tests.sentry.workflow_engine.endpoints.*",
867867
"tests.sentry.workflow_engine.handlers.action.*",
868868
"tests.sentry.workflow_engine.models.*",
869869
"tests.sentry.workflow_engine.processors.contexts.*",

tests/sentry/workflow_engine/endpoints/serializers/test_workflow_group_history_serializer.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
1-
from datetime import timedelta
1+
from datetime import datetime, timedelta
22
from uuid import uuid4
33

44
from sentry.incidents.grouptype import MetricIssue
5+
from sentry.models.group import Group
56
from sentry.testutils.cases import TestCase
67
from sentry.testutils.helpers.datetime import before_now, freeze_time
78
from sentry.testutils.skips import requires_snuba
9+
from sentry.utils.cursors import Cursor, CursorResult
810
from sentry.workflow_engine.endpoints.serializers.workflow_group_history_serializer import (
911
WorkflowGroupHistory,
1012
fetch_workflow_groups_paginated,
1113
)
12-
from sentry.workflow_engine.models import WorkflowFireHistory
14+
from sentry.workflow_engine.models import Workflow, WorkflowFireHistory
1315

1416
pytestmark = [requires_snuba]
1517

@@ -108,8 +110,14 @@ def setUp(self) -> None:
108110
self.login_as(self.user)
109111

110112
def assert_expected_results(
111-
self, workflow, start, end, expected_results, cursor=None, per_page=25
112-
):
113+
self,
114+
workflow: Workflow,
115+
start: datetime,
116+
end: datetime,
117+
expected_results: list[WorkflowGroupHistory],
118+
cursor: Cursor | None = None,
119+
per_page: int = 25,
120+
) -> CursorResult[Group]:
113121
result = fetch_workflow_groups_paginated(workflow, start, end, cursor, per_page)
114122
assert result.results == expected_results, (result.results, expected_results)
115123
return result

tests/sentry/workflow_engine/endpoints/test_organization_data_condition_index.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from dataclasses import dataclass
2+
from typing import Any
23
from unittest.mock import patch
34

45
from sentry.testutils.cases import APITestCase
@@ -14,7 +15,9 @@ class OrganizationDataConditionAPITestCase(APITestCase):
1415
def setUp(self) -> None:
1516
super().setUp()
1617
self.login_as(user=self.user)
17-
self.registry = Registry[type[DataConditionHandler]](enable_reverse_lookup=False)
18+
self.registry = Registry[type[DataConditionHandler[dict[str, Any]]]](
19+
enable_reverse_lookup=False
20+
)
1821
self.registry_patcher = patch(
1922
"sentry.workflow_engine.endpoints.organization_data_condition_index.condition_handler_registry",
2023
new=self.registry,
@@ -23,13 +26,13 @@ def setUp(self) -> None:
2326

2427
@self.registry.register(Condition.REAPPEARED_EVENT)
2528
@dataclass(frozen=True)
26-
class TestWorkflowTrigger(DataConditionHandler):
29+
class TestWorkflowTrigger(DataConditionHandler[dict[str, str]]):
2730
group = DataConditionHandler.Group.WORKFLOW_TRIGGER
2831
comparison_json_schema = {"type": "boolean"}
2932

3033
@self.registry.register(Condition.AGE_COMPARISON)
3134
@dataclass(frozen=True)
32-
class TestActionFilter(DataConditionHandler):
35+
class TestActionFilter(DataConditionHandler[dict[str, Any]]):
3336
group = DataConditionHandler.Group.ACTION_FILTER
3437
subgroup = DataConditionHandler.Subgroup.ISSUE_ATTRIBUTES
3538
comparison_json_schema = {
@@ -43,20 +46,20 @@ class TestActionFilter(DataConditionHandler):
4346

4447
@self.registry.register(Condition.ANOMALY_DETECTION)
4548
@dataclass(frozen=True)
46-
class TestDetectorTrigger(DataConditionHandler):
49+
class TestDetectorTrigger(DataConditionHandler[dict[str, str]]):
4750
group = DataConditionHandler.Group.DETECTOR_TRIGGER
4851
comparison_json_schema = {"type": "boolean"}
4952

5053
# This legacy condition should not be included in the response
5154
@self.registry.register(Condition.EXISTING_HIGH_PRIORITY_ISSUE)
5255
@dataclass(frozen=True)
53-
class TestIgnoredCondition(DataConditionHandler):
56+
class TestIgnoredCondition(DataConditionHandler[dict[str, str]]):
5457
group = DataConditionHandler.Group.WORKFLOW_TRIGGER
5558
comparison_json_schema = {"type": "boolean"}
5659

5760
@self.registry.register(Condition.ISSUE_CATEGORY)
5861
@dataclass(frozen=True)
59-
class TestIssueCategoryCondition(DataConditionHandler):
62+
class TestIssueCategoryCondition(DataConditionHandler[dict[str, Any]]):
6063
group = DataConditionHandler.Group.ACTION_FILTER
6164
subgroup = DataConditionHandler.Subgroup.ISSUE_ATTRIBUTES
6265
comparison_json_schema = {

tests/sentry/workflow_engine/endpoints/test_organization_detector_details.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -195,22 +195,22 @@ def setUp(self) -> None:
195195
}
196196
assert SnubaQuery.objects.get(id=self.snuba_query.id)
197197

198-
def assert_detector_updated(self, detector):
198+
def assert_detector_updated(self, detector: Detector) -> None:
199199
assert detector.name == "Updated Detector"
200200
assert detector.type == MetricIssue.slug
201201
assert detector.project_id == self.project.id
202202

203-
def assert_condition_group_updated(self, condition_group):
203+
def assert_condition_group_updated(self, condition_group: DataConditionGroup | None) -> None:
204204
assert condition_group
205205
assert condition_group.logic_type == DataConditionGroup.Type.ANY
206206
assert condition_group.organization_id == self.organization.id
207207

208-
def assert_data_condition_updated(self, condition):
208+
def assert_data_condition_updated(self, condition: DataCondition) -> None:
209209
assert condition.type == Condition.GREATER.value
210210
assert condition.comparison == 100
211211
assert condition.condition_result == DetectorPriorityLevel.HIGH
212212

213-
def assert_snuba_query_updated(self, snuba_query):
213+
def assert_snuba_query_updated(self, snuba_query: SnubaQuery) -> None:
214214
assert snuba_query.query == "updated query"
215215
assert snuba_query.time_window == 300
216216

@@ -717,7 +717,7 @@ class OrganizationDetectorDetailsDeleteTest(OrganizationDetectorDetailsBaseTest)
717717
@mock.patch(
718718
"sentry.workflow_engine.endpoints.organization_detector_details.schedule_update_project_config"
719719
)
720-
def test_simple(self, mock_schedule_update_project_config) -> None:
720+
def test_simple(self, mock_schedule_update_project_config: mock.MagicMock) -> None:
721721
with outbox_runner():
722722
self.get_success_response(self.organization.slug, self.detector.id)
723723

tests/sentry/workflow_engine/endpoints/test_organization_detector_index.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -833,7 +833,9 @@ def test_without_feature_flag(self) -> None:
833833
@mock.patch("sentry.incidents.metric_issue_detector.schedule_update_project_config")
834834
@mock.patch("sentry.workflow_engine.endpoints.validators.base.detector.create_audit_entry")
835835
def test_valid_creation(
836-
self, mock_audit: mock.MagicMock, mock_schedule_update_project_config
836+
self,
837+
mock_audit: mock.MagicMock,
838+
mock_schedule_update_project_config: mock.MagicMock,
837839
) -> None:
838840
with self.tasks():
839841
response = self.get_success_response(

tests/sentry/workflow_engine/endpoints/test_organization_detector_types.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from dataclasses import dataclass
2+
from typing import Never
23
from unittest.mock import patch
34

45
from sentry.incidents.grouptype import MetricIssue
@@ -38,22 +39,22 @@ def setUp(self) -> None:
3839
)
3940
self.registry_patcher.start()
4041

41-
class MockDetectorHandler(DetectorHandler[dict, bool]):
42+
class MockDetectorHandler(DetectorHandler[dict[Never, Never], bool]):
4243
def evaluate(
43-
self, data_packet: DataPacket[dict]
44+
self, data_packet: DataPacket[dict[Never, Never]]
4445
) -> dict[DetectorGroupKey, DetectorEvaluationResult]:
4546
return {None: DetectorEvaluationResult(None, True, DetectorPriorityLevel.HIGH)}
4647

47-
def extract_value(self, data_packet: DataPacket[dict]) -> bool:
48+
def extract_value(self, data_packet: DataPacket[dict[Never, Never]]) -> bool:
4849
return True
4950

50-
def extract_dedupe_value(self, data_packet: DataPacket[dict]) -> int:
51+
def extract_dedupe_value(self, data_packet: DataPacket[dict[Never, Never]]) -> int:
5152
return 1
5253

5354
def create_occurrence(
5455
self,
5556
evaluation_result: ProcessedDataConditionGroup,
56-
data_packet: DataPacket[dict],
57+
data_packet: DataPacket[dict[Never, Never]],
5758
priority: DetectorPriorityLevel,
5859
) -> tuple[DetectorOccurrence, EventData]:
5960
return (

tests/sentry/workflow_engine/endpoints/test_organization_open_periods.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def setUp(self) -> None:
4242
value=self.group.priority,
4343
)
4444

45-
def get_url_args(self):
45+
def get_url_args(self) -> list[str]:
4646
return [self.organization.slug]
4747

4848
def test_no_group_link(self) -> None:

tests/sentry/workflow_engine/endpoints/test_organization_test_fire_action.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,11 @@ def setup_pd_service(self) -> PagerDutyServiceDict:
6767
return_value=PagerDutyIssueAlertHandler,
6868
)
6969
def test_pagerduty_action(
70-
self, mock_get_issue_alert_handler, mock_get_group_type_handler, mock_send_trigger
71-
):
70+
self,
71+
mock_get_issue_alert_handler: mock.MagicMock,
72+
mock_get_group_type_handler: mock.MagicMock,
73+
mock_send_trigger: mock.MagicMock,
74+
) -> None:
7275
"""Test a PagerDuty action"""
7376
service_info = self.setup_pd_service()
7477

@@ -90,6 +93,7 @@ def test_pagerduty_action(
9093
assert response.status_code == 200
9194
assert mock_send_trigger.call_count == 1
9295
pagerduty_data = mock_send_trigger.call_args.kwargs.get("data")
96+
assert pagerduty_data is not None
9397
assert pagerduty_data["payload"]["summary"].startswith("[Test Detector]:")
9498

9599
@mock.patch.object(NotifyEventAction, "after")
@@ -102,8 +106,11 @@ def test_pagerduty_action(
102106
return_value=PluginIssueAlertHandler,
103107
)
104108
def test_plugin_notify_event_action(
105-
self, mock_get_issue_alert_handler, mock_get_group_type_handler, mock_after
106-
):
109+
self,
110+
mock_get_issue_alert_handler: mock.MagicMock,
111+
mock_get_group_type_handler: mock.MagicMock,
112+
mock_after: mock.MagicMock,
113+
) -> None:
107114
"""Test a Plugin action (NotifyEventAction)"""
108115
action_data = [
109116
{
@@ -214,8 +221,8 @@ def test_no_projects_available(self) -> None:
214221
)
215222
@mock.patch("sentry.integrations.slack.actions.form.get_channel_id")
216223
def test_updates_action_with_validated_data(
217-
self, mock_get_channel_id, mock_send_test_notification
218-
):
224+
self, mock_get_channel_id: mock.MagicMock, mock_send_test_notification: mock.MagicMock
225+
) -> None:
219226
self.integration, self.org_integration = self.create_provider_integration_for(
220227
provider="slack",
221228
organization=self.organization,

tests/sentry/workflow_engine/endpoints/test_organization_workflow_details.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ def test_update_detectors_no_changes(self) -> None:
389389
class OrganizationDeleteWorkflowTest(OrganizationWorkflowDetailsBaseTest, BaseWorkflowTest):
390390
method = "DELETE"
391391

392-
def tasks(self) -> AbstractContextManager:
392+
def tasks(self) -> AbstractContextManager[None]:
393393
return TaskRunner()
394394

395395
def setUp(self) -> None:

tests/sentry/workflow_engine/endpoints/test_validators.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from typing import Any
12
from unittest import mock
23

34
import pytest
@@ -67,7 +68,7 @@ class Meta:
6768
"field2",
6869
]
6970

70-
def create_source(self, validated_data) -> MockModel:
71+
def create_source(self, validated_data: Any) -> MockModel:
7172
return MockModel.objects.create()
7273

7374

@@ -95,7 +96,7 @@ class MockDataConditionValidator(MetricIssueComparisonConditionValidator):
9596
class MockConditionGroupValidator(BaseDataConditionGroupValidator):
9697
conditions = serializers.ListField(required=True)
9798

98-
def validate_conditions(self, value) -> list:
99+
def validate_conditions(self, value: list[dict[str, Any]]) -> list[dict[str, Any]]:
99100
for condition in value:
100101
MockDataConditionValidator(data=condition).is_valid(raise_exception=True)
101102

0 commit comments

Comments
 (0)