async def test_run_at_startup_no_id_only_runs_once(worker): """ Without a custom job ID, and `run_at_startup=True` on two jobs, it will only execute once, since the job_id will be equal, and should only run once. """ worker: Worker = worker( cron_jobs=[ cron(foobar, minute=10, run_at_startup=True), cron(foobar, minute=20, run_at_startup=True) ], poll_delay=0.01, ) await worker.main() assert worker.jobs_complete == 1 assert worker.jobs_failed == 0 assert worker.jobs_retried == 0
async def test_job_same_function_different_id(worker): """ Set a different ID on the same function job, which runs at startup and ensure both functions are run. See next test for behaviour without setting job_id. """ worker: Worker = worker( cron_jobs=[ cron(foobar, minute=10, run_at_startup=True, job_id='custom_id'), cron(foobar, minute=20, run_at_startup=True, job_id='custom_id2'), ], poll_delay=0.01, ) await worker.main() assert worker.jobs_complete == 2 assert worker.jobs_failed == 0 assert worker.jobs_retried == 0
async def test_job_successful(worker, caplog): caplog.set_level(logging.INFO) worker: Worker = worker(cron_jobs=[cron(foobar, hour=1, run_at_startup=True)]) await worker.main() assert worker.jobs_complete == 1 assert worker.jobs_failed == 0 assert worker.jobs_retried == 0 log = re.sub(r'(\d+).\d\ds', r'\1.XXs', '\n'.join(r.message for r in caplog.records)) assert ' 0.XXs → cron:foobar()\n 0.XXs ← cron:foobar ● 42' in log
async def test_not_run(worker, caplog): caplog.set_level(logging.INFO) worker: Worker = worker(cron_jobs=[cron(foobar, hour=1, run_at_startup=False)]) await worker.main() assert worker.jobs_complete == 0 assert worker.jobs_failed == 0 assert worker.jobs_retried == 0 log = '\n'.join(r.message for r in caplog.records) assert 'cron:foobar()' not in log
async def test_job_custom_id(worker): """ Test that two different functions with the same job_id, will only be executed once. """ worker: Worker = worker( cron_jobs=[ cron(barfoo, minute=10, run_at_startup=True, job_id='singleton_job'), cron(foobar, minute=20, run_at_startup=True, job_id='singleton_job'), ], poll_delay=0.01, ) await worker.main() assert worker.jobs_complete == 1 assert worker.jobs_failed == 0 assert worker.jobs_retried == 0
async def test_job_successful_on_specific_queue(worker, caplog): caplog.set_level(logging.INFO) worker: Worker = worker( queue_name='arq:test-cron-queue', cron_jobs=[cron(foobar, hour=1, run_at_startup=True)], poll_delay=0.5) await worker.main() assert worker.jobs_complete == 1 assert worker.jobs_failed == 0 assert worker.jobs_retried == 0 log = re.sub(r'(\d+).\d\ds', r'\1.XXs', '\n'.join(r.message for r in caplog.records)) assert ' 0.XXs → cron:foobar()\n 0.XXs ← cron:foobar ● 42' in log
async def test_cron_cancelled(worker, mocker): mocker.patch.object(arq.worker, 'keep_cronjob_progress', 0.1) async def try_sleep(ctx): if ctx['job_try'] == 1: raise asyncio.CancelledError worker: Worker = worker( cron_jobs=[ cron(try_sleep, microsecond=20, run_at_startup=True, max_tries=2) ], poll_delay=0.01, ) await worker.main() assert worker.jobs_complete == 1 assert worker.jobs_retried == 1 assert worker.jobs_failed == 0
async def test_job_successful(worker, caplog, arq_redis, poll_delay): caplog.set_level(logging.INFO) worker: Worker = worker( cron_jobs=[cron(foobar, hour=1, run_at_startup=True)], poll_delay=poll_delay) await worker.main() assert worker.jobs_complete == 1 assert worker.jobs_failed == 0 assert worker.jobs_retried == 0 log = re.sub(r'(\d+).\d\ds', r'\1.XXs', '\n'.join(r.message for r in caplog.records)) assert ' 0.XXs → cron:foobar()\n 0.XXs ← cron:foobar ● 42' in log # Assert the in-progress key still exists. keys = await arq_redis.keys(in_progress_key_prefix + '*') assert len(keys) == 1 assert await arq_redis.pttl(keys[0]) > 0.0
async def test_str_function(): cj = cron('asyncio.sleep', hour=1, run_at_startup=True) assert str(cj).startswith( '<CronJob name=cron:asyncio.sleep coroutine=<function sleep at')
async def test_repr(): cj = cron(foobar, hour=1, run_at_startup=True) assert str(cj).startswith( '<CronJob name=cron:foobar coroutine=<function foobar at')
async def test_str_function(): cj = cron('asyncio.sleep', hour=1, run_at_startup=True) assert str(cj).startswith('<CronJob name=cron:asyncio.sleep coroutine=<function sleep at')
async def test_repr(): cj = cron(foobar, hour=1, run_at_startup=True) assert str(cj).startswith('<CronJob name=cron:foobar coroutine=<function foobar at')