3
3
4
4
import pytest
5
5
from celery import uuid as celery_uuid
6
+ from django .core .cache import cache
6
7
from django .utils import timezone
7
8
8
9
from apps .alerts .constants import ActionSource
9
10
from apps .alerts .models import AlertGroup , AlertGroupLogRecord
10
11
from apps .alerts .tasks import acknowledge_reminder_task
11
- from apps .alerts .tasks .acknowledge_reminder import unacknowledge_timeout_task
12
+ from apps .alerts .tasks .acknowledge_reminder import send_post_ack_reminder_message_signal , unacknowledge_timeout_task
12
13
from apps .user_management .models import Organization
13
14
14
15
TASK_ID = "TASK_ID"
@@ -156,8 +157,10 @@ def test_acknowledge_reminder_task_skip(
156
157
157
158
@patch .object (unacknowledge_timeout_task , "apply_async" )
158
159
@patch .object (acknowledge_reminder_task , "apply_async" )
160
+ @patch .object (send_post_ack_reminder_message_signal , "delay" )
159
161
@pytest .mark .django_db
160
- def test_acknowledge_reminder_task_reschedules_itself (
162
+ def test_acknowledge_reminder_task_reschedules_itself_and_sends_signal (
163
+ mock_send_post_ack_reminder_message_signal ,
161
164
mock_acknowledge_reminder_task ,
162
165
mock_unacknowledge_timeout_task ,
163
166
ack_reminder_test_setup ,
@@ -169,9 +172,6 @@ def test_acknowledge_reminder_task_reschedules_itself(
169
172
with django_capture_on_commit_callbacks (execute = True ) as callbacks :
170
173
acknowledge_reminder_task (alert_group .pk , TASK_ID )
171
174
172
- # send_alert_group_signal task is queued after commit
173
- assert len (callbacks ) == 1
174
-
175
175
mock_unacknowledge_timeout_task .assert_not_called ()
176
176
mock_acknowledge_reminder_task .assert_called_once_with (
177
177
(alert_group .pk , TASK_ID ),
@@ -182,6 +182,10 @@ def test_acknowledge_reminder_task_reschedules_itself(
182
182
assert log_record .type == AlertGroupLogRecord .TYPE_ACK_REMINDER_TRIGGERED
183
183
assert log_record .author == alert_group .acknowledged_by_user
184
184
185
+ # send_post_ack_reminder_message_signal task is queued after commit
186
+ assert len (callbacks ) == 1
187
+ mock_send_post_ack_reminder_message_signal .assert_called_once_with (log_record .id )
188
+
185
189
186
190
@patch .object (unacknowledge_timeout_task , "apply_async" )
187
191
@patch .object (acknowledge_reminder_task , "apply_async" )
@@ -369,3 +373,46 @@ def test_ack_reminder_cancel_too_old(
369
373
mock_acknowledge_reminder_task .assert_not_called ()
370
374
371
375
assert not alert_group .log_records .exists ()
376
+
377
+
378
+ @pytest .mark .django_db
379
+ def test_acknowledge_reminder_skip_doubled_notification (
380
+ ack_reminder_test_setup ,
381
+ django_capture_on_commit_callbacks ,
382
+ caplog ,
383
+ ):
384
+ organization , alert_group , user = ack_reminder_test_setup (
385
+ unacknowledge_timeout = Organization .UNACKNOWLEDGE_TIMEOUT_NEVER
386
+ )
387
+ expected_log_text = f"Acknowledge reminder for alert_group { alert_group .id } has already been sent recently."
388
+
389
+ # check task lock cache doesn't exist
390
+ lock_id = f"acknowledge-reminder-lock-{ alert_group .id } "
391
+ assert cache .get (lock_id ) is None
392
+
393
+ with patch .object (acknowledge_reminder_task , "apply_async" ) as mock_acknowledge_reminder_task :
394
+ with patch .object (send_post_ack_reminder_message_signal , "delay" ) as mock_send_signal :
395
+ with django_capture_on_commit_callbacks (execute = True ):
396
+ acknowledge_reminder_task (alert_group .pk , TASK_ID )
397
+
398
+ log_record = alert_group .log_records .get ()
399
+ assert log_record .type == AlertGroupLogRecord .TYPE_ACK_REMINDER_TRIGGERED
400
+ mock_send_signal .assert_called_once_with (log_record .id )
401
+ mock_acknowledge_reminder_task .assert_called_once ()
402
+
403
+ # check task lock cache exists
404
+ assert cache .get (lock_id ) == TASK_ID
405
+
406
+ assert expected_log_text not in caplog .text
407
+
408
+ # acknowledge_reminder_task doesn't proceed the second time if it has been called recently
409
+ with patch .object (acknowledge_reminder_task , "apply_async" ) as mock_acknowledge_reminder_task :
410
+ with patch .object (send_post_ack_reminder_message_signal , "delay" ) as mock_send_signal :
411
+ with django_capture_on_commit_callbacks (execute = True ):
412
+ acknowledge_reminder_task (alert_group .pk , TASK_ID )
413
+
414
+ assert alert_group .log_records .count () == 1
415
+ mock_send_signal .assert_not_called ()
416
+ mock_acknowledge_reminder_task .assert_not_called ()
417
+
418
+ assert expected_log_text in caplog .text
0 commit comments