diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test_schedulers.py | 85 | ||||
-rw-r--r-- | tests/test_workers.py | 18 |
2 files changed, 89 insertions, 14 deletions
diff --git a/tests/test_schedulers.py b/tests/test_schedulers.py index 6a45b8b..5f1a7df 100644 --- a/tests/test_schedulers.py +++ b/tests/test_schedulers.py @@ -1,12 +1,15 @@ import threading +import time from datetime import datetime, timezone import anyio import pytest from anyio import fail_after +from apscheduler.enums import JobOutcome from apscheduler.events import ( Event, JobAdded, ScheduleAdded, ScheduleRemoved, SchedulerStarted, SchedulerStopped, TaskAdded) +from apscheduler.exceptions import JobLookupError from apscheduler.schedulers.async_ import AsyncScheduler from apscheduler.schedulers.sync import Scheduler from apscheduler.triggers.date import DateTrigger @@ -14,12 +17,20 @@ from apscheduler.triggers.date import DateTrigger pytestmark = pytest.mark.anyio -async def dummy_async_job(): - return 'returnvalue' +async def dummy_async_job(delay: float = 0, fail: bool = False) -> str: + await anyio.sleep(delay) + if fail: + raise RuntimeError('failing as requested') + else: + return 'returnvalue' -def dummy_sync_job(): - return 'returnvalue' +def dummy_sync_job(delay: float = 0, fail: bool = False) -> str: + time.sleep(delay) + if fail: + raise RuntimeError('failing as requested') + else: + return 'returnvalue' class TestAsyncScheduler: @@ -72,6 +83,39 @@ class TestAsyncScheduler: # There should be no more events on the list assert not received_events + async def test_get_job_result_success(self) -> None: + async with AsyncScheduler() as scheduler: + job_id = await scheduler.add_job(dummy_async_job, kwargs={'delay': 0.2}) + result = await scheduler.get_job_result(job_id) + assert result.job_id == job_id + assert result.outcome is JobOutcome.success + assert result.return_value == 'returnvalue' + + async def test_get_job_result_error(self) -> None: + async with AsyncScheduler() as scheduler: + job_id = await scheduler.add_job(dummy_async_job, kwargs={'delay': 0.2, 'fail': True}) + result = await scheduler.get_job_result(job_id) + assert result.job_id == job_id + assert result.outcome is JobOutcome.error + assert isinstance(result.exception, RuntimeError) + assert str(result.exception) == 'failing as requested' + + async def test_get_job_result_nowait_not_yet_ready(self) -> None: + async with AsyncScheduler() as scheduler: + job_id = await scheduler.add_job(dummy_async_job, kwargs={'delay': 0.2}) + with pytest.raises(JobLookupError): + await scheduler.get_job_result(job_id, wait=False) + + async def test_run_job_success(self) -> None: + async with AsyncScheduler() as scheduler: + return_value = await scheduler.run_job(dummy_async_job) + assert return_value == 'returnvalue' + + async def test_run_job_failure(self) -> None: + async with AsyncScheduler() as scheduler: + with pytest.raises(RuntimeError, match='failing as requested'): + await scheduler.run_job(dummy_async_job, kwargs={'fail': True}) + class TestSyncScheduler: def test_schedule_job(self): @@ -102,7 +146,6 @@ class TestSyncScheduler: received_event = received_events.pop(0) assert isinstance(received_event, ScheduleAdded) assert received_event.schedule_id == 'foo' - # assert received_event.task_id == 'task_id' # Then that schedule was processed and a job was added for it received_event = received_events.pop(0) @@ -121,3 +164,35 @@ class TestSyncScheduler: # There should be no more events on the list assert not received_events + + def test_get_job_result(self) -> None: + with Scheduler() as scheduler: + job_id = scheduler.add_job(dummy_sync_job) + result = scheduler.get_job_result(job_id) + assert result.outcome is JobOutcome.success + assert result.return_value == 'returnvalue' + + def test_get_job_result_error(self) -> None: + with Scheduler() as scheduler: + job_id = scheduler.add_job(dummy_sync_job, kwargs={'delay': 0.2, 'fail': True}) + result = scheduler.get_job_result(job_id) + assert result.job_id == job_id + assert result.outcome is JobOutcome.error + assert isinstance(result.exception, RuntimeError) + assert str(result.exception) == 'failing as requested' + + def test_get_job_result_nowait_not_yet_ready(self) -> None: + with Scheduler() as scheduler: + job_id = scheduler.add_job(dummy_sync_job, kwargs={'delay': 0.2}) + with pytest.raises(JobLookupError): + scheduler.get_job_result(job_id, wait=False) + + def test_run_job_success(self) -> None: + with Scheduler() as scheduler: + return_value = scheduler.run_job(dummy_sync_job) + assert return_value == 'returnvalue' + + def test_run_job_failure(self) -> None: + with Scheduler() as scheduler: + with pytest.raises(RuntimeError, match='failing as requested'): + scheduler.run_job(dummy_sync_job, kwargs={'fail': True}) diff --git a/tests/test_workers.py b/tests/test_workers.py index 74a018c..872cf34 100644 --- a/tests/test_workers.py +++ b/tests/test_workers.py @@ -10,7 +10,7 @@ from apscheduler.abc import Job from apscheduler.datastores.memory import MemoryDataStore from apscheduler.enums import JobOutcome from apscheduler.events import ( - Event, JobAdded, JobEnded, JobStarted, TaskAdded, WorkerStarted, WorkerStopped) + Event, JobAcquired, JobAdded, JobReleased, TaskAdded, WorkerStarted, WorkerStopped) from apscheduler.structures import Task from apscheduler.workers.async_ import AsyncWorker from apscheduler.workers.sync import Worker @@ -75,7 +75,7 @@ class TestAsyncWorker: # Then the job was started received_event = received_events.pop(0) - assert isinstance(received_event, JobStarted) + assert isinstance(received_event, JobAcquired) assert received_event.job_id == job.id assert received_event.task_id == 'task_id' assert received_event.schedule_id is None @@ -83,11 +83,11 @@ class TestAsyncWorker: received_event = received_events.pop(0) if fail: # Then the job failed - assert isinstance(received_event, JobEnded) + assert isinstance(received_event, JobReleased) assert received_event.outcome is JobOutcome.error else: # Then the job finished successfully - assert isinstance(received_event, JobEnded) + assert isinstance(received_event, JobReleased) assert received_event.outcome is JobOutcome.success # Finally, the worker was stopped @@ -136,7 +136,7 @@ class TestAsyncWorker: # Then the deadline was missed received_event = received_events.pop(0) - assert isinstance(received_event, JobEnded) + assert isinstance(received_event, JobReleased) assert received_event.outcome is JobOutcome.missed_start_deadline assert received_event.job_id == job.id assert received_event.task_id == 'task_id' @@ -187,7 +187,7 @@ class TestSyncWorker: # Then the job was started received_event = received_events.pop(0) - assert isinstance(received_event, JobStarted) + assert isinstance(received_event, JobAcquired) assert received_event.job_id == job.id assert received_event.task_id == 'task_id' assert received_event.schedule_id is None @@ -195,11 +195,11 @@ class TestSyncWorker: received_event = received_events.pop(0) if fail: # Then the job failed - assert isinstance(received_event, JobEnded) + assert isinstance(received_event, JobReleased) assert received_event.outcome is JobOutcome.error else: # Then the job finished successfully - assert isinstance(received_event, JobEnded) + assert isinstance(received_event, JobReleased) assert received_event.outcome is JobOutcome.success # Finally, the worker was stopped @@ -247,7 +247,7 @@ class TestSyncWorker: # Then the deadline was missed received_event = received_events.pop(0) - assert isinstance(received_event, JobEnded) + assert isinstance(received_event, JobReleased) assert received_event.outcome is JobOutcome.missed_start_deadline assert received_event.job_id == job.id assert received_event.task_id == 'task_id' |