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

View File

@@ -11,8 +11,8 @@ from django_q.signing import SignedPackage
@pytest.mark.django_db
def test_admin_views(admin_client):
Conf.ORM = 'default'
def test_admin_views(admin_client, monkeypatch):
monkeypatch.setattr(Conf, 'ORM', 'default')
s = schedule('schedule.test')
tag = uuid()
f = Task.objects.create(
@@ -78,5 +78,3 @@ def test_admin_views(admin_client):
data = {'post': 'yes'}
response = admin_client.post(url, data)
assert response.status_code == 302
# cleanup
Conf.ORM = None

View File

@@ -9,7 +9,7 @@ from django_q.conf import Conf
from django_q.humanhash import uuid
def test_broker():
def test_broker(monkeypatch):
broker = Broker()
broker.enqueue('test')
broker.dequeue()
@@ -27,39 +27,35 @@ def test_broker():
assert broker.get_stat('test_1') == 'test'
assert broker.get_stats('test:*')[0] == 'test'
# stats with no cache
Conf.CACHE = 'not_configured'
monkeypatch.setattr(Conf, 'CACHE', 'not_configured')
broker.cache = broker.get_cache()
assert broker.get_stat('test_1') is None
broker.set_stat('test_1', 'test', 3)
assert broker.get_stat('test_1') is None
assert broker.get_stats('test:*') is None
Conf.CACHE = 'default'
def test_redis():
Conf.DJANGO_REDIS = None
def test_redis(monkeypatch):
monkeypatch.setattr(Conf, 'DJANGO_REDIS', None)
broker = get_broker()
assert broker.ping() is True
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()
with pytest.raises(Exception):
broker.ping()
Conf.REDIS = None
Conf.DJANGO_REDIS = 'default'
def test_custom():
Conf.BROKER_CLASS = 'brokers.redis_broker.Redis'
def test_custom(monkeypatch):
monkeypatch.setattr(Conf, 'BROKER_CLASS', 'brokers.redis_broker.Redis')
broker = get_broker()
assert broker.ping() is True
assert broker.info() is not None
assert broker.__class__.__name__ == 'Redis'
Conf.BROKER_CLASS = None
def test_disque():
Conf.DISQUE_NODES = ['127.0.0.1:7711']
def test_disque(monkeypatch):
monkeypatch.setattr(Conf, 'DISQUE_NODES', ['127.0.0.1:7711'])
# check broker
broker = get_broker(list_key='disque_test')
assert broker.ping() is True
@@ -75,7 +71,7 @@ def test_disque():
broker.acknowledge(task[0])
assert broker.queue_size() == 0
# Retry test
Conf.RETRY = 1
monkeypatch.setattr(Conf, 'RETRY', 1)
broker.enqueue('test')
assert broker.queue_size() == 1
broker.dequeue()
@@ -97,8 +93,8 @@ def test_disque():
# bulk test
for i in range(5):
broker.enqueue('test')
Conf.BULK = 5
Conf.DISQUE_FASTACK = True
monkeypatch.setattr(Conf, 'BULK', 5)
monkeypatch.setattr(Conf, 'DISQUE_FASTACK', True)
tasks = broker.dequeue()
for task in tasks:
assert task is not None
@@ -111,21 +107,16 @@ def test_disque():
broker.delete_queue()
assert broker.queue_size() == 0
# 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):
broker.get_connection()
# back to django-redis
Conf.DISQUE_NODES = None
Conf.DISQUE_FASTACK = False
@pytest.mark.skipif(not os.getenv('IRON_MQ_TOKEN'),
reason="requires IronMQ credentials")
def test_ironmq():
Conf.DISQUE_NODES = None
Conf.SQS = None
Conf.IRON_MQ = {'token': os.getenv('IRON_MQ_TOKEN'),
'project_id': os.getenv('IRON_MQ_PROJECT_ID')}
def test_ironmq(monkeypatch):
monkeypatch.setattr(Conf, 'IRON_MQ', {'token': os.getenv('IRON_MQ_TOKEN'),
'project_id': os.getenv('IRON_MQ_PROJECT_ID')})
# check broker
broker = get_broker(list_key=uuid()[0])
assert broker.ping() is True
@@ -143,7 +134,7 @@ def test_ironmq():
broker.acknowledge(task[0])
assert broker.dequeue() is None
# Retry test
# Conf.RETRY = 1
# monkeypatch.setattr(Conf, 'RETRY', 1)
# broker.enqueue('test')
# assert broker.dequeue() is not None
# sleep(3)
@@ -162,7 +153,7 @@ def test_ironmq():
# bulk test
for i in range(5):
broker.enqueue('test')
Conf.BULK = 5
monkeypatch.setattr(Conf, 'BULK', 5)
tasks = broker.dequeue()
for task in tasks:
assert task is not None
@@ -175,19 +166,14 @@ def test_ironmq():
broker.purge_queue()
assert broker.dequeue() is None
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'),
reason="requires AWS credentials")
def test_sqs():
Conf.IRON_MQ = None
Conf.DISQUE_NODES = None
Conf.SQS = {'aws_region': os.getenv('AWS_REGION'),
'aws_access_key_id': os.getenv('AWS_ACCESS_KEY_ID'),
'aws_secret_access_key': os.getenv('AWS_SECRET_ACCESS_KEY')}
def test_sqs(monkeypatch):
monkeypatch.setattr(Conf, 'SQS', {'aws_region': os.getenv('AWS_REGION'),
'aws_access_key_id': os.getenv('AWS_ACCESS_KEY_ID'),
'aws_secret_access_key': os.getenv('AWS_SECRET_ACCESS_KEY')})
# check broker
broker = get_broker(list_key=uuid()[0])
assert broker.ping() is True
@@ -201,7 +187,7 @@ def test_sqs():
broker.acknowledge(task[0])
assert broker.dequeue() is None
# Retry test
Conf.RETRY = 1
monkeypatch.setattr(Conf, 'RETRY', 1)
broker.enqueue('test')
assert broker.dequeue() is not None
sleep(2)
@@ -222,7 +208,7 @@ def test_sqs():
# bulk test
for i in range(10):
broker.enqueue('test')
Conf.BULK = 12
monkeypatch.setattr(Conf, 'BULK', 12)
tasks = broker.dequeue()
for task in tasks:
assert task is not None
@@ -234,15 +220,11 @@ def test_sqs():
broker.enqueue('test')
broker.purge_queue()
broker.delete_queue()
# back to django-redis
Conf.SQS = None
Conf.BULK = 1
Conf.DJANGO_REDIS = 'default'
@pytest.mark.django_db
def test_orm():
Conf.ORM = 'default'
def test_orm(monkeypatch):
monkeypatch.setattr(Conf, 'ORM', 'default')
# check broker
broker = get_broker(list_key='orm_test')
assert broker.ping() is True
@@ -258,7 +240,7 @@ def test_orm():
broker.acknowledge(task[0])
assert broker.queue_size() == 0
# Retry test
Conf.RETRY = 1
monkeypatch.setattr(Conf, 'RETRY', 1)
broker.enqueue('test')
assert broker.queue_size() == 1
broker.dequeue()
@@ -280,7 +262,7 @@ def test_orm():
# bulk test
for i in range(5):
broker.enqueue('test')
Conf.BULK = 5
monkeypatch.setattr(Conf, 'BULK', 5)
tasks = broker.dequeue()
assert broker.lock_size() == Conf.BULK
for task in tasks:
@@ -295,13 +277,11 @@ def test_orm():
broker.enqueue('test')
broker.delete_queue()
assert broker.queue_size() == 0
# back to django-redis
Conf.ORM = None
@pytest.mark.django_db
def test_mongo():
Conf.MONGO = {'host': '127.0.0.1', 'port': 27017}
def test_mongo(monkeypatch):
monkeypatch.setattr(Conf, 'MONGO', {'host': '127.0.0.1', 'port': 27017})
# check broker
broker = get_broker(list_key='mongo_test')
assert broker.ping() is True
@@ -317,7 +297,7 @@ def test_mongo():
broker.acknowledge(task[0])
assert broker.queue_size() == 0
# Retry test
Conf.RETRY = 1
monkeypatch.setattr(Conf, 'RETRY', 1)
broker.enqueue('test')
assert broker.queue_size() == 1
broker.dequeue()
@@ -356,5 +336,3 @@ def test_mongo():
broker.purge_queue()
broker.delete_queue()
assert broker.queue_size() == 0
# back to django-redis
Conf.ORM = None

View File

@@ -10,13 +10,8 @@ from django_q.brokers import get_broker
@pytest.fixture
def broker():
Conf.DISQUE_NODES = None
Conf.IRON_MQ = None
Conf.SQS = None
Conf.ORM = None
Conf.MONGO = None
Conf.DJANGO_REDIS = 'default'
def broker(monkeypatch):
monkeypatch.setattr(Conf, 'DJANGO_REDIS', 'default')
return get_broker()
@@ -148,7 +143,7 @@ def test_chain(broker):
@pytest.mark.django_db
def test_async_class(broker):
def test_async_class(broker, monkeypatch):
broker.purge_queue()
broker.cache.clear()
a = Async('math.copysign')
@@ -186,10 +181,8 @@ def test_async_class(broker):
assert a.result_group() == [-1]
assert a.fetch_group() == [a.fetch()]
# global overrides
Conf.SYNC = True
Conf.CACHED = True
monkeypatch.setattr(Conf, 'SYNC', True)
monkeypatch.setattr(Conf, 'CACHED', True)
a = Async('math.floor', 1.5)
a.run()
assert a.result() == 1
Conf.SYNC = False
Conf.CACHED = False

View File

@@ -29,13 +29,8 @@ class WordClass(object):
@pytest.fixture
def broker():
Conf.DISQUE_NODES = None
Conf.IRON_MQ = None
Conf.SQS = None
Conf.ORM = None
Conf.MONGO = None
Conf.DJANGO_REDIS = 'default'
def broker(monkeypatch):
monkeypatch.setattr(Conf, 'DJANGO_REDIS', 'default')
return get_broker()
@@ -281,7 +276,7 @@ def test_timeout_override(broker):
@pytest.mark.django_db
def test_recycle(broker):
def test_recycle(broker, monkeypatch):
# set up the Sentinel
broker.list_key = 'test_recycle_test:q'
async('django_q.tests.tasks.multiply', 2, 2, broker=broker)
@@ -290,8 +285,8 @@ def test_recycle(broker):
start_event = Event()
stop_event = Event()
# override settings
Conf.RECYCLE = 2
Conf.WORKERS = 1
monkeypatch.setattr(Conf, 'RECYCLE', 2)
monkeypatch.setattr(Conf, 'WORKERS', 1)
# set a timer to stop the Sentinel
threading.Timer(3, stop_event.set).start()
s = Sentinel(stop_event, start_event, broker=broker)
@@ -310,7 +305,7 @@ def test_recycle(broker):
# check if the work has been done
assert result_queue.qsize() == 2
# save_limit test
Conf.SAVE_LIMIT = 1
monkeypatch.setattr(Conf, 'SAVE_LIMIT', 1)
result_queue.put('STOP')
# run monitor
monitor(result_queue)
@@ -361,14 +356,14 @@ def test_update_failed(broker):
sleep(0.5)
# second save - no success
old_stopped = task['stopped']
task['stopped']=timezone.now()
task['stopped'] = timezone.now()
save_task(task, broker)
saved_task = Task.objects.get(id=task['id'])
assert saved_task.stopped > old_stopped
# third save - success
task['stopped']=timezone.now()
task['result']='result'
task['success']=True
task['stopped'] = timezone.now()
task['result'] = 'result'
task['success'] = True
save_task(task, broker)
saved_task = Task.objects.get(id=task['id'])
assert saved_task.success is True
@@ -383,9 +378,6 @@ def test_update_failed(broker):
assert saved_task.result == 'result'
@pytest.mark.django_db
def assert_result(task):
assert task is not None

View File

@@ -9,7 +9,7 @@ from django_q.conf import Conf
@pytest.mark.django_db
def test_monitor():
def test_monitor(monkeypatch):
assert Stat.get(0).sentinel == 0
c = Cluster()
c.start()
@@ -25,14 +25,13 @@ def test_monitor():
break
assert found_c is True
# test lock size
Conf.ORM = 'default'
monkeypatch.setattr(Conf, 'ORM', 'default')
b = get_broker('monitor_test')
b.enqueue('test')
b.dequeue()
assert b.lock_size() == 1
monitor(run_once=True, broker=b)
b.delete_queue()
Conf.ORM = None
@pytest.mark.django_db

View File

@@ -13,17 +13,13 @@ from django_q.tasks import Schedule, fetch, schedule as create_schedule
@pytest.fixture
def broker():
Conf.DISQUE_NODES = None
Conf.IRON_MQ = None
Conf.SQS = None
Conf.ORM = None
Conf.DJANGO_REDIS = 'default'
def broker(monkeypatch):
monkeypatch.setattr(Conf, 'DJANGO_REDIS', 'default')
return get_broker()
@pytest.mark.django_db
def test_scheduler(broker):
def test_scheduler(broker, monkeypatch):
broker.list_key = 'scheduler_test:q'
broker.delete_queue()
schedule = create_schedule('math.copysign',
@@ -117,7 +113,7 @@ def test_scheduler(broker):
# ONCE schedule should be deleted
assert Schedule.objects.filter(pk=once_schedule.pk).exists() is False
# Catch up On
Conf.CATCH_UP = True
monkeypatch.setattr(Conf, 'CATCH_UP', True)
now = timezone.now()
schedule = create_schedule('django_q.tests.tasks.word_multiply',
2,
@@ -130,7 +126,7 @@ def test_scheduler(broker):
schedule = Schedule.objects.get(pk=schedule.pk)
assert schedule.next_run < now
# Catch up off
Conf.CATCH_UP = False
monkeypatch.setattr(Conf, 'CATCH_UP', False)
scheduler(broker=broker)
schedule = Schedule.objects.get(pk=schedule.pk)
assert schedule.next_run > now