def test_average_duration_returns_correct_value(self, rf, request): now = timezone.now() run_time = now - timedelta(seconds=60) job = DjangoJob.objects.create(id="test_job", next_run_time=run_time) request.addfinalizer(job.delete) DjangoJobExecution.objects.create( job=job, status=DjangoJobExecution.SUCCESS, run_time=run_time - timedelta(seconds=60), duration=5, finished=(run_time + timedelta(seconds=5)).timestamp(), ) # Old job execution DjangoJobExecution.objects.create( job=job, status=DjangoJobExecution.SUCCESS, run_time=run_time, duration=10, finished=(run_time + timedelta(seconds=10)).timestamp(), ) # Most recent job execution admin = DjangoJobAdmin(DjangoJob, None) admin.get_queryset(rf.get("/admin/django_apscheduler/djangojob")) assert admin.average_duration(job) == 7.5
def test_run_selected_jobs_enforces_timeout(self, rf, monkeypatch): monkeypatch.setattr(settings, "APSCHEDULER_RUN_NOW_TIMEOUT", 1) # Shorten timeout to reduce test runtime scheduler = BackgroundScheduler() scheduler.add_jobstore(DjangoJobStore()) scheduler.start() job = scheduler.add_job(print, trigger="interval", seconds=60) admin = DjangoJobAdmin(DjangoJob, None) r = rf.get("/django_apscheduler/djangojob/") # Add support for Django messaging framework r._messages = mock.MagicMock(BaseStorage) r._messages.add = mock.MagicMock() with mock.patch( "django_apscheduler.admin.BackgroundScheduler.add_listener"): admin.run_selected_jobs(r, DjangoJob.objects.filter(id=job.id)) assert DjangoJobExecution.objects.count() == 0 r._messages.add.assert_called_with( 40, format_html( "Maximum runtime of {} seconds exceeded! Not all jobs could be completed successfully. " "Pending jobs: {}", admin._job_execution_timeout, ",".join({job.id}), ), "", ) scheduler.shutdown()
def test_run_selected_jobs_creates_job_execution_entry( self, rf, monkeypatch): monkeypatch.setattr(settings, "APSCHEDULER_RUN_NOW_TIMEOUT", 1) # Shorten timeout to reduce test runtime scheduler = BackgroundScheduler() scheduler.add_jobstore(DjangoJobStore()) scheduler.start() job = scheduler.add_job(print, trigger="interval", seconds=60) admin = DjangoJobAdmin(DjangoJob, None) r = rf.get("/django_apscheduler/djangojob/") # Add support for Django messaging framework r._messages = mock.MagicMock(BaseStorage) r._messages.add = mock.MagicMock() assert not DjangoJobExecution.objects.filter(job_id=job.id).exists() admin.run_selected_jobs(r, DjangoJob.objects.filter(id=job.id)) assert DjangoJobExecution.objects.filter(job_id=job.id).exists() r._messages.add.assert_called_with(20, f"Executed job '{job.id}'!", "") scheduler.shutdown()
def test_local_run_time_returns_paused_if_no_run_time_scheduled(self, rf, request): job = DjangoJob.objects.create(id="test_job") request.addfinalizer(job.delete) admin = DjangoJobAdmin(DjangoJob, None) admin.get_queryset(rf.get("/admin/django_apscheduler/djangojob")) assert admin.local_run_time(job) == "(paused)"
def test_average_duration_no_executions_shows_none_text(self, request): now = timezone.now() run_time = now - timedelta(seconds=60) job = DjangoJob.objects.create(id="test_job", next_run_time=run_time) request.addfinalizer(job.delete) admin = DjangoJobAdmin(DjangoJob, None) admin.get_queryset(request) assert admin.average_duration(job) == "None"
def test_run_selected_jobs_job_not_found_skips_execution(self, rf): scheduler = BackgroundScheduler() scheduler.add_jobstore(DjangoJobStore()) scheduler.start() job = DjangoJob.objects.create(id="test_job") admin = DjangoJobAdmin(DjangoJob, None) r = rf.get("/django_apscheduler/djangojob/") # Add support for Django messaging framework r._messages = mock.MagicMock(BaseStorage) r._messages.add = mock.MagicMock() admin.run_selected_jobs(r, DjangoJob.objects.filter(id=job.id)) assert DjangoJobExecution.objects.count() == 0 r._messages.add.assert_called_with( 30, "Could not find job test_job in the database! Skipping execution...", "" ) scheduler.shutdown()