From d86e494e8679d85b12925a19ebc04e4dc0ab3afd Mon Sep 17 00:00:00 2001 From: Markus Korn Date: Mon, 22 Jun 2015 14:04:46 +0200 Subject: [PATCH 1/4] test_quests: added TestSecure for the emulation of secure connections in test cases --- tests/test_request.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/test_request.py b/tests/test_request.py index ebf94530b..aaa14eaf2 100644 --- a/tests/test_request.py +++ b/tests/test_request.py @@ -275,3 +275,14 @@ class TestAuthSetter(TestCase): request = Request(factory.get('/')) request.auth = 'DUMMY' self.assertEqual(request.auth, 'DUMMY') + + +class TestSecure(TestCase): + + def test_default_secure_false(self): + request = Request(factory.get('/', secure=False)) + self.assertEqual(request.scheme, 'http') + + def test_default_secure_true(self): + request = Request(factory.get('/', secure=True)) + self.assertEqual(request.scheme, 'https') From 06c61fc51176f8145819ef4f0ac33eea827d0658 Mon Sep 17 00:00:00 2001 From: Markus Korn Date: Mon, 22 Jun 2015 14:05:56 +0200 Subject: [PATCH 2/4] compat: only add compat implementation of RequestFactory.generic() if not provided by django --- rest_framework/compat.py | 44 ++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/rest_framework/compat.py b/rest_framework/compat.py index 8555c21be..498eb8e5f 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -199,8 +199,6 @@ if 'patch' not in View.http_method_names: View.http_method_names = View.http_method_names + ['patch'] -# RequestFactory only provides `generic` from 1.5 onwards -from django.test.client import RequestFactory as DjangoRequestFactory from django.test.client import FakePayload try: @@ -211,24 +209,30 @@ except ImportError: from django.utils.encoding import smart_str as force_bytes_or_smart_bytes -class RequestFactory(DjangoRequestFactory): - def generic(self, method, path, - data='', content_type='application/octet-stream', **extra): - parsed = _urlparse(path) - data = force_bytes_or_smart_bytes(data, settings.DEFAULT_CHARSET) - r = { - 'PATH_INFO': self._get_path(parsed), - 'QUERY_STRING': force_text(parsed[4]), - 'REQUEST_METHOD': six.text_type(method), - } - if data: - r.update({ - 'CONTENT_LENGTH': len(data), - 'CONTENT_TYPE': six.text_type(content_type), - 'wsgi.input': FakePayload(data), - }) - r.update(extra) - return self.request(**r) +# RequestFactory only provides `generic` from 1.5 onwards +if django.VERSION < (1, 5): + from django.test.client import RequestFactory as DjangoRequestFactory + + class RequestFactory(DjangoRequestFactory): + def generic(self, method, path, + data='', content_type='application/octet-stream', **extra): + parsed = _urlparse(path) + data = force_bytes_or_smart_bytes(data, settings.DEFAULT_CHARSET) + r = { + 'PATH_INFO': self._get_path(parsed), + 'QUERY_STRING': force_text(parsed[4]), + 'REQUEST_METHOD': six.text_type(method), + } + if data: + r.update({ + 'CONTENT_LENGTH': len(data), + 'CONTENT_TYPE': six.text_type(content_type), + 'wsgi.input': FakePayload(data), + }) + r.update(extra) + return self.request(**r) +else: + from django.test.client import RequestFactory # Markdown is optional From aa1ad4fb64b38b77b6a3937756c9cd956de5c7e4 Mon Sep 17 00:00:00 2001 From: Markus Korn Date: Mon, 22 Jun 2015 14:28:09 +0200 Subject: [PATCH 3/4] test_requests TestSecure: skip tests for django versions where the secure argument is not available --- tests/test_request.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_request.py b/tests/test_request.py index aaa14eaf2..03d9f8e49 100644 --- a/tests/test_request.py +++ b/tests/test_request.py @@ -24,6 +24,8 @@ from rest_framework.test import APIRequestFactory, APIClient from rest_framework.views import APIView from io import BytesIO import json +import django +import pytest factory = APIRequestFactory() @@ -277,6 +279,8 @@ class TestAuthSetter(TestCase): self.assertEqual(request.auth, 'DUMMY') +@pytest.mark.skipif(django.VERSION < (1, 7), + reason='secure argument is only available for django1.7+') class TestSecure(TestCase): def test_default_secure_false(self): From b42b16d0e66394c78b19f16f102187e55211622e Mon Sep 17 00:00:00 2001 From: Markus Korn Date: Mon, 22 Jun 2015 16:13:42 +0200 Subject: [PATCH 4/4] compat: invert logic for checking the django version when implementing RequestFactory.generic() --- rest_framework/compat.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rest_framework/compat.py b/rest_framework/compat.py index 498eb8e5f..e7a73adda 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -210,7 +210,9 @@ except ImportError: # RequestFactory only provides `generic` from 1.5 onwards -if django.VERSION < (1, 5): +if django.VERSION >= (1, 5): + from django.test.client import RequestFactory +else: from django.test.client import RequestFactory as DjangoRequestFactory class RequestFactory(DjangoRequestFactory): @@ -231,8 +233,6 @@ if django.VERSION < (1, 5): }) r.update(extra) return self.request(**r) -else: - from django.test.client import RequestFactory # Markdown is optional