@@ -416,6 +416,69 @@ async def test_task_retry_exponential_policy(task_queue, queue_checker, freezer)
416
416
await queue_checker .assert_metric_requeued (3 )
417
417
418
418
419
+ @pytest .mark .asyncio
420
+ async def test_task_retry_every_x_policy (task_queue , queue_checker , freezer ):
421
+ task_1 = await task_queue .add_task (
422
+ {"key" : "value" }, retry_policy = RetryPolicy .FIXED_INTERVAL , retry_delay = 4
423
+ )
424
+ assert isinstance (task_1 .id , str )
425
+ await queue_checker .assert_state (task_1 .id , TaskState .QUEUED )
426
+
427
+ await queue_checker .assert_pending_count (1 )
428
+ await queue_checker .assert_processing_count (0 )
429
+
430
+ task = await task_queue .get_task ()
431
+ await queue_checker .assert_pending_count (0 )
432
+ await queue_checker .assert_processing_count (1 )
433
+ await queue_checker .assert_state (task_1 .id , TaskState .PROCESSING )
434
+
435
+ await task_queue .auto_reschedule_task (task )
436
+ await queue_checker .assert_pending_count (1 )
437
+ await queue_checker .assert_processing_count (0 )
438
+ await queue_checker .assert_state (task_1 .id , TaskState .REQUEUED )
439
+
440
+ # Task is not immediately available
441
+ task = await task_queue .get_task ()
442
+ assert task is None
443
+
444
+ # Task is not available after 3 seconds
445
+ freezer .tick (3 )
446
+ task = await task_queue .get_task ()
447
+ assert task is None
448
+
449
+ # Task is available after 5 seconds
450
+ freezer .tick (4 )
451
+ task = await task_queue .get_task ()
452
+ assert task is not None
453
+ await queue_checker .assert_pending_count (0 )
454
+ await queue_checker .assert_processing_count (1 )
455
+ await queue_checker .assert_state (task_1 .id , TaskState .PROCESSING )
456
+ await task_queue .auto_reschedule_task (task )
457
+
458
+ await queue_checker .assert_metric_added (1 )
459
+ await queue_checker .assert_metric_taken (2 )
460
+ await queue_checker .assert_metric_requeued (2 )
461
+
462
+ # Second retry - task is not available after 3 seconds
463
+ freezer .tick (3 )
464
+ task = await task_queue .get_task ()
465
+ assert task is None
466
+
467
+ # Task is available after 4 seconds
468
+ freezer .tick (1 )
469
+ task = await task_queue .get_task ()
470
+ assert task is not None
471
+ await queue_checker .assert_pending_count (0 )
472
+ await queue_checker .assert_processing_count (1 )
473
+ await queue_checker .assert_state (task_1 .id , TaskState .PROCESSING )
474
+ await task_queue .auto_reschedule_task (task )
475
+
476
+ await queue_checker .assert_metric_added (1 )
477
+ await queue_checker .assert_metric_taken (3 )
478
+ await queue_checker .assert_metric_requeued (3 )
479
+
480
+
481
+
419
482
@pytest .mark .asyncio
420
483
async def test_task_retry_forced (task_queue , queue_checker , freezer ):
421
484
task_1 = await task_queue .add_task (
0 commit comments