def test_perform_args(self): test_job = Job(func=dummy_task_args, model_name='res.users', args=('o', 'k'), kwargs={'c': '!'}) result = test_job.perform(self.session) self.assertEqual(result, 'ok!')
def test_infinite_retryable_error(self): test_job = Job(func=retryable_error_task, max_retries=0) self.assertEqual(test_job.retry, 0) with self.assertRaises(RetryableJobError): test_job.perform(self.session) self.assertEqual(test_job.retry, 1)
def test_compare_eta(self): """ When an `eta` datetime is defined, it should be executed after a job without one. """ date = datetime.now() + timedelta(hours=3) job_a = Job(func=task_a, priority=10, eta=date) job_b = Job(func=task_b, priority=10) self.assertGreater(job_a, job_b)
def test_set_pending(self): job_a = Job(func=task_a) job_a.set_pending(result='test') self.assertEquals(job_a.state, PENDING) self.assertFalse(job_a.date_enqueued) self.assertFalse(job_a.date_started) self.assertEquals(job_a.retry, 0) self.assertEquals(job_a.result, 'test')
def test_set_started(self): job_a = Job(func=task_a) datetime_path = 'odoo.addons.connector.queue.job.datetime' with mock.patch(datetime_path, autospec=True) as mock_datetime: mock_datetime.now.return_value = datetime(2015, 3, 15, 16, 41, 0) job_a.set_started() self.assertEquals(job_a.state, STARTED) self.assertEquals(job_a.date_started, datetime(2015, 3, 15, 16, 41, 0))
def test_postpone(self): job_a = Job(func=task_a) datetime_path = 'odoo.addons.connector.queue.job.datetime' with mock.patch(datetime_path, autospec=True) as mock_datetime: mock_datetime.now.return_value = datetime(2015, 3, 15, 16, 41, 0) job_a.postpone(result='test', seconds=60) self.assertEquals(job_a.eta, datetime(2015, 3, 15, 16, 42, 0)) self.assertEquals(job_a.result, 'test') self.assertFalse(job_a.exc_info)
def test_read(self): eta = datetime.now() + timedelta(hours=5) test_job = Job(func=dummy_task_args, model_name='res.users', args=('o', 'k'), kwargs={'c': '!'}, priority=15, eta=eta, description="My description") test_job.user_id = 1 test_job.company_id = self.env.ref("base.main_company").id storage = OdooJobStorage(self.session) storage.store(test_job) job_read = storage.load(test_job.uuid) self.assertEqual(test_job.uuid, job_read.uuid) self.assertEqual(test_job.model_name, job_read.model_name) self.assertEqual(test_job.func, job_read.func) self.assertEqual(test_job.args, job_read.args) self.assertEqual(test_job.kwargs, job_read.kwargs) self.assertEqual(test_job.func_name, job_read.func_name) self.assertEqual(test_job.func_string, job_read.func_string) self.assertEqual(test_job.description, job_read.description) self.assertEqual(test_job.state, job_read.state) self.assertEqual(test_job.priority, job_read.priority) self.assertEqual(test_job.exc_info, job_read.exc_info) self.assertEqual(test_job.result, job_read.result) self.assertEqual(test_job.user_id, job_read.user_id) self.assertEqual(test_job.company_id, job_read.company_id) delta = timedelta(seconds=1) # DB does not keep milliseconds self.assertAlmostEqual(test_job.date_created, job_read.date_created, delta=delta) self.assertAlmostEqual(test_job.date_started, job_read.date_started, delta=delta) self.assertAlmostEqual(test_job.date_enqueued, job_read.date_enqueued, delta=delta) self.assertAlmostEqual(test_job.date_done, job_read.date_done, delta=delta) self.assertAlmostEqual(test_job.eta, job_read.eta, delta=delta) test_date = datetime(2015, 3, 15, 21, 7, 0) job_read.date_enqueued = test_date job_read.date_started = test_date job_read.date_done = test_date storage.store(job_read) job_read = storage.load(test_job.uuid) self.assertAlmostEqual(job_read.date_started, test_date, delta=delta) self.assertAlmostEqual(job_read.date_enqueued, test_date, delta=delta) self.assertAlmostEqual(job_read.date_done, test_date, delta=delta)
def test_description(self): """ If no description is given to the job, it should be computed from the function """ # if a doctstring is defined for the function # it's used as description job_a = Job(func=task_a) self.assertEqual(job_a.description, task_a.__doc__) # if no docstring, the description is computed job_b = Job(func=task_b) self.assertEqual(job_b.description, "Function task_b") # case when we explicitly specify the description description = "My description" job_a = Job(func=task_a, description=description) self.assertEqual(job_a.description, description)
def _create_job(self, func, *args): job = Job(func=func, args=args) storage = OdooJobStorage(self.session) storage.store(job) stored = self.QueueJob.search([('uuid', '=', job.uuid)]) self.assertEqual(len(stored), 1) return stored
def test_eta_integer(self): """ When an `eta` is an integer, it adds n seconds up to now """ datetime_path = 'odoo.addons.connector.queue.job.datetime' with mock.patch(datetime_path, autospec=True) as mock_datetime: mock_datetime.now.return_value = datetime(2015, 3, 15, 16, 41, 0) job_a = Job(func=task_a, eta=60) self.assertEqual(job_a.eta, datetime(2015, 3, 15, 16, 42, 0))
def _create_job(self): test_job = Job(func=task_a) storage = OdooJobStorage(self.session) storage.store(test_job) stored = storage.db_record_from_uuid(test_job.uuid) self.assertEqual(len(stored), 1) return stored
def test_eta_timedelta(self): """ When an `eta` is a timedelta, it adds it up to now """ datetime_path = 'odoo.addons.connector.queue.job.datetime' with mock.patch(datetime_path, autospec=True) as mock_datetime: mock_datetime.now.return_value = datetime(2015, 3, 15, 16, 41, 0) delta = timedelta(hours=3) job_a = Job(func=task_a, eta=delta) self.assertEqual(job_a.eta, datetime(2015, 3, 15, 19, 41, 0))
def test_on_method(self): class A(object): def method(self): pass with self.assertRaises(NotImplementedError): Job(A.method)
def test_unicode(self): test_job = Job(func=dummy_task_args, model_name='res.users', args=(u'öô¿‽', u'ñě'), kwargs={'c': u'ßø'}, priority=15, description=u"My dé^Wdescription") test_job.user_id = 1 storage = OdooJobStorage(self.session) storage.store(test_job) job_read = storage.load(test_job.uuid) self.assertEqual(test_job.args, job_read.args) self.assertEqual(job_read.args, ('res.users', u'öô¿‽', u'ñě')) self.assertEqual(test_job.kwargs, job_read.kwargs) self.assertEqual(job_read.kwargs, {'c': u'ßø'}) self.assertEqual(test_job.description, job_read.description) self.assertEqual(job_read.description, u"My dé^Wdescription")
def test_job_unlinked(self): test_job = Job(func=dummy_task_args, model_name='res.users', args=('o', 'k'), kwargs={'c': '!'}) storage = OdooJobStorage(self.session) storage.store(test_job) stored = self.queue_job.search([('uuid', '=', test_job.uuid)]) stored.unlink() with self.assertRaises(NoSuchJobError): storage.load(test_job.uuid)
def test_retryable_error(self): test_job = Job(func=retryable_error_task, max_retries=3) self.assertEqual(test_job.retry, 0) with self.assertRaises(RetryableJobError): test_job.perform(self.session) self.assertEqual(test_job.retry, 1) with self.assertRaises(RetryableJobError): test_job.perform(self.session) self.assertEqual(test_job.retry, 2) with self.assertRaises(FailedJobError): test_job.perform(self.session) self.assertEqual(test_job.retry, 3)
def test_accented_bytestring(self): test_job = Job(func=dummy_task_args, model_name='res.users', args=('öô¿‽', 'ñě'), kwargs={'c': 'ßø'}, priority=15, description="My dé^Wdescription") test_job.user_id = 1 storage = OdooJobStorage(self.session) storage.store(test_job) job_read = storage.load(test_job.uuid) self.assertEqual(test_job.args, job_read.args) self.assertEqual(job_read.args, ('res.users', 'öô¿‽', 'ñě')) self.assertEqual(test_job.kwargs, job_read.kwargs) self.assertEqual(job_read.kwargs, {'c': 'ßø'}) # the job's description has been created as bytestring but is # decoded to utf8 by the ORM so make them comparable self.assertEqual(test_job.description, job_read.description.encode('utf8')) self.assertEqual(job_read.description, "My dé^Wdescription".decode('utf8'))
def test_channel_on_job(self): job(task_a) self.function_model._register_jobs() path_a = '%s.%s' % (task_a.__module__, task_a.__name__) job_func = self.function_model.search([('name', '=', path_a)]) self.assertEquals(job_func.channel, 'root') test_job = Job(func=task_a) storage = OdooJobStorage(self.session) storage.store(test_job) stored = self.job_model.search([('uuid', '=', test_job.uuid)]) self.assertEquals(stored.channel, 'root') channel = self.channel_model.create({'name': 'sub', 'parent_id': self.root_channel.id, }) job_func.channel_id = channel test_job = Job(func=task_a) storage = OdooJobStorage(self.session) storage.store(test_job) stored = self.job_model.search([('uuid', '=', test_job.uuid)]) self.assertEquals(stored.channel, 'root.sub')
def test_retry_pattern_no_zero(self): """ When we specify a retry pattern without 0, uses RETRY_INTERVAL""" test_pattern = { 3: 180, } job(retryable_error_task, retry_pattern=test_pattern) test_job = Job(func=retryable_error_task, max_retries=0) test_job.retry += 1 self.assertEqual(test_job.retry, 1) self.assertEqual(test_job._get_retry_seconds(), RETRY_INTERVAL) test_job.retry += 1 self.assertEqual(test_job.retry, 2) self.assertEqual(test_job._get_retry_seconds(), RETRY_INTERVAL) test_job.retry += 1 self.assertEqual(test_job.retry, 3) self.assertEqual(test_job._get_retry_seconds(), 180) test_job.retry += 1 self.assertEqual(test_job.retry, 4) self.assertEqual(test_job._get_retry_seconds(), 180)
def test_perform(self): test_job = Job(func=dummy_task) result = test_job.perform(self.session) self.assertEqual(result, 'ok')
def test_priority(self): """ The lower the priority number, the higher the priority is""" job_a = Job(func=task_a, priority=10) job_b = Job(func=task_b, priority=5) self.assertGreater(job_a, job_b)
def test_new_job(self): """ Create a job """ test_job = Job(func=task_a) self.assertEqual(test_job.func, task_a)
def test_context_uuid(self): test_job = Job(func=dummy_task_context) result = test_job.perform(self.session) key_present = 'job_uuid' in result self.assertTrue(key_present) self.assertEqual(result['job_uuid'], test_job._uuid)
def test_compare_apple_and_orange(self): with self.assertRaises(TypeError): Job(func=task_a) != 1
def test_eta(self): """ When an `eta` is datetime, it uses it """ now = datetime.now() job_a = Job(func=task_a, eta=now) self.assertEqual(job_a.eta, now)
def test_store(self): test_job = Job(func=task_a) storage = OdooJobStorage(self.session) storage.store(test_job) stored = self.queue_job.search([('uuid', '=', test_job.uuid)]) self.assertEqual(len(stored), 1)
def test_retry_pattern(self): """ When we specify a retry pattern, the eta must follow it""" datetime_path = 'odoo.addons.connector.queue.job.datetime' test_pattern = { 1: 60, 2: 180, 3: 10, 5: 300, } job(retryable_error_task, retry_pattern=test_pattern) with mock.patch(datetime_path, autospec=True) as mock_datetime: mock_datetime.now.return_value = datetime(2015, 6, 1, 15, 10, 0) test_job = Job(func=retryable_error_task, max_retries=0) test_job.retry += 1 test_job.postpone(self.session) self.assertEqual(test_job.retry, 1) self.assertEqual(test_job.eta, datetime(2015, 6, 1, 15, 11, 0)) test_job.retry += 1 test_job.postpone(self.session) self.assertEqual(test_job.retry, 2) self.assertEqual(test_job.eta, datetime(2015, 6, 1, 15, 13, 0)) test_job.retry += 1 test_job.postpone(self.session) self.assertEqual(test_job.retry, 3) self.assertEqual(test_job.eta, datetime(2015, 6, 1, 15, 10, 10)) test_job.retry += 1 test_job.postpone(self.session) self.assertEqual(test_job.retry, 4) self.assertEqual(test_job.eta, datetime(2015, 6, 1, 15, 10, 10)) test_job.retry += 1 test_job.postpone(self.session) self.assertEqual(test_job.retry, 5) self.assertEqual(test_job.eta, datetime(2015, 6, 1, 15, 15, 00))
def test_set_failed(self): job_a = Job(func=task_a) job_a.set_failed(exc_info='failed test') self.assertEquals(job_a.state, FAILED) self.assertEquals(job_a.exc_info, 'failed test')
def test_invalid_function(self): with self.assertRaises(TypeError): Job(1)