def test_process_task(mocker): q = QueueFactory() wp = WorkerProcess([q]) wp.worker.startup() q.enqueue_call() task = q.dequeue(wp.worker) def my_execute(task): assert wp.worker.state == WorkerState.BUSY assert task.status == TaskStatus.RUNNING return TaskOutcome("success") execute = mocker.patch.object(WorkerProcess, 'execute_task', side_effect=my_execute) wp.process_task(task) assert task.status == TaskStatus.FINISHED q.enqueue_call() task = q.dequeue(wp.worker) execute.side_effect = ArithmeticError() wp.process_task(task) assert task.status == TaskStatus.FAILED assert 'ArithmeticError' in task.error_message
def test_state_transistions(assert_atomic, connection, time_mocker, stub): time = time_mocker('redis_tasks.task.utcnow') task = Task(reentrant_stub) q = QueueFactory() w = WorkerFactory() w.startup() # enqueue time.step() assert not connection.exists(task.key) with assert_atomic(): task.enqueue(q) assert q.get_task_ids() == [task.id] assert connection.exists(task.key) for t in [task, Task.fetch(task.id)]: assert t.enqueued_at == time.now assert t.status == TaskStatus.QUEUED assert t.origin == q.name # dequeue task = q.dequeue(w) assert q.get_task_ids() == [] assert worker_registry.get_running_tasks() == {w.id: task.id} # set_running time.step() with assert_atomic(): w.start_task(task) assert worker_registry.get_running_tasks() == {w.id: task.id} for t in [task, Task.fetch(task.id)]: assert t.status == TaskStatus.RUNNING assert t.started_at == time.now # requeue time.step() with assert_atomic(): w.end_task(task, TaskOutcome("requeue")) assert worker_registry.get_running_tasks() == dict() assert q.get_task_ids() == [task.id] for t in [task, Task.fetch(task.id)]: assert t.status == TaskStatus.QUEUED assert t.started_at is None # set_finished task = q.dequeue(w) w.start_task(task) time.step() with assert_atomic(): w.end_task(task, TaskOutcome("success")) assert q.get_task_ids() == [] assert finished_task_registry.get_task_ids() == [task.id] for t in [task, Task.fetch(task.id)]: assert t.status == TaskStatus.FINISHED assert t.ended_at == time.now # set_failed task = q.enqueue_call(stub) task = q.dequeue(w) w.start_task(task) assert worker_registry.get_running_tasks() == {w.id: task.id} time.step() with assert_atomic(): w.end_task(task, TaskOutcome("failure", message="my error")) assert worker_registry.get_running_tasks() == dict() assert failed_task_registry.get_task_ids() == [task.id] for t in [task, Task.fetch(task.id)]: assert t.status == TaskStatus.FAILED assert t.error_message == "my error" assert t.ended_at == time.now