|
6 | 6 | from sentry.notifications.models.notificationaction import ActionTarget
|
7 | 7 | from sentry.testutils.cases import APITestCase
|
8 | 8 | from sentry.testutils.silo import region_silo_test
|
9 |
| -from sentry.workflow_engine.models import Action, Workflow, WorkflowDataConditionGroup |
10 |
| -from sentry.workflow_engine.models.detector_workflow import DetectorWorkflow |
11 |
| -from sentry.workflow_engine.models.workflow_fire_history import WorkflowFireHistory |
| 9 | +from sentry.workflow_engine.models import ( |
| 10 | + Action, |
| 11 | + DetectorWorkflow, |
| 12 | + Workflow, |
| 13 | + WorkflowDataConditionGroup, |
| 14 | + WorkflowFireHistory, |
| 15 | +) |
12 | 16 |
|
13 | 17 |
|
14 | 18 | class OrganizationWorkflowAPITestCase(APITestCase):
|
@@ -40,6 +44,7 @@ def setUp(self) -> None:
|
40 | 44 | workflow=workflow,
|
41 | 45 | group=self.group,
|
42 | 46 | event_id=self.event.event_id,
|
| 47 | + is_single_written=True, |
43 | 48 | )
|
44 | 49 |
|
45 | 50 | def test_simple(self) -> None:
|
@@ -190,6 +195,13 @@ def test_sort_by_actions(self) -> None:
|
190 | 195 | ][0]
|
191 | 196 |
|
192 | 197 | def test_sort_by_last_triggered(self) -> None:
|
| 198 | + # Fresh fire for self.workflow that would impact sorting if not ignored. |
| 199 | + WorkflowFireHistory.objects.create( |
| 200 | + workflow=self.workflow, |
| 201 | + group=self.group, |
| 202 | + event_id=self.event.event_id, |
| 203 | + is_single_written=False, |
| 204 | + ) |
193 | 205 | response = self.get_success_response(
|
194 | 206 | self.organization.slug, qs_params={"sortBy": "lastTriggered"}
|
195 | 207 | )
|
@@ -325,6 +337,53 @@ def test_query_filter_by_action(self) -> None:
|
325 | 337 | assert len(response3.data) == 2
|
326 | 338 | assert {self.workflow.name, self.workflow_two.name} == {w["name"] for w in response3.data}
|
327 | 339 |
|
| 340 | + def test_sort_by_last_triggered_with_non_single_written_only(self) -> None: |
| 341 | + workflow_never_fired = self.create_workflow( |
| 342 | + organization_id=self.organization.id, name="Never Fired" |
| 343 | + ) |
| 344 | + |
| 345 | + workflow_non_single_written_only = self.create_workflow( |
| 346 | + organization_id=self.organization.id, name="Non Single Written Only" |
| 347 | + ) |
| 348 | + WorkflowFireHistory.objects.create( |
| 349 | + workflow=workflow_non_single_written_only, |
| 350 | + group=self.group, |
| 351 | + event_id=self.event.event_id, |
| 352 | + is_single_written=False, |
| 353 | + ) |
| 354 | + |
| 355 | + # Test ascending order (lastTriggered) |
| 356 | + response = self.get_success_response( |
| 357 | + self.organization.slug, qs_params={"sortBy": "lastTriggered"} |
| 358 | + ) |
| 359 | + |
| 360 | + # Workflows without single-written history should come first, then those with it |
| 361 | + expected_ascending_order = [ |
| 362 | + self.workflow_three.name, |
| 363 | + workflow_never_fired.name, |
| 364 | + workflow_non_single_written_only.name, |
| 365 | + self.workflow.name, |
| 366 | + self.workflow_two.name, |
| 367 | + ] |
| 368 | + |
| 369 | + assert [w["name"] for w in response.data] == expected_ascending_order |
| 370 | + |
| 371 | + # Test descending order (-lastTriggered) |
| 372 | + response_desc = self.get_success_response( |
| 373 | + self.organization.slug, qs_params={"sortBy": "-lastTriggered"} |
| 374 | + ) |
| 375 | + |
| 376 | + # In descending order, workflows with single-written history should come first |
| 377 | + expected_descending_order = [ |
| 378 | + self.workflow_two.name, |
| 379 | + self.workflow.name, |
| 380 | + workflow_non_single_written_only.name, |
| 381 | + workflow_never_fired.name, |
| 382 | + self.workflow_three.name, |
| 383 | + ] |
| 384 | + |
| 385 | + assert [w["name"] for w in response_desc.data] == expected_descending_order |
| 386 | + |
328 | 387 | def test_compound_query(self) -> None:
|
329 | 388 | self.create_detector_workflow(
|
330 | 389 | workflow=self.workflow, detector=self.create_detector(project=self.project)
|
|
0 commit comments