Replace global Conf mangling with monkeypatch

The test suite, especially for the brokers, was heavily dependant on the
success of the tests preceeding it to pass. This commit should eliminate
that dependency and allow tests to fail without affecting others.
It also removes the need to cleanup globals manually after a test.
This commit is contained in:
Harm Geerts
2016-11-29 18:08:52 +01:00
parent 82f3cbdf28
commit cf37efb1eb
6 changed files with 55 additions and 99 deletions
+2 -4
View File
@@ -11,8 +11,8 @@ from django_q.signing import SignedPackage
@pytest.mark.django_db @pytest.mark.django_db
def test_admin_views(admin_client): def test_admin_views(admin_client, monkeypatch):
Conf.ORM = 'default' monkeypatch.setattr(Conf, 'ORM', 'default')
s = schedule('schedule.test') s = schedule('schedule.test')
tag = uuid() tag = uuid()
f = Task.objects.create( f = Task.objects.create(
@@ -78,5 +78,3 @@ def test_admin_views(admin_client):
data = {'post': 'yes'} data = {'post': 'yes'}
response = admin_client.post(url, data) response = admin_client.post(url, data)
assert response.status_code == 302 assert response.status_code == 302
# cleanup
Conf.ORM = None
+31 -53
View File
@@ -9,7 +9,7 @@ from django_q.conf import Conf
from django_q.humanhash import uuid from django_q.humanhash import uuid
def test_broker(): def test_broker(monkeypatch):
broker = Broker() broker = Broker()
broker.enqueue('test') broker.enqueue('test')
broker.dequeue() broker.dequeue()
@@ -27,39 +27,35 @@ def test_broker():
assert broker.get_stat('test_1') == 'test' assert broker.get_stat('test_1') == 'test'
assert broker.get_stats('test:*')[0] == 'test' assert broker.get_stats('test:*')[0] == 'test'
# stats with no cache # stats with no cache
Conf.CACHE = 'not_configured' monkeypatch.setattr(Conf, 'CACHE', 'not_configured')
broker.cache = broker.get_cache() broker.cache = broker.get_cache()
assert broker.get_stat('test_1') is None assert broker.get_stat('test_1') is None
broker.set_stat('test_1', 'test', 3) broker.set_stat('test_1', 'test', 3)
assert broker.get_stat('test_1') is None assert broker.get_stat('test_1') is None
assert broker.get_stats('test:*') is None assert broker.get_stats('test:*') is None
Conf.CACHE = 'default'
def test_redis(): def test_redis(monkeypatch):
Conf.DJANGO_REDIS = None monkeypatch.setattr(Conf, 'DJANGO_REDIS', None)
broker = get_broker() broker = get_broker()
assert broker.ping() is True assert broker.ping() is True
assert broker.info() is not None assert broker.info() is not None
Conf.REDIS = {'host': '127.0.0.1', 'port': 7799} monkeypatch.setattr(Conf, 'REDIS', {'host': '127.0.0.1', 'port': 7799})
broker = get_broker() broker = get_broker()
with pytest.raises(Exception): with pytest.raises(Exception):
broker.ping() broker.ping()
Conf.REDIS = None
Conf.DJANGO_REDIS = 'default'
def test_custom(): def test_custom(monkeypatch):
Conf.BROKER_CLASS = 'brokers.redis_broker.Redis' monkeypatch.setattr(Conf, 'BROKER_CLASS', 'brokers.redis_broker.Redis')
broker = get_broker() broker = get_broker()
assert broker.ping() is True assert broker.ping() is True
assert broker.info() is not None assert broker.info() is not None
assert broker.__class__.__name__ == 'Redis' assert broker.__class__.__name__ == 'Redis'
Conf.BROKER_CLASS = None
def test_disque(): def test_disque(monkeypatch):
Conf.DISQUE_NODES = ['127.0.0.1:7711'] monkeypatch.setattr(Conf, 'DISQUE_NODES', ['127.0.0.1:7711'])
# check broker # check broker
broker = get_broker(list_key='disque_test') broker = get_broker(list_key='disque_test')
assert broker.ping() is True assert broker.ping() is True
@@ -75,7 +71,7 @@ def test_disque():
broker.acknowledge(task[0]) broker.acknowledge(task[0])
assert broker.queue_size() == 0 assert broker.queue_size() == 0
# Retry test # Retry test
Conf.RETRY = 1 monkeypatch.setattr(Conf, 'RETRY', 1)
broker.enqueue('test') broker.enqueue('test')
assert broker.queue_size() == 1 assert broker.queue_size() == 1
broker.dequeue() broker.dequeue()
@@ -97,8 +93,8 @@ def test_disque():
# bulk test # bulk test
for i in range(5): for i in range(5):
broker.enqueue('test') broker.enqueue('test')
Conf.BULK = 5 monkeypatch.setattr(Conf, 'BULK', 5)
Conf.DISQUE_FASTACK = True monkeypatch.setattr(Conf, 'DISQUE_FASTACK', True)
tasks = broker.dequeue() tasks = broker.dequeue()
for task in tasks: for task in tasks:
assert task is not None assert task is not None
@@ -111,21 +107,16 @@ def test_disque():
broker.delete_queue() broker.delete_queue()
assert broker.queue_size() == 0 assert broker.queue_size() == 0
# connection test # connection test
Conf.DISQUE_NODES = ['127.0.0.1:7798', '127.0.0.1:7799'] monkeypatch.setattr(Conf, 'DISQUE_NODES', ['127.0.0.1:7798', '127.0.0.1:7799'])
with pytest.raises(redis.exceptions.ConnectionError): with pytest.raises(redis.exceptions.ConnectionError):
broker.get_connection() broker.get_connection()
# back to django-redis
Conf.DISQUE_NODES = None
Conf.DISQUE_FASTACK = False
@pytest.mark.skipif(not os.getenv('IRON_MQ_TOKEN'), @pytest.mark.skipif(not os.getenv('IRON_MQ_TOKEN'),
reason="requires IronMQ credentials") reason="requires IronMQ credentials")
def test_ironmq(): def test_ironmq(monkeypatch):
Conf.DISQUE_NODES = None monkeypatch.setattr(Conf, 'IRON_MQ', {'token': os.getenv('IRON_MQ_TOKEN'),
Conf.SQS = None 'project_id': os.getenv('IRON_MQ_PROJECT_ID')})
Conf.IRON_MQ = {'token': os.getenv('IRON_MQ_TOKEN'),
'project_id': os.getenv('IRON_MQ_PROJECT_ID')}
# check broker # check broker
broker = get_broker(list_key=uuid()[0]) broker = get_broker(list_key=uuid()[0])
assert broker.ping() is True assert broker.ping() is True
@@ -143,7 +134,7 @@ def test_ironmq():
broker.acknowledge(task[0]) broker.acknowledge(task[0])
assert broker.dequeue() is None assert broker.dequeue() is None
# Retry test # Retry test
# Conf.RETRY = 1 # monkeypatch.setattr(Conf, 'RETRY', 1)
# broker.enqueue('test') # broker.enqueue('test')
# assert broker.dequeue() is not None # assert broker.dequeue() is not None
# sleep(3) # sleep(3)
@@ -162,7 +153,7 @@ def test_ironmq():
# bulk test # bulk test
for i in range(5): for i in range(5):
broker.enqueue('test') broker.enqueue('test')
Conf.BULK = 5 monkeypatch.setattr(Conf, 'BULK', 5)
tasks = broker.dequeue() tasks = broker.dequeue()
for task in tasks: for task in tasks:
assert task is not None assert task is not None
@@ -175,19 +166,14 @@ def test_ironmq():
broker.purge_queue() broker.purge_queue()
assert broker.dequeue() is None assert broker.dequeue() is None
broker.delete_queue() broker.delete_queue()
# back to django-redis
Conf.IRON_MQ = None
Conf.DJANGO_REDIS = 'default'
@pytest.mark.skipif(not os.getenv('AWS_ACCESS_KEY_ID'), @pytest.mark.skipif(not os.getenv('AWS_ACCESS_KEY_ID'),
reason="requires AWS credentials") reason="requires AWS credentials")
def test_sqs(): def test_sqs(monkeypatch):
Conf.IRON_MQ = None monkeypatch.setattr(Conf, 'SQS', {'aws_region': os.getenv('AWS_REGION'),
Conf.DISQUE_NODES = None 'aws_access_key_id': os.getenv('AWS_ACCESS_KEY_ID'),
Conf.SQS = {'aws_region': os.getenv('AWS_REGION'), 'aws_secret_access_key': os.getenv('AWS_SECRET_ACCESS_KEY')})
'aws_access_key_id': os.getenv('AWS_ACCESS_KEY_ID'),
'aws_secret_access_key': os.getenv('AWS_SECRET_ACCESS_KEY')}
# check broker # check broker
broker = get_broker(list_key=uuid()[0]) broker = get_broker(list_key=uuid()[0])
assert broker.ping() is True assert broker.ping() is True
@@ -201,7 +187,7 @@ def test_sqs():
broker.acknowledge(task[0]) broker.acknowledge(task[0])
assert broker.dequeue() is None assert broker.dequeue() is None
# Retry test # Retry test
Conf.RETRY = 1 monkeypatch.setattr(Conf, 'RETRY', 1)
broker.enqueue('test') broker.enqueue('test')
assert broker.dequeue() is not None assert broker.dequeue() is not None
sleep(2) sleep(2)
@@ -222,7 +208,7 @@ def test_sqs():
# bulk test # bulk test
for i in range(10): for i in range(10):
broker.enqueue('test') broker.enqueue('test')
Conf.BULK = 12 monkeypatch.setattr(Conf, 'BULK', 12)
tasks = broker.dequeue() tasks = broker.dequeue()
for task in tasks: for task in tasks:
assert task is not None assert task is not None
@@ -234,15 +220,11 @@ def test_sqs():
broker.enqueue('test') broker.enqueue('test')
broker.purge_queue() broker.purge_queue()
broker.delete_queue() broker.delete_queue()
# back to django-redis
Conf.SQS = None
Conf.BULK = 1
Conf.DJANGO_REDIS = 'default'
@pytest.mark.django_db @pytest.mark.django_db
def test_orm(): def test_orm(monkeypatch):
Conf.ORM = 'default' monkeypatch.setattr(Conf, 'ORM', 'default')
# check broker # check broker
broker = get_broker(list_key='orm_test') broker = get_broker(list_key='orm_test')
assert broker.ping() is True assert broker.ping() is True
@@ -258,7 +240,7 @@ def test_orm():
broker.acknowledge(task[0]) broker.acknowledge(task[0])
assert broker.queue_size() == 0 assert broker.queue_size() == 0
# Retry test # Retry test
Conf.RETRY = 1 monkeypatch.setattr(Conf, 'RETRY', 1)
broker.enqueue('test') broker.enqueue('test')
assert broker.queue_size() == 1 assert broker.queue_size() == 1
broker.dequeue() broker.dequeue()
@@ -280,7 +262,7 @@ def test_orm():
# bulk test # bulk test
for i in range(5): for i in range(5):
broker.enqueue('test') broker.enqueue('test')
Conf.BULK = 5 monkeypatch.setattr(Conf, 'BULK', 5)
tasks = broker.dequeue() tasks = broker.dequeue()
assert broker.lock_size() == Conf.BULK assert broker.lock_size() == Conf.BULK
for task in tasks: for task in tasks:
@@ -295,13 +277,11 @@ def test_orm():
broker.enqueue('test') broker.enqueue('test')
broker.delete_queue() broker.delete_queue()
assert broker.queue_size() == 0 assert broker.queue_size() == 0
# back to django-redis
Conf.ORM = None
@pytest.mark.django_db @pytest.mark.django_db
def test_mongo(): def test_mongo(monkeypatch):
Conf.MONGO = {'host': '127.0.0.1', 'port': 27017} monkeypatch.setattr(Conf, 'MONGO', {'host': '127.0.0.1', 'port': 27017})
# check broker # check broker
broker = get_broker(list_key='mongo_test') broker = get_broker(list_key='mongo_test')
assert broker.ping() is True assert broker.ping() is True
@@ -317,7 +297,7 @@ def test_mongo():
broker.acknowledge(task[0]) broker.acknowledge(task[0])
assert broker.queue_size() == 0 assert broker.queue_size() == 0
# Retry test # Retry test
Conf.RETRY = 1 monkeypatch.setattr(Conf, 'RETRY', 1)
broker.enqueue('test') broker.enqueue('test')
assert broker.queue_size() == 1 assert broker.queue_size() == 1
broker.dequeue() broker.dequeue()
@@ -356,5 +336,3 @@ def test_mongo():
broker.purge_queue() broker.purge_queue()
broker.delete_queue() broker.delete_queue()
assert broker.queue_size() == 0 assert broker.queue_size() == 0
# back to django-redis
Conf.ORM = None
+5 -12
View File
@@ -10,13 +10,8 @@ from django_q.brokers import get_broker
@pytest.fixture @pytest.fixture
def broker(): def broker(monkeypatch):
Conf.DISQUE_NODES = None monkeypatch.setattr(Conf, 'DJANGO_REDIS', 'default')
Conf.IRON_MQ = None
Conf.SQS = None
Conf.ORM = None
Conf.MONGO = None
Conf.DJANGO_REDIS = 'default'
return get_broker() return get_broker()
@@ -148,7 +143,7 @@ def test_chain(broker):
@pytest.mark.django_db @pytest.mark.django_db
def test_async_class(broker): def test_async_class(broker, monkeypatch):
broker.purge_queue() broker.purge_queue()
broker.cache.clear() broker.cache.clear()
a = Async('math.copysign') a = Async('math.copysign')
@@ -186,10 +181,8 @@ def test_async_class(broker):
assert a.result_group() == [-1] assert a.result_group() == [-1]
assert a.fetch_group() == [a.fetch()] assert a.fetch_group() == [a.fetch()]
# global overrides # global overrides
Conf.SYNC = True monkeypatch.setattr(Conf, 'SYNC', True)
Conf.CACHED = True monkeypatch.setattr(Conf, 'CACHED', True)
a = Async('math.floor', 1.5) a = Async('math.floor', 1.5)
a.run() a.run()
assert a.result() == 1 assert a.result() == 1
Conf.SYNC = False
Conf.CACHED = False
+10 -18
View File
@@ -29,13 +29,8 @@ class WordClass(object):
@pytest.fixture @pytest.fixture
def broker(): def broker(monkeypatch):
Conf.DISQUE_NODES = None monkeypatch.setattr(Conf, 'DJANGO_REDIS', 'default')
Conf.IRON_MQ = None
Conf.SQS = None
Conf.ORM = None
Conf.MONGO = None
Conf.DJANGO_REDIS = 'default'
return get_broker() return get_broker()
@@ -281,7 +276,7 @@ def test_timeout_override(broker):
@pytest.mark.django_db @pytest.mark.django_db
def test_recycle(broker): def test_recycle(broker, monkeypatch):
# set up the Sentinel # set up the Sentinel
broker.list_key = 'test_recycle_test:q' broker.list_key = 'test_recycle_test:q'
async('django_q.tests.tasks.multiply', 2, 2, broker=broker) async('django_q.tests.tasks.multiply', 2, 2, broker=broker)
@@ -290,8 +285,8 @@ def test_recycle(broker):
start_event = Event() start_event = Event()
stop_event = Event() stop_event = Event()
# override settings # override settings
Conf.RECYCLE = 2 monkeypatch.setattr(Conf, 'RECYCLE', 2)
Conf.WORKERS = 1 monkeypatch.setattr(Conf, 'WORKERS', 1)
# set a timer to stop the Sentinel # set a timer to stop the Sentinel
threading.Timer(3, stop_event.set).start() threading.Timer(3, stop_event.set).start()
s = Sentinel(stop_event, start_event, broker=broker) s = Sentinel(stop_event, start_event, broker=broker)
@@ -310,7 +305,7 @@ def test_recycle(broker):
# check if the work has been done # check if the work has been done
assert result_queue.qsize() == 2 assert result_queue.qsize() == 2
# save_limit test # save_limit test
Conf.SAVE_LIMIT = 1 monkeypatch.setattr(Conf, 'SAVE_LIMIT', 1)
result_queue.put('STOP') result_queue.put('STOP')
# run monitor # run monitor
monitor(result_queue) monitor(result_queue)
@@ -361,14 +356,14 @@ def test_update_failed(broker):
sleep(0.5) sleep(0.5)
# second save - no success # second save - no success
old_stopped = task['stopped'] old_stopped = task['stopped']
task['stopped']=timezone.now() task['stopped'] = timezone.now()
save_task(task, broker) save_task(task, broker)
saved_task = Task.objects.get(id=task['id']) saved_task = Task.objects.get(id=task['id'])
assert saved_task.stopped > old_stopped assert saved_task.stopped > old_stopped
# third save - success # third save - success
task['stopped']=timezone.now() task['stopped'] = timezone.now()
task['result']='result' task['result'] = 'result'
task['success']=True task['success'] = True
save_task(task, broker) save_task(task, broker)
saved_task = Task.objects.get(id=task['id']) saved_task = Task.objects.get(id=task['id'])
assert saved_task.success is True assert saved_task.success is True
@@ -383,9 +378,6 @@ def test_update_failed(broker):
assert saved_task.result == 'result' assert saved_task.result == 'result'
@pytest.mark.django_db @pytest.mark.django_db
def assert_result(task): def assert_result(task):
assert task is not None assert task is not None
+2 -3
View File
@@ -9,7 +9,7 @@ from django_q.conf import Conf
@pytest.mark.django_db @pytest.mark.django_db
def test_monitor(): def test_monitor(monkeypatch):
assert Stat.get(0).sentinel == 0 assert Stat.get(0).sentinel == 0
c = Cluster() c = Cluster()
c.start() c.start()
@@ -25,14 +25,13 @@ def test_monitor():
break break
assert found_c is True assert found_c is True
# test lock size # test lock size
Conf.ORM = 'default' monkeypatch.setattr(Conf, 'ORM', 'default')
b = get_broker('monitor_test') b = get_broker('monitor_test')
b.enqueue('test') b.enqueue('test')
b.dequeue() b.dequeue()
assert b.lock_size() == 1 assert b.lock_size() == 1
monitor(run_once=True, broker=b) monitor(run_once=True, broker=b)
b.delete_queue() b.delete_queue()
Conf.ORM = None
@pytest.mark.django_db @pytest.mark.django_db
+5 -9
View File
@@ -13,17 +13,13 @@ from django_q.tasks import Schedule, fetch, schedule as create_schedule
@pytest.fixture @pytest.fixture
def broker(): def broker(monkeypatch):
Conf.DISQUE_NODES = None monkeypatch.setattr(Conf, 'DJANGO_REDIS', 'default')
Conf.IRON_MQ = None
Conf.SQS = None
Conf.ORM = None
Conf.DJANGO_REDIS = 'default'
return get_broker() return get_broker()
@pytest.mark.django_db @pytest.mark.django_db
def test_scheduler(broker): def test_scheduler(broker, monkeypatch):
broker.list_key = 'scheduler_test:q' broker.list_key = 'scheduler_test:q'
broker.delete_queue() broker.delete_queue()
schedule = create_schedule('math.copysign', schedule = create_schedule('math.copysign',
@@ -117,7 +113,7 @@ def test_scheduler(broker):
# ONCE schedule should be deleted # ONCE schedule should be deleted
assert Schedule.objects.filter(pk=once_schedule.pk).exists() is False assert Schedule.objects.filter(pk=once_schedule.pk).exists() is False
# Catch up On # Catch up On
Conf.CATCH_UP = True monkeypatch.setattr(Conf, 'CATCH_UP', True)
now = timezone.now() now = timezone.now()
schedule = create_schedule('django_q.tests.tasks.word_multiply', schedule = create_schedule('django_q.tests.tasks.word_multiply',
2, 2,
@@ -130,7 +126,7 @@ def test_scheduler(broker):
schedule = Schedule.objects.get(pk=schedule.pk) schedule = Schedule.objects.get(pk=schedule.pk)
assert schedule.next_run < now assert schedule.next_run < now
# Catch up off # Catch up off
Conf.CATCH_UP = False monkeypatch.setattr(Conf, 'CATCH_UP', False)
scheduler(broker=broker) scheduler(broker=broker)
schedule = Schedule.objects.get(pk=schedule.pk) schedule = Schedule.objects.get(pk=schedule.pk)
assert schedule.next_run > now assert schedule.next_run > now