def test_get_failed_queue(): """Check get failed queue.""" connection = object() q = get_failed_queue(connection) assert isinstance(q, FailedQueue) assert q.connection is connection
def test_custom_exc_handling(loop): """Custom exception handling.""" @asyncio.coroutine def black_hole(job, *exc_info): # Don't fall through to default behaviour (moving to failed # queue) return False q = Queue() failed_q = get_failed_queue() # Preconditions assert not (yield from failed_q.count) assert not (yield from q.count) # Action job = yield from q.enqueue(div_by_zero) assert (yield from q.count) == 1 w = Worker([q], exception_handlers=black_hole) yield from w.work(burst=True, loop=loop) # Should silently pass # Postconditions assert not (yield from q.count) assert not (yield from failed_q.count) # Check the job job = yield from Job.fetch(job.id) assert job.is_failed
def test_work_is_unreadable(redis, loop): """Unreadable jobs are put on the failed queue.""" q = Queue() failed_q = get_failed_queue() assert (yield from failed_q.count) == 0 assert (yield from q.count) == 0 # NOTE: We have to fake this enqueueing for this test case. # What we're simulating here is a call to a function that is not # importable from the worker process. job = Job.create(func=say_hello, args=(3,)) yield from job.save() # NOTE: replacement and original strings must have the same length data = yield from redis.hget(job.key, 'data') invalid_data = data.replace(b'say_hello', b'fake_attr') assert data != invalid_data yield from redis.hset(job.key, 'data', invalid_data) # We use the low-level internal function to enqueue any data # (bypassing validity checks) yield from q.push_job_id(job.id) assert (yield from q.count) == 1 # All set, we're going to process it w = Worker([q]) yield from w.work(burst=True, loop=loop) # Should silently pass assert (yield from q.count) == 0 assert (yield from failed_q.count) == 1
def test_work_fails(loop): """Failing jobs are put on the failed queue.""" q = Queue() failed_q = get_failed_queue() # Preconditions assert not (yield from failed_q.count) assert not (yield from q.count) # Action job = yield from q.enqueue(div_by_zero) assert (yield from q.count) == 1 # keep for later enqueued_at_date = strip_microseconds(job.enqueued_at) w = Worker([q]) yield from w.work(burst=True, loop=loop) # Should silently pass # Postconditions assert not (yield from q.count) assert (yield from failed_q.count) == 1 assert not (yield from w.get_current_job_id()) # Check the job job = yield from Job.fetch(job.id) assert job.origin == q.name # Should be the original enqueued_at date, not the date of enqueueing # to the failed queue assert job.enqueued_at == enqueued_at_date assert job.exc_info # should contain exc_info