|
6 | 6 | from scheduler.helpers.queues import get_queue |
7 | 7 | from scheduler.tests.jobs import test_job |
8 | 8 | from scheduler.tests.test_views.base import BaseTestCase |
| 9 | +from scheduler.tests.testtools import task_factory |
| 10 | +from scheduler.models import TaskType, Task |
9 | 11 |
|
10 | 12 |
|
11 | 13 | class QueueRegistryJobsViewTest(BaseTestCase): |
@@ -90,3 +92,51 @@ def test_started_jobs(self): |
90 | 92 | registry.add(queue.connection, job.name, time.time() + 20) |
91 | 93 | res = self.client.get(reverse("queue_registry_jobs", args=[queue_name, "active"])) |
92 | 94 | self.assertEqual(res.context["jobs"], [job]) |
| 95 | + |
| 96 | + def test_missing_task_doesnt_crash_job_detail_page(self): |
| 97 | + """ |
| 98 | + Ensure that when a Task gets deleted and its Job doesn't get cleaned, the |
| 99 | + job detail page doesn't raise an exception. |
| 100 | + """ |
| 101 | + queue_name = "django_tasks_scheduler_test" |
| 102 | + |
| 103 | + # No jobs in the queue |
| 104 | + res = self.client.get(reverse("queue_registry_jobs", args=[queue_name, "scheduled"])) |
| 105 | + self.assertEqual(res.status_code, 200) |
| 106 | + self.assertEqual(res.context["jobs"], []) |
| 107 | + |
| 108 | + task = task_factory(TaskType.ONCE, queue="django_tasks_scheduler_test") |
| 109 | + |
| 110 | + res = self.client.get(reverse("queue_registry_jobs", args=[queue_name, "scheduled"])) |
| 111 | + self.assertEqual(res.status_code, 200) |
| 112 | + job = res.context["jobs"][0] |
| 113 | + self.assertTrue(job) |
| 114 | + self.assertTrue(job.is_scheduled_task) |
| 115 | + self.assertEqual(job.scheduled_task_id, task.pk) |
| 116 | + |
| 117 | + # Job detail page works |
| 118 | + url = reverse("job_details", args=[job.name]) |
| 119 | + res = self.client.get(url) |
| 120 | + self.assertEqual(200, res.status_code) |
| 121 | + self.assertIn("job", res.context) |
| 122 | + self.assertEqual(res.context["job"], job) |
| 123 | + self.assertNotContains(res, "ValueError('Invalid task type OnceTaskType')") |
| 124 | + self.assertContains(res, "Link to scheduled job") |
| 125 | + |
| 126 | + # Delete all tasks in bulk, this doesn't trigger the signal |
| 127 | + # that would delete the corresponding scheduled jobs. |
| 128 | + Task.objects.all().delete() |
| 129 | + |
| 130 | + # The job lingers around :( |
| 131 | + res = self.client.get(reverse("queue_registry_jobs", args=[queue_name, "scheduled"])) |
| 132 | + self.assertEqual(res.status_code, 200) |
| 133 | + self.assertTrue(job in res.context["jobs"]) |
| 134 | + |
| 135 | + # Job detail does't raise a 500 |
| 136 | + url = reverse("job_details", args=[job.name]) |
| 137 | + res = self.client.get(url) |
| 138 | + self.assertEqual(200, res.status_code) |
| 139 | + self.assertIn("job", res.context) |
| 140 | + self.assertEqual(res.context["job"], job) |
| 141 | + self.assertContains(res, "ValueError('Invalid task type OnceTaskType')") |
| 142 | + self.assertNotContains(res, "Link to scheduled job") |
0 commit comments