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')