async def test_run_job_log_result(caplog, app, job_store): caplog.set_level("INFO") result = [] def task_func(a, b): # pylint: disable=unused-argument s = a + b result.append(s) return s task = tasks.Task(task_func, app=app, queue="yay", name="job") app.tasks = {"task_func": task} job = jobs.Job( id=16, task_kwargs={ "a": 9, "b": 3 }, lock="sherlock", task_name="task_func", queue="yay", ) test_worker = worker.Worker(app, queues=["yay"]) await test_worker.run_job(job) assert result == [12] records = [ record for record in caplog.records if record.action == "job_success" ] assert len(records) == 1 record = records[0] assert record.result == 12
def test_app_register(app): task = tasks.Task(task_func, blueprint=app, queue="queue", name="bla") app._register_task(task) assert "bla" in app.tasks assert app.tasks["bla"] == task
def test_app_register(app): task = tasks.Task(task_func, app=app, queue="queue", name="bla") app._register(task) assert app.queues == {"queue", "builtin"} assert "bla" in app.tasks assert app.tasks["bla"] == task
def test_task_init_explicit_name(app, mocker, caplog): task = tasks.Task(task_func, app=app, queue="queue", name="other") assert task.name == "other" assert [ record for record in caplog.records if record.action == "task_name_differ_from_path" ]
def test_task_get_retry_exception(app, mocker): mock = mocker.patch( "procrastinate.retry.RetryStrategy.get_retry_exception") task = tasks.Task(task_func, app=app, queue="queue", retry=10) job = task.configure().job assert task.get_retry_exception(job) is mock.return_value mock.assert_called_with(0)
def test_app_register_queue_already_exists(app): app.queues.add("queue") task = tasks.Task(task_func, app=app, queue="queue", name="bla") app._register(task) assert app.queues == {"queue", "builtin"} assert "bla" in app.tasks assert app.tasks["bla"] == task
def test_task_get_retry_exception(app, mocker): mock = mocker.patch("procrastinate.retry.RetryStrategy.get_retry_exception") task = tasks.Task(task_func, blueprint=app, queue="queue", retry=10) job = task.configure().job exception = ValueError() assert task.get_retry_exception(exception=exception, job=job) is mock.return_value mock.assert_called_with(exception=exception, attempts=0)
def test_task_configure(app): task = tasks.Task(task_func, app=app, queue="queue") job = task.configure(lock="sher", task_kwargs={"yay": "ho"}).job assert job.task_name == "tests.unit.test_tasks.task_func" assert job.lock == "sher" assert job.task_kwargs == {"yay": "ho"} assert job.queue == "queue"
def _wrap(func: Callable[..., "tasks.Task"]): from procrastinate import tasks task = tasks.Task(func, app=self, queue=queue, name=name, retry=retry) self._register(task) return functools.update_wrapper(task, func)
def _wrap(func: Callable[..., "tasks.Task"]): from procrastinate import tasks task = tasks.Task( func, app=self, queue=queue, lock=lock, queueing_lock=queueing_lock, name=name, aliases=aliases, retry=retry, pass_context=pass_context, ) self._register(task) return functools.update_wrapper(task, func)
async def test_task_defer_async(app, connector): task = tasks.Task(task_func, blueprint=app, queue="queue") await task.defer_async(c=3) # The lock is the only thing we can't predict lock = connector.jobs[1]["lock"] assert connector.jobs == { 1: { "id": 1, "queue_name": "queue", "task_name": "tests.unit.test_tasks.task_func", "lock": lock, "queueing_lock": None, "args": {"c": 3}, "status": "todo", "scheduled_at": None, "attempts": 0, } }
async def test_run_job_retry(app, job_store): def job(a, b): # pylint: disable=unused-argument raise ValueError("nope") task = tasks.Task(job, app=app, queue="yay", name="job", retry=True) task.func = job app.tasks = {"job": task} job = jobs.Job( id=16, task_kwargs={ "a": 9, "b": 3 }, lock="sherlock", task_name="job", queue="yay", ) test_worker = worker.Worker(app, queues=["yay"]) with pytest.raises(exceptions.JobRetry): await test_worker.run_job(job)
def test_task_defer(app): task = tasks.Task(task_func, app=app, queue="queue") task.defer(c=3) # The lock is the only thing we can't predict lock = app.job_store.jobs[1]["lock"] assert app.job_store.jobs == { 1: { "id": 1, "queue_name": "queue", "task_name": "tests.unit.test_tasks.task_func", "lock": lock, "args": { "c": 3 }, "status": "todo", "scheduled_at": None, "started_at": None, "attempts": 0, } }
async def test_run_job_error(app): def job(a, b): # pylint: disable=unused-argument raise ValueError("nope") task = tasks.Task(job, blueprint=app, queue="yay", name="job") task.func = job app.tasks = {"job": task} job = jobs.Job( id=16, task_kwargs={ "a": 9, "b": 3 }, lock="sherlock", queueing_lock="houba", task_name="job", queue="yay", ) test_worker = worker.Worker(app, queues=["yay"]) with pytest.raises(exceptions.JobError): await test_worker.run_job(job=job, worker_id=3)
def test_task_configure_override_queue(app): task = tasks.Task(task_func, app=app, queue="queue") job = task.configure(queue="other_queue").job assert job.queue == "other_queue"
def test_task_init_with_no_name(app): task = tasks.Task(task_func, app=app, queue="queue") assert task.func is task_func assert task.name == "tests.unit.test_tasks.task_func"
def test_task_get_retry_exception_none(app): task = tasks.Task(task_func, app=app, queue="queue") job = task.configure().job assert task.get_retry_exception(exception=None, job=job) is None