From 84c03ecaf83f5008ee6a6ad6427ffe75652c69df Mon Sep 17 00:00:00 2001 From: Matt Robenolt Date: Tue, 3 Feb 2015 13:07:00 -0800 Subject: [PATCH] Minor refactor to take advantage of pre-calculated settings Also optimize some lookups to be O(1) vs O(n) --- django_seo_js/backends/base.py | 15 ++-- django_seo_js/backends/prerender.py | 35 ++++---- django_seo_js/helpers.py | 82 +++---------------- django_seo_js/middleware/hashbang.py | 26 ++++-- django_seo_js/middleware/useragent.py | 59 +++++-------- django_seo_js/settings.py | 70 ++++++++++++++++ django_seo_js/tests/backends/test_base.py | 4 +- .../tests/backends/test_prerender_hosted.py | 14 ++-- .../tests/backends/test_prerender_io.py | 6 +- django_seo_js/tests/test_helpers.py | 14 +--- django_seo_js/tests/test_middlewares.py | 70 +++++++--------- django_seo_js/tests/utils.py | 30 +++++++ 12 files changed, 216 insertions(+), 209 deletions(-) create mode 100644 django_seo_js/settings.py create mode 100644 django_seo_js/tests/utils.py diff --git a/django_seo_js/backends/base.py b/django_seo_js/backends/base.py index 17bfd84..d2253c8 100644 --- a/django_seo_js/backends/base.py +++ b/django_seo_js/backends/base.py @@ -1,25 +1,20 @@ import importlib import requests -from django.conf import settings from django.http import HttpResponse +from django_seo_js import settings -DEFAULT_BACKEND = "django_seo_js.backends.PrerenderIO" -IGNORED_HEADERS = [ +IGNORED_HEADERS = frozenset(( 'connection', 'keep-alive', 'proxy-authenticate', 'proxy-authorization', 'te', 'trailers', 'transfer-encoding', 'upgrade', 'content-length', 'content-encoding' -] +)) class SelectedBackend(object): def __init__(self, *args, **kwargs): - if getattr(settings, "SEO_JS_BACKEND", None): - module_path = getattr(settings, "SEO_JS_BACKEND") - else: - module_path = DEFAULT_BACKEND - + module_path = settings.BACKEND backend_module = importlib.import_module(".".join(module_path.split(".")[:-1])) self.backend = getattr(backend_module, module_path.split(".")[-1])() @@ -46,7 +41,7 @@ class RequestsBasedBackend(object): def __init__(self, *args, **kwargs): super(RequestsBasedBackend, self).__init__(*args, **kwargs) - self.requests = requests + self.session = requests.Session() def build_django_response_from_requests_response(self, response): r = HttpResponse(response.content) diff --git a/django_seo_js/backends/prerender.py b/django_seo_js/backends/prerender.py index 89c35bd..0170c51 100644 --- a/django_seo_js/backends/prerender.py +++ b/django_seo_js/backends/prerender.py @@ -1,20 +1,20 @@ -from django.conf import settings +from django_seo_js import settings from base import SEOBackendBase, RequestsBasedBackend class PrerenderIO(SEOBackendBase, RequestsBasedBackend): """Implements the backend for prerender.io""" - BASE_URL = "http://service.prerender.io/" - RECACHE_URL = "http://api.prerender.io/recache" + BASE_URL = "https://service.prerender.io/" + RECACHE_URL = "https://api.prerender.io/recache" def __init__(self, *args, **kwargs): super(SEOBackendBase, self).__init__(*args, **kwargs) self.token = self._get_token() def _get_token(self): - if not getattr(settings, "SEO_JS_PRERENDER_TOKEN"): + if settings.PRERENDER_TOKEN is None: raise ValueError("Missing SEO_JS_PRERENDER_TOKEN in settings.") - return settings.SEO_JS_PRERENDER_TOKEN + return settings.PRERENDER_TOKEN def get_response_for_url(self, url): """ @@ -24,13 +24,13 @@ def get_response_for_url(self, url): if not url or "//" not in url: raise ValueError("Missing or invalid url: %s" % url) - render_url = "%s%s" % (self.BASE_URL, url) + + render_url = self.BASE_URL + url headers = { 'X-Prerender-Token': self.token, - 'Accept-Encoding': 'gzip', } - r = self.requests.get(render_url, headers=headers) - assert int(r.status_code) < 500 + r = self.session.get(render_url, headers=headers) + assert r.status_code < 500 return self.build_django_response_from_requests_response(r) @@ -45,19 +45,18 @@ def update_url(self, url=None, regex=None): headers = { 'X-Prerender-Token': self.token, - 'Content-type': 'application/json', - 'Accept-Encoding': 'gzip', + 'Content-Type': 'application/json', } data = { - 'prerenderToken': settings.SEO_JS_PRERENDER_TOKEN, + 'prerenderToken': settings.PRERENDER_TOKEN, } if url: data["url"] = url if regex: data["regex"] = regex - r = self.requests.post(self.RECACHE_URL, headers=headers, data=data) - return int(r.status_code) < 500 + r = self.session.post(self.RECACHE_URL, headers=headers, data=data) + return r.status_code < 500 class PrerenderHosted(PrerenderIO): @@ -67,13 +66,13 @@ class PrerenderHosted(PrerenderIO): def __init__(self, *args, **kwargs): super(SEOBackendBase, self).__init__(*args, **kwargs) self.token = "" - if not getattr(settings, "SEO_JS_PRERENDER_URL", None): + if not settings.PRERENDER_URL: raise ValueError("Missing SEO_JS_PRERENDER_URL in settings.") - if not getattr(settings, "SEO_JS_PRERENDER_RECACHE_URL", None): + if not settings.PRERENDER_RECACHE_URL: raise ValueError("Missing SEO_JS_PRERENDER_RECACHE_URL in settings.") - self.BASE_URL = getattr(settings, "SEO_JS_PRERENDER_URL") - self.RECACHE_URL = getattr(settings, "SEO_JS_PRERENDER_RECACHE_URL") + self.BASE_URL = settings.PRERENDER_URL + self.RECACHE_URL = settings.PRERENDER_RECACHE_URL def _get_token(self): pass diff --git a/django_seo_js/helpers.py b/django_seo_js/helpers.py index 3fb98d4..20df024 100644 --- a/django_seo_js/helpers.py +++ b/django_seo_js/helpers.py @@ -1,84 +1,24 @@ -from django.conf import settings +from django_seo_js import settings from django_seo_js.backends import SelectedBackend -DEFAULT_IGNORED_EXTENSIONS = [ - ".js", - ".css", - ".xml", - ".less", - ".png", - ".jpg", - ".jpeg", - ".gif", - ".pdf", - ".doc", - ".txt", - ".ico", - ".rss", - ".zip", - ".mp3", - ".rar", - ".exe", - ".wmv", - ".doc", - ".avi", - ".ppt", - ".mpg", - ".mpeg", - ".tif", - ".wav", - ".mov", - ".psd", - ".ai", - ".xls", - ".mp4", - ".m4a", - ".swf", - ".dat", - ".dmg", - ".iso", - ".flv", - ".m4v", - ".torrent" -] - - def update_cache_for_url(url): - if getattr(settings, "SEO_JS_ENABLED", not settings.DEBUG): + if settings.ENABLED: selector = SelectedBackend() return selector.backend.update_url(url) return False def request_should_be_ignored(request): - # TODO: move these to a central settings/default area ala appconf. - # Note it's tougher than it looks because of the override_settings - # magical injection in tests. - if getattr(settings, "SEO_JS_IGNORE_URLS", None): - IGNORE_URLS = settings.SEO_JS_IGNORE_URLS - else: - IGNORE_URLS = ["/sitemap.xml", ] - - ignore = False - for url in IGNORE_URLS: + for url in settings.IGNORE_URLS: if url in request.path: - ignore = True - break + return True - if not ignore: - if getattr(settings, "SEO_JS_IGNORE_EXTENSIONS", None) is not None: - IGNORED_EXTENSIONS = settings.SEO_JS_IGNORE_EXTENSIONS - else: - IGNORED_EXTENSIONS = DEFAULT_IGNORED_EXTENSIONS - extension = None - last_dot = request.path.rfind(".") - if last_dot != -1: - extension = request.path[last_dot:] - if extension: - for ext in IGNORED_EXTENSIONS: - if extension == ext: - ignore = True - break + extension = None + last_dot = request.path.rfind(".") + if last_dot == -1: + # No extension found + return False - return ignore + extension = request.path[last_dot:] + return extension and extension in settings.IGNORE_EXTENSIONS diff --git a/django_seo_js/middleware/hashbang.py b/django_seo_js/middleware/hashbang.py index 6458493..8cdddf4 100644 --- a/django_seo_js/middleware/hashbang.py +++ b/django_seo_js/middleware/hashbang.py @@ -1,16 +1,24 @@ +from django_seo_js import settings from django_seo_js.backends import SelectedBackend from django_seo_js.helpers import request_should_be_ignored -from django.conf import settings + +import logging +logger = logging.getLogger(__name__) class HashBangMiddleware(SelectedBackend): def process_request(self, request): - if not request_should_be_ignored(request) and\ - getattr(settings, "SEO_JS_ENABLED", not settings.DEBUG) and\ - "_escaped_fragment_" in request.GET: + if not settings.ENABLED: + return + + if request_should_be_ignored(request): + return + + if "_escaped_fragment_" not in request.GET: + return - url = request.build_absolute_uri() - try: - return self.backend.get_response_for_url(url) - except: - pass + url = request.build_absolute_uri() + try: + return self.backend.get_response_for_url(url) + except Exception as e: + logger.exception(e) diff --git a/django_seo_js/middleware/useragent.py b/django_seo_js/middleware/useragent.py index 8234ba4..9558a77 100644 --- a/django_seo_js/middleware/useragent.py +++ b/django_seo_js/middleware/useragent.py @@ -1,51 +1,34 @@ import re -from django.conf import settings +from django_seo_js import settings from django_seo_js.backends import SelectedBackend from django_seo_js.helpers import request_should_be_ignored - -DEFAULT_SEO_JS_USER_AGENTS = [ - "Googlebot", - "Yahoo", - "bingbot", - "Ask Jeeves", - "baiduspider", - "facebookexternalhit", - "twitterbot", - "rogerbot", - "linkedinbot", - "embedly", - "quoralink preview'", - "showyoubot", - "outbrain", - "pinterest", - "developersgoogle.com/+/web/snippet", -] +import logging +logger = logging.getLogger(__name__) class UserAgentMiddleware(SelectedBackend): def __init__(self, *args, **kwargs): super(UserAgentMiddleware, self).__init__(*args, **kwargs) - if getattr(settings, "SEO_JS_USER_AGENTS", None): - agents = getattr(settings, "SEO_JS_USER_AGENTS") - else: - agents = DEFAULT_SEO_JS_USER_AGENTS - regex_str = "|".join(agents) + regex_str = "|".join(settings.USER_AGENTS) regex_str = ".*?(%s)" % regex_str self.USER_AGENT_REGEX = re.compile(regex_str, re.IGNORECASE) def process_request(self, request): - # TODO: move to proper settings app pattern. - if ( - not request_should_be_ignored(request) and - getattr(settings, "SEO_JS_ENABLED", not settings.DEBUG) and - "HTTP_USER_AGENT" in request.META and - self.USER_AGENT_REGEX.match(request.META["HTTP_USER_AGENT"]) - ): - - url = request.build_absolute_uri() - - try: - return self.backend.get_response_for_url(url) - except: - pass + if not request.ENABLED: + return + + if request_should_be_ignored(request): + return + + if "HTTP_USER_AGENT" not in request.META: + return + + if not self.USER_AGENT_REGEX.match(request.META["HTTP_USER_AGENT"]): + return + + url = request.build_absolute_uri() + try: + return self.backend.get_response_for_url(url) + except Exception as e: + logger.exception(e) diff --git a/django_seo_js/settings.py b/django_seo_js/settings.py new file mode 100644 index 0000000..9ceb730 --- /dev/null +++ b/django_seo_js/settings.py @@ -0,0 +1,70 @@ +from django.conf import settings as django_settings + +ENABLED = getattr(django_settings, 'SEO_JS_ENABLED', not django_settings.DEBUG) + +IGNORE_URLS = frozenset(getattr(django_settings, 'SEO_JS_IGNORE_URLS', ['/sitemap.xml'])) + +IGNORE_EXTENSIONS = frozenset(getattr(django_settings, 'SEO_JS_IGNORE_EXTENSIONS', ( + ".js", + ".css", + ".xml", + ".less", + ".png", + ".jpg", + ".jpeg", + ".gif", + ".pdf", + ".doc", + ".txt", + ".ico", + ".rss", + ".zip", + ".mp3", + ".rar", + ".exe", + ".wmv", + ".doc", + ".avi", + ".ppt", + ".mpg", + ".mpeg", + ".tif", + ".wav", + ".mov", + ".psd", + ".ai", + ".xls", + ".mp4", + ".m4a", + ".swf", + ".dat", + ".dmg", + ".iso", + ".flv", + ".m4v", + ".torrent", +))) + +USER_AGENTS = frozenset(getattr(django_settings, 'SEO_JS_USER_AGENTS', ( + "Googlebot", + "Yahoo", + "bingbot", + "Ask Jeeves", + "baiduspider", + "facebookexternalhit", + "twitterbot", + "rogerbot", + "linkedinbot", + "embedly", + "quoralink preview'", + "showyoubot", + "outbrain", + "pinterest", + "developersgoogle.com/+/web/snippet", +))) + +BACKEND = getattr(django_settings, 'SEO_JS_BACKEND', 'django_seo_js.backends.PrerenderIO') + +PRERENDER_TOKEN = getattr(django_settings, 'SEO_JS_PRERENDER_TOKEN', None) +PRERENDER_URL = getattr(django_settings, 'SEO_JS_PRERENDER_URL', None) +PRERENDER_RECACHE_URL = getattr(django_settings, 'SEO_JS_PRERENDER_RECACHE_URL', None) diff --git a/django_seo_js/tests/backends/test_base.py b/django_seo_js/tests/backends/test_base.py index 60bc045..7a48036 100644 --- a/django_seo_js/tests/backends/test_base.py +++ b/django_seo_js/tests/backends/test_base.py @@ -1,6 +1,6 @@ from django.test import TestCase -from django.test.utils import override_settings +from django_seo_js.tests.utils import override_settings from django_seo_js.backends import PrerenderIO, SelectedBackend, SEOBackendBase, TestBackend @@ -21,7 +21,7 @@ def test_default_backend(self): s = SelectedBackend() self.assertTrue(isinstance(s.backend, PrerenderIO)) - @override_settings(SEO_JS_BACKEND='django_seo_js.backends.TestBackend') + @override_settings(BACKEND='django_seo_js.backends.TestBackend') def test_override_backend(self): s = SelectedBackend() self.assertTrue(isinstance(s.backend, TestBackend)) diff --git a/django_seo_js/tests/backends/test_prerender_hosted.py b/django_seo_js/tests/backends/test_prerender_hosted.py index 9397a5e..01aa4ec 100644 --- a/django_seo_js/tests/backends/test_prerender_hosted.py +++ b/django_seo_js/tests/backends/test_prerender_hosted.py @@ -2,9 +2,9 @@ import string from django.test import TestCase -from django.test.utils import override_settings from httmock import all_requests, HTTMock +from django_seo_js.tests.utils import override_settings from django_seo_js.backends import PrerenderHosted MOCK_RESPONSE = "

Hello, World!

" @@ -42,11 +42,11 @@ def mock_prerender_giant_response(url, request): class PrerenderHostedTestURLs(TestCase): - @override_settings(SEO_JS_PRERENDER_RECACHE_URL="http://example.com") + @override_settings(PRERENDER_RECACHE_URL="http://example.com") def test_init_throws_exception_if_render_url_is_missing(self): self.assertRaises(ValueError, PrerenderHosted) - @override_settings(SEO_JS_PRERENDER_URL="http://example.com") + @override_settings(PRERENDER_URL="http://example.com") def test_init_throws_exception_if_recache_url_is_missing(self): self.assertRaises(ValueError, PrerenderHosted) @@ -54,8 +54,8 @@ def test_init_throws_exception_if_both_urls_are_missing(self): self.assertRaises(ValueError, PrerenderHosted) @override_settings( - SEO_JS_PRERENDER_RECACHE_URL="http://example.com/recache", - SEO_JS_PRERENDER_URL="http://example.com" + PRERENDER_RECACHE_URL="http://example.com/recache", + PRERENDER_URL="http://example.com" ) def test_no_exception_if_both_are_provided(self): self.backend = PrerenderHosted() @@ -64,8 +64,8 @@ def test_no_exception_if_both_are_provided(self): class PrerenderHostedTestMethods(TestCase): @override_settings( - SEO_JS_PRERENDER_RECACHE_URL="http://example.com/recache", - SEO_JS_PRERENDER_URL="http://example.com" + PRERENDER_RECACHE_URL="http://example.com/recache", + PRERENDER_URL="http://example.com" ) def setUp(self): self.backend = PrerenderHosted() diff --git a/django_seo_js/tests/backends/test_prerender_io.py b/django_seo_js/tests/backends/test_prerender_io.py index 197a459..36b424d 100644 --- a/django_seo_js/tests/backends/test_prerender_io.py +++ b/django_seo_js/tests/backends/test_prerender_io.py @@ -1,7 +1,7 @@ from django.test import TestCase -from django.test.utils import override_settings from httmock import all_requests, HTTMock +from django_seo_js.tests.utils import override_settings from django_seo_js.backends import PrerenderIO MOCK_RESPONSE = "

Hello, World!

" @@ -30,11 +30,11 @@ def mock_prerender_response(url, request): class PrerenderIOTestToken(TestCase): - @override_settings(SEO_JS_PRERENDER_TOKEN=None) + @override_settings(PRERENDER_TOKEN=None) def test_get_token_throws_exception_if_missing(self): self.assertRaises(ValueError, PrerenderIO) - @override_settings(SEO_JS_PRERENDER_TOKEN="123124341adfsaf") + @override_settings(PRERENDER_TOKEN="123124341adfsaf") def test_get_token(self): self.backend = PrerenderIO() # Test function diff --git a/django_seo_js/tests/test_helpers.py b/django_seo_js/tests/test_helpers.py index d91b953..e6a39fa 100644 --- a/django_seo_js/tests/test_helpers.py +++ b/django_seo_js/tests/test_helpers.py @@ -1,25 +1,19 @@ from django.test import TestCase -from django.test.utils import override_settings +from django_seo_js.tests.utils import override_settings from django_seo_js.middleware import HashBangMiddleware class HelpersTest(TestCase): - @override_settings(SEO_JS_BACKEND='django_seo_js.backends.TestBackend') + @override_settings(BACKEND='django_seo_js.backends.TestBackend') def test_update_the_render_cache(self): from django_seo_js.helpers import update_cache_for_url self.middleware = HashBangMiddleware() self.assertEqual(update_cache_for_url("http://example.com"), True) - @override_settings(SEO_JS_BACKEND='django_seo_js.backends.TestBackend', DEBUG=True) - def test_update_skips_if_disabled_via_debug(self): - from django_seo_js.helpers import update_cache_for_url - self.middleware = HashBangMiddleware() - self.assertEqual(update_cache_for_url("http://example.com"), False) - - @override_settings(SEO_JS_BACKEND='django_seo_js.backends.TestBackend', SEO_JS_ENABLED=False) - def test_update_skips_if_disabled_via_enabled(self): + @override_settings(BACKEND='django_seo_js.backends.TestBackend', ENABLED=False) + def test_update_skips_if_disabled(self): from django_seo_js.helpers import update_cache_for_url self.middleware = HashBangMiddleware() self.assertEqual(update_cache_for_url("http://example.com"), False) diff --git a/django_seo_js/tests/test_middlewares.py b/django_seo_js/tests/test_middlewares.py index 20ab60c..c547530 100644 --- a/django_seo_js/tests/test_middlewares.py +++ b/django_seo_js/tests/test_middlewares.py @@ -1,9 +1,11 @@ from mock import Mock from django.test import TestCase -from django.test.utils import override_settings +from django_seo_js.tests.utils import override_settings from django_seo_js.middleware import HashBangMiddleware, UserAgentMiddleware +print override_settings + class BaseMiddlewareTest(TestCase): pass @@ -11,7 +13,7 @@ class BaseMiddlewareTest(TestCase): class HashBangMiddlewareTest(TestCase): - @override_settings(SEO_JS_BACKEND='django_seo_js.backends.TestBackend') + @override_settings(BACKEND='django_seo_js.backends.TestBackend') def setUp(self): super(HashBangMiddlewareTest, self).setUp() self.middleware = HashBangMiddleware() @@ -27,25 +29,19 @@ def test_does_not_have_escaped_fragment(self): self.request.GET = {} self.assertEqual(self.middleware.process_request(self.request), None) - @override_settings(SEO_JS_BACKEND='django_seo_js.backends.TestBackend', DEBUG=True) - def test_has_escaped_fragment_skips_if_disabled_via_debug(self): - self.middleware = HashBangMiddleware() - self.request.GET = {} - self.assertEqual(self.middleware.process_request(self.request), None) - - @override_settings(SEO_JS_BACKEND='django_seo_js.backends.TestBackend', SEO_JS_ENABLED=False) + @override_settings(BACKEND='django_seo_js.backends.TestBackend', ENABLED=False) def test_has_escaped_fragment_skips_if_disabled_via_enabled(self): self.middleware = HashBangMiddleware() self.request.GET = {} self.assertEqual(self.middleware.process_request(self.request), None) - @override_settings(SEO_JS_BACKEND='django_seo_js.backends.TestServiceDownBackend') + @override_settings(BACKEND='django_seo_js.backends.TestServiceDownBackend') def test_has_escaped_fragment_skips_if_service_is_down(self): self.middleware = HashBangMiddleware() self.request.GET = {"_escaped_fragment_": None} self.assertEqual(self.middleware.process_request(self.request), None) - @override_settings(SEO_JS_BACKEND='django_seo_js.backends.TestBackend') + @override_settings(BACKEND='django_seo_js.backends.TestBackend') def test_overriding_skips_sitemap_xml_by_default(self): self.middleware = HashBangMiddleware() self.request.path = "/sitemap.xml" @@ -53,9 +49,9 @@ def test_overriding_skips_sitemap_xml_by_default(self): self.assertEqual(self.middleware.process_request(self.request), None) @override_settings( - SEO_JS_BACKEND='django_seo_js.backends.TestBackend', - SEO_JS_IGNORE_URLS=["/foo.html", "/bar/ibbity.html", ], - SEO_JS_IGNORE_EXTENSIONS=[], + BACKEND='django_seo_js.backends.TestBackend', + IGNORE_URLS=["/foo.html", "/bar/ibbity.html", ], + IGNORE_EXTENSIONS=[], ) def test_overriding_skips_custom_overrides_xml_by_default(self): self.middleware = HashBangMiddleware() @@ -69,7 +65,7 @@ def test_overriding_skips_custom_overrides_xml_by_default(self): self.request.path = "/bar/ibbity.html" self.assertEqual(self.middleware.process_request(self.request), None) - @override_settings(SEO_JS_BACKEND='django_seo_js.backends.TestBackend') + @override_settings(BACKEND='django_seo_js.backends.TestBackend') def test_overriding_skips_gifs_by_default(self): self.middleware = HashBangMiddleware() self.request.path = "/sitemap.xml" @@ -77,8 +73,8 @@ def test_overriding_skips_gifs_by_default(self): self.assertEqual(self.middleware.process_request(self.request), None) @override_settings( - SEO_JS_BACKEND='django_seo_js.backends.TestBackend', - SEO_JS_IGNORE_EXTENSIONS=[".html", ".txt", ] + BACKEND='django_seo_js.backends.TestBackend', + IGNORE_EXTENSIONS=[".html", ".txt", ] ) def test_overriding_skips_custom_overrides_gifs_by_default(self): self.middleware = HashBangMiddleware() @@ -95,7 +91,7 @@ def test_overriding_skips_custom_overrides_gifs_by_default(self): class UserAgentMiddlewareTest(TestCase): - @override_settings(SEO_JS_BACKEND='django_seo_js.backends.TestBackend') + @override_settings(BACKEND='django_seo_js.backends.TestBackend') def setUp(self): super(UserAgentMiddlewareTest, self).setUp() self.middleware = UserAgentMiddleware() @@ -116,8 +112,8 @@ def test_does_not_match_one_of_the_default_user_agents(self): self.assertEqual(self.middleware.process_request(self.request), None) @override_settings( - SEO_JS_USER_AGENTS=["TestUserAgent", ], - SEO_JS_BACKEND='django_seo_js.backends.TestBackend' + USER_AGENTS=["TestUserAgent", ], + BACKEND='django_seo_js.backends.TestBackend' ) def test_overriding_matches(self): self.middleware = UserAgentMiddleware() @@ -127,8 +123,8 @@ def test_overriding_matches(self): self.assertEqual(self.middleware.process_request(self.request).content, "Test") @override_settings( - SEO_JS_USER_AGENTS=["TestUserAgent", ], - SEO_JS_BACKEND='django_seo_js.backends.TestBackend' + USER_AGENTS=["TestUserAgent", ], + BACKEND='django_seo_js.backends.TestBackend' ) def test_overriding_does_not_match_properly(self): self.middleware = UserAgentMiddleware() @@ -138,23 +134,15 @@ def test_overriding_does_not_match_properly(self): self.assertEqual(self.middleware.process_request(self.request), None) @override_settings( - SEO_JS_USER_AGENTS=["TestUserAgent", ], - SEO_JS_BACKEND='django_seo_js.backends.TestBackend' + USER_AGENTS=["TestUserAgent", ], + BACKEND='django_seo_js.backends.TestBackend' ) def test_missing_user_agent_still_works(self): self.middleware = UserAgentMiddleware() self.request.META = {} self.assertEqual(self.middleware.process_request(self.request), None) - @override_settings(SEO_JS_BACKEND='django_seo_js.backends.TestBackend', DEBUG=True) - def test_overriding_matches_skips_if_disabled_via_debug(self): - self.middleware = UserAgentMiddleware() - self.request.META = { - "HTTP_USER_AGENT": "The TestUserAgent v1.0" - } - self.assertEqual(self.middleware.process_request(self.request), None) - - @override_settings(SEO_JS_BACKEND='django_seo_js.backends.TestBackend', SEO_JS_ENABLED=False) + @override_settings(BACKEND='django_seo_js.backends.TestBackend', ENABLED=False) def test_overriding_matches_skips_if_disabled_via_enabled(self): self.middleware = UserAgentMiddleware() self.request.META = { @@ -162,7 +150,7 @@ def test_overriding_matches_skips_if_disabled_via_enabled(self): } self.assertEqual(self.middleware.process_request(self.request), None) - @override_settings(SEO_JS_BACKEND='django_seo_js.backends.TestServiceDownBackend') + @override_settings(BACKEND='django_seo_js.backends.TestServiceDownBackend') def test_overriding_matches_skips_if_service_is_down(self): self.middleware = UserAgentMiddleware() self.request.META = { @@ -170,7 +158,7 @@ def test_overriding_matches_skips_if_service_is_down(self): } self.assertEqual(self.middleware.process_request(self.request), None) - @override_settings(SEO_JS_BACKEND='django_seo_js.backends.TestBackend') + @override_settings(BACKEND='django_seo_js.backends.TestBackend') def test_overriding_skips_sitemap_xml_by_default(self): self.middleware = UserAgentMiddleware() self.request.path = "/sitemap.xml" @@ -180,9 +168,9 @@ def test_overriding_skips_sitemap_xml_by_default(self): self.assertEqual(self.middleware.process_request(self.request), None) @override_settings( - SEO_JS_BACKEND='django_seo_js.backends.TestBackend', - SEO_JS_IGNORE_URLS=["/foo.html", "/bar/ibbity.html", ], - SEO_JS_IGNORE_EXTENSIONS=[], + BACKEND='django_seo_js.backends.TestBackend', + IGNORE_URLS=["/foo.html", "/bar/ibbity.html", ], + IGNORE_EXTENSIONS=[], ) def test_overriding_skips_custom_overrides_xml_by_default(self): self.middleware = UserAgentMiddleware() @@ -198,7 +186,7 @@ def test_overriding_skips_custom_overrides_xml_by_default(self): self.request.path = "/bar/ibbity.html" self.assertEqual(self.middleware.process_request(self.request), None) - @override_settings(SEO_JS_BACKEND='django_seo_js.backends.TestBackend') + @override_settings(BACKEND='django_seo_js.backends.TestBackend') def test_overriding_skips_gifs_by_default(self): self.middleware = UserAgentMiddleware() self.request.path = "/foo.gif" @@ -208,8 +196,8 @@ def test_overriding_skips_gifs_by_default(self): self.assertEqual(self.middleware.process_request(self.request), None) @override_settings( - SEO_JS_BACKEND='django_seo_js.backends.TestBackend', - SEO_JS_IGNORE_EXTENSIONS=[".html", ".txt", ] + BACKEND='django_seo_js.backends.TestBackend', + IGNORE_EXTENSIONS=[".html", ".txt", ] ) def test_overriding_skips_custom_overrides_gifs_by_default(self): self.middleware = UserAgentMiddleware() diff --git a/django_seo_js/tests/utils.py b/django_seo_js/tests/utils.py new file mode 100644 index 0000000..e9f2344 --- /dev/null +++ b/django_seo_js/tests/utils.py @@ -0,0 +1,30 @@ +from functools import wraps +from django_seo_js import settings + + +class override_settings(object): + def __init__(self, **kwargs): + self.options = kwargs + self.originals = {} + + def __enter__(self): + self.enable() + + def __exit__(self, exc_type, exc_value, traceback): + self.disable() + + def __call__(self, test_func): + @wraps(test_func) + def inner(*args, **kwargs): + with self: + return test_func(*args, **kwargs) + return inner + + def enable(self): + for k, v in self.options.items(): + self.originals[k] = getattr(settings, k) + setattr(settings, k, v) + + def disable(self): + for k, v in self.originals.items(): + setattr(settings, k, v)