Fixes some broken tests and misbehaviour with ttls. There was a temporal
coupling between saving the job and setting its expires parameter.
main
Marcus Martins 10 years ago
parent 8703dbeb17
commit 5b8726ad2d

@ -417,6 +417,7 @@ class Job(object):
self.result_ttl = int(obj.get('result_ttl')) if obj.get('result_ttl') else None # noqa self.result_ttl = int(obj.get('result_ttl')) if obj.get('result_ttl') else None # noqa
self._status = as_text(obj.get('status') if obj.get('status') else None) self._status = as_text(obj.get('status') if obj.get('status') else None)
self._dependency_id = as_text(obj.get('dependency_id', None)) self._dependency_id = as_text(obj.get('dependency_id', None))
self.ttl = int(obj.get('ttl', -1))
self.meta = unpickle(obj.get('meta')) if obj.get('meta') else {} self.meta = unpickle(obj.get('meta')) if obj.get('meta') else {}
def to_dict(self): def to_dict(self):
@ -447,6 +448,8 @@ class Job(object):
obj['dependency_id'] = self._dependency_id obj['dependency_id'] = self._dependency_id
if self.meta: if self.meta:
obj['meta'] = dumps(self.meta) obj['meta'] = dumps(self.meta)
if self.ttl:
obj['ttl'] = self.ttl
return obj return obj
@ -456,7 +459,7 @@ class Job(object):
connection = pipeline if pipeline is not None else self.connection connection = pipeline if pipeline is not None else self.connection
connection.hmset(key, self.to_dict()) connection.hmset(key, self.to_dict())
self.cleanup(self.ttl) self.cleanup(self.ttl, pipeline=connection)
def cancel(self): def cancel(self):
"""Cancels the given job, which will prevent the job from ever being """Cancels the given job, which will prevent the job from ever being

@ -2,6 +2,7 @@
from __future__ import (absolute_import, division, print_function, from __future__ import (absolute_import, division, print_function,
unicode_literals) unicode_literals)
import time
from datetime import datetime from datetime import datetime
from tests import RQTestCase from tests import RQTestCase
@ -15,7 +16,7 @@ from rq.registry import DeferredJobRegistry
from rq.utils import utcformat from rq.utils import utcformat
from rq.worker import Worker from rq.worker import Worker
from . import fixtures import fixtures
try: try:
from cPickle import loads, dumps from cPickle import loads, dumps
@ -103,7 +104,8 @@ class TestJob(RQTestCase):
job = Job.create(func='tests.fixtures.say_hello', args=('World',)) job = Job.create(func='tests.fixtures.say_hello', args=('World',))
# Job data is set # Job data is set
self.assertEquals(job.func, fixtures.say_hello) self.assertTrue(job.func.func_code.co_filename in fixtures.say_hello.func_code.co_filename)
self.assertEquals(job.func.func_code.co_firstlineno, fixtures.say_hello.func_code.co_firstlineno)
self.assertIsNone(job.instance) self.assertIsNone(job.instance)
self.assertEquals(job.args, ('World',)) self.assertEquals(job.args, ('World',))
@ -147,7 +149,7 @@ class TestJob(RQTestCase):
# Saving writes pickled job data # Saving writes pickled job data
unpickled_data = loads(self.testconn.hget(job.key, 'data')) unpickled_data = loads(self.testconn.hget(job.key, 'data'))
self.assertEquals(unpickled_data[0], 'tests.fixtures.some_calculation') self.assertEquals(unpickled_data[0], 'fixtures.some_calculation')
def test_fetch(self): def test_fetch(self):
"""Fetching jobs.""" """Fetching jobs."""
@ -288,9 +290,9 @@ class TestJob(RQTestCase):
job.save() job.save()
Job.fetch(job.id, connection=self.testconn) Job.fetch(job.id, connection=self.testconn)
if PY2: if PY2:
self.assertEqual(job.description, "tests.fixtures.say_hello(u'Lionel')") self.assertEqual(job.description, "fixtures.say_hello(u'Lionel')")
else: else:
self.assertEqual(job.description, "tests.fixtures.say_hello('Lionel')") self.assertEqual(job.description, "fixtures.say_hello('Lionel')")
def test_job_access_outside_job_fails(self): def test_job_access_outside_job_fails(self):
"""The current job is accessible only within a job context.""" """The current job is accessible only within a job context."""
@ -406,4 +408,18 @@ class TestJob(RQTestCase):
job = queue.enqueue(fixtures.echo, arg_with_unicode=fixtures.UnicodeStringObject()) job = queue.enqueue(fixtures.echo, arg_with_unicode=fixtures.UnicodeStringObject())
self.assertIsNotNone(job.get_call_string()) self.assertIsNotNone(job.get_call_string())
job.perform() job.perform()
def test_create_job_with_ttl_should_have_ttl_after_enqueued(self):
"""test creating jobs with ttl and checks if get_jobs returns it properly [issue502]"""
queue = Queue(connection=self.testconn)
queue.enqueue(fixtures.say_hello, job_id="1234", ttl=10)
job = queue.get_jobs()[0]
self.assertEqual(job.ttl, 10)
def test_create_job_with_ttl_should_expire(self):
"""test if a job created with ttl expires [issue502]"""
queue = Queue(connection=self.testconn)
queue.enqueue(fixtures.say_hello, job_id="1234", ttl=1)
time.sleep(1)
self.assertEqual(0, len(queue.get_jobs()))

Loading…
Cancel
Save