def test_a_worker_should_run_only_one_time(self): worker = Worker('test', max_loops=2) worker.run() with self.assertRaises(ImplementationError): worker.run()
def test_job_error_method_should_be_called(self): class ExceptionWithCode(Exception): def __init__(self, message, code): super(ExceptionWithCode, self).__init__(message) self.message = message self.code = code def callback(job, queue): raise ExceptionWithCode('foobar', 42) job1 = Job.add_job(identifier='job:1', queue_name='test') queue = Queue.get_queue(name='test') worker = Worker(name='test', max_loops=1) # no callback worker.run() self.assertEqual(job1.status.hget(), STATUSES.ERROR) self.assertIn(job1.get_pk(), queue.errors.lmembers()) self.assertEqual(len(Error.collection()), 1) error = Error.get(identifier='job:1') self.assertEqual(error.message.hget(), 'You must implement your own action') self.assertEqual(error.code.hget(), None) job2 = Job.add_job(identifier='job:2', queue_name='test') queue = Queue.get_queue(name='test') worker = Worker(name='test', max_loops=1, callback=callback) # callback with exception worker.run() self.assertEqual(job2.status.hget(), STATUSES.ERROR) self.assertIn(job2.get_pk(), queue.errors.lmembers()) self.assertEqual(len(Error.collection()), 2) error = Error.get(identifier='job:2') self.assertEqual(error.message.hget(), 'foobar') self.assertEqual(error.code.hget(), '42')
def test_callback_should_be_called(self): result = {} def callback(job, queue): result['job'] = job.get_pk() result['queue'] = queue.get_pk() job = Job.add_job(identifier='job:1', queue_name='test') queue = Queue.get_queue(name='test') worker = Worker(name='test', callback=callback, max_loops=1) worker.run() self.assertEqual(result, {'job': job.get_pk(), 'queue': queue.get_pk()})
def test_blpop_timeout(self): class TestWorker(Worker): def wait_for_job(self): result = super(TestWorker, self).wait_for_job() if result is None: # force end to quit quickly self.end_forced = True return result Queue.get_queue('test') # test specific methods worker = Worker(name='test', timeout=1) worker.update_keys() test_value = worker.wait_for_job() self.assertIsNone(test_value) # test whole run worker = TestWorker(name='test', timeout=1) worker.run() self.assertEqual(worker.num_loops, 0)
def test_worker_without_queues_should_stop(self): worker = Worker(name='test', max_loops=1) worker.run() self.assertEqual(worker.num_loops, 0)
def test_worker_should_stop_after_max_loops(self): Job.add_job('job:1', 'test') worker = Worker('test', max_loops=1) # one loop to run only one job worker.run() self.assertEqual(worker.num_loops, 1) self.assertEqual(worker.status, 'terminated')