From d72e32cfc14cbd8eff72751b0c42eed6046e43ae Mon Sep 17 00:00:00 2001 From: Marcus Martins Date: Thu, 8 Jan 2015 12:56:33 -0800 Subject: [PATCH] Allow redis connections to be mocked outside tests Use a mocked instance of redis outside tests so we can use it on django projects. --- defender/connection.py | 21 ++++++++++++++------- defender/tests.py | 19 +++---------------- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/defender/connection.py b/defender/connection.py index 8f150c3..b667879 100644 --- a/defender/connection.py +++ b/defender/connection.py @@ -1,3 +1,4 @@ +import mockredis import redis try: import urlparse @@ -10,14 +11,20 @@ from . import config urlparse.uses_netloc.append("redis") +mocked_redis = mockredis.mock_strict_redis_client() + + def get_redis_connection(): - """ Get the redis connection """ - redis_config = parse_redis_url(config.DEFENDER_REDIS_URL) - return redis.StrictRedis( - host=redis_config.get('HOST'), - port=redis_config.get('PORT'), - db=redis_config.get('DB'), - password=redis_config.get('PASSWORD')) + """ Get the redis connection if not using mock """ + if config.MOCK_REDIS: # pragma: no cover + return mocked_redis # pragma: no cover + else: # pragma: no cover + redis_config = parse_redis_url(config.DEFENDER_REDIS_URL) + return redis.StrictRedis( + host=redis_config.get('HOST'), + port=redis_config.get('PORT'), + db=redis_config.get('DB'), + password=redis_config.get('PASSWORD')) def parse_redis_url(url): diff --git a/defender/tests.py b/defender/tests.py index ba3e38a..ef63ba4 100644 --- a/defender/tests.py +++ b/defender/tests.py @@ -3,7 +3,6 @@ import string import time from mock import patch -import mockredis from django.test import TestCase from django.test.client import RequestFactory @@ -14,21 +13,11 @@ from django.core.urlresolvers import NoReverseMatch from django.core.urlresolvers import reverse from django.http import HttpRequest -from .connection import parse_redis_url +from .connection import parse_redis_url, get_redis_connection from . import utils from . import config from .models import AccessAttempt -mocked_redis = mockredis.mock_strict_redis_client() - - -def mock_get_connection(): - if config.MOCK_REDIS: # pragma: no cover - return mocked_redis # pragma: no cover - else: # pragma: no cover - from .connection import get_redis_connection # pragma: no cover - return get_redis_connection() # pragma: no cover - # Django >= 1.7 compatibility try: @@ -39,8 +28,6 @@ except NoReverseMatch: LOGIN_FORM_KEY = 'this_is_the_login_form' -@patch('defender.connection.get_redis_connection', mock_get_connection) -@patch('defender.utils.redis_server', mock_get_connection()) class AccessAttemptTest(TestCase): """ Test case using custom settings for testing """ @@ -81,7 +68,7 @@ class AccessAttemptTest(TestCase): def tearDown(self): """ clean up the db """ - mock_get_connection().flushdb() + get_redis_connection().flushdb() def test_login_get(self): """ visit the login page """ @@ -141,7 +128,7 @@ class AccessAttemptTest(TestCase): if config.MOCK_REDIS: # mock redis require that we expire on our own - mock_get_connection().do_expire() # pragma: no cover + get_redis_connection().do_expire() # pragma: no cover # It should be possible to login again, make sure it is. self.test_valid_login()