|
1 | 1 | from datetime import datetime, timedelta |
| 2 | +import mock |
| 3 | + |
| 4 | +import freezegun |
2 | 5 | from django.core.management import call_command, CommandError |
3 | 6 | from django.test import TestCase |
4 | 7 | from django.test.utils import override_settings |
5 | | -from django_dbq.management.commands.worker import process_job |
| 8 | +from django.utils import timezone |
| 9 | + |
| 10 | +from django_dbq.management.commands.worker import process_job, Worker |
6 | 11 | from django_dbq.models import Job |
7 | 12 | try: |
8 | 13 | from StringIO import StringIO |
@@ -77,6 +82,39 @@ def test_worker_with_queue_name(self): |
77 | 82 | self.assertTrue('test_queue' in output) |
78 | 83 |
|
79 | 84 |
|
| 85 | +@freezegun.freeze_time() |
| 86 | +@mock.patch('django_dbq.management.commands.worker.sleep') |
| 87 | +@mock.patch('django_dbq.management.commands.worker.process_job') |
| 88 | +class WorkerProcessDoWorkTestCase(TestCase): |
| 89 | + |
| 90 | + def setUp(self): |
| 91 | + super().setUp() |
| 92 | + self.MockWorker = mock.MagicMock() |
| 93 | + self.MockWorker.queue_name = 'default' |
| 94 | + self.MockWorker.rate_limit_in_seconds = 5 |
| 95 | + self.MockWorker.last_job_finished = None |
| 96 | + |
| 97 | + def test_do_work_no_previous_job_run(self, mock_process_job, mock_sleep): |
| 98 | + Worker.do_work(self.MockWorker) |
| 99 | + self.assertEqual(mock_sleep.call_count, 1) |
| 100 | + self.assertEqual(mock_process_job.call_count, 1) |
| 101 | + self.assertEqual(self.MockWorker.last_job_finished, timezone.now()) |
| 102 | + |
| 103 | + def test_do_work_previous_job_too_soon(self, mock_process_job, mock_sleep): |
| 104 | + self.MockWorker.last_job_finished = timezone.now() - timezone.timedelta(seconds=2) |
| 105 | + Worker.do_work(self.MockWorker) |
| 106 | + self.assertEqual(mock_sleep.call_count, 1) |
| 107 | + self.assertEqual(mock_process_job.call_count, 0) |
| 108 | + self.assertEqual(self.MockWorker.last_job_finished, timezone.now() - timezone.timedelta(seconds=2)) |
| 109 | + |
| 110 | + def test_do_work_previous_job_long_time_ago(self, mock_process_job, mock_sleep): |
| 111 | + self.MockWorker.last_job_finished = timezone.now() - timezone.timedelta(seconds=7) |
| 112 | + Worker.do_work(self.MockWorker) |
| 113 | + self.assertEqual(mock_sleep.call_count, 1) |
| 114 | + self.assertEqual(mock_process_job.call_count, 1) |
| 115 | + self.assertEqual(self.MockWorker.last_job_finished, timezone.now()) |
| 116 | + |
| 117 | + |
80 | 118 | @override_settings(JOBS={'testjob': {'tasks': ['a']}}) |
81 | 119 | class JobTestCase(TestCase): |
82 | 120 |
|
|
0 commit comments