diff options
Diffstat (limited to 'rest_framework/tests/test_request.py')
| -rw-r--r-- | rest_framework/tests/test_request.py | 347 | 
1 files changed, 0 insertions, 347 deletions
diff --git a/rest_framework/tests/test_request.py b/rest_framework/tests/test_request.py deleted file mode 100644 index c0b50f33..00000000 --- a/rest_framework/tests/test_request.py +++ /dev/null @@ -1,347 +0,0 @@ -""" -Tests for content parsing, and form-overloaded content parsing. -""" -from __future__ import unicode_literals -from django.contrib.auth.models import User -from django.contrib.auth import authenticate, login, logout -from django.contrib.sessions.middleware import SessionMiddleware -from django.core.handlers.wsgi import WSGIRequest -from django.test import TestCase -from rest_framework import status -from rest_framework.authentication import SessionAuthentication -from rest_framework.compat import patterns -from rest_framework.parsers import ( -    BaseParser, -    FormParser, -    MultiPartParser, -    JSONParser -) -from rest_framework.request import Request, Empty -from rest_framework.response import Response -from rest_framework.settings import api_settings -from rest_framework.test import APIRequestFactory, APIClient -from rest_framework.views import APIView -from rest_framework.compat import six -from io import BytesIO -import json - - -factory = APIRequestFactory() - - -class PlainTextParser(BaseParser): -    media_type = 'text/plain' - -    def parse(self, stream, media_type=None, parser_context=None): -        """ -        Returns a 2-tuple of `(data, files)`. - -        `data` will simply be a string representing the body of the request. -        `files` will always be `None`. -        """ -        return stream.read() - - -class TestMethodOverloading(TestCase): -    def test_method(self): -        """ -        Request methods should be same as underlying request. -        """ -        request = Request(factory.get('/')) -        self.assertEqual(request.method, 'GET') -        request = Request(factory.post('/')) -        self.assertEqual(request.method, 'POST') - -    def test_overloaded_method(self): -        """ -        POST requests can be overloaded to another method by setting a -        reserved form field -        """ -        request = Request(factory.post('/', {api_settings.FORM_METHOD_OVERRIDE: 'DELETE'})) -        self.assertEqual(request.method, 'DELETE') - -    def test_x_http_method_override_header(self): -        """ -        POST requests can also be overloaded to another method by setting -        the X-HTTP-Method-Override header. -        """ -        request = Request(factory.post('/', {'foo': 'bar'}, HTTP_X_HTTP_METHOD_OVERRIDE='DELETE')) -        self.assertEqual(request.method, 'DELETE') - -        request = Request(factory.get('/', {'foo': 'bar'}, HTTP_X_HTTP_METHOD_OVERRIDE='DELETE')) -        self.assertEqual(request.method, 'DELETE') - - -class TestContentParsing(TestCase): -    def test_standard_behaviour_determines_no_content_GET(self): -        """ -        Ensure request.DATA returns empty QueryDict for GET request. -        """ -        request = Request(factory.get('/')) -        self.assertEqual(request.DATA, {}) - -    def test_standard_behaviour_determines_no_content_HEAD(self): -        """ -        Ensure request.DATA returns empty QueryDict for HEAD request. -        """ -        request = Request(factory.head('/')) -        self.assertEqual(request.DATA, {}) - -    def test_request_DATA_with_form_content(self): -        """ -        Ensure request.DATA returns content for POST request with form content. -        """ -        data = {'qwerty': 'uiop'} -        request = Request(factory.post('/', data)) -        request.parsers = (FormParser(), MultiPartParser()) -        self.assertEqual(list(request.DATA.items()), list(data.items())) - -    def test_request_DATA_with_text_content(self): -        """ -        Ensure request.DATA returns content for POST request with -        non-form content. -        """ -        content = six.b('qwerty') -        content_type = 'text/plain' -        request = Request(factory.post('/', content, content_type=content_type)) -        request.parsers = (PlainTextParser(),) -        self.assertEqual(request.DATA, content) - -    def test_request_POST_with_form_content(self): -        """ -        Ensure request.POST returns content for POST request with form content. -        """ -        data = {'qwerty': 'uiop'} -        request = Request(factory.post('/', data)) -        request.parsers = (FormParser(), MultiPartParser()) -        self.assertEqual(list(request.POST.items()), list(data.items())) - -    def test_standard_behaviour_determines_form_content_PUT(self): -        """ -        Ensure request.DATA returns content for PUT request with form content. -        """ -        data = {'qwerty': 'uiop'} -        request = Request(factory.put('/', data)) -        request.parsers = (FormParser(), MultiPartParser()) -        self.assertEqual(list(request.DATA.items()), list(data.items())) - -    def test_standard_behaviour_determines_non_form_content_PUT(self): -        """ -        Ensure request.DATA returns content for PUT request with -        non-form content. -        """ -        content = six.b('qwerty') -        content_type = 'text/plain' -        request = Request(factory.put('/', content, content_type=content_type)) -        request.parsers = (PlainTextParser(), ) -        self.assertEqual(request.DATA, content) - -    def test_overloaded_behaviour_allows_content_tunnelling(self): -        """ -        Ensure request.DATA returns content for overloaded POST request. -        """ -        json_data = {'foobar': 'qwerty'} -        content = json.dumps(json_data) -        content_type = 'application/json' -        form_data = { -            api_settings.FORM_CONTENT_OVERRIDE: content, -            api_settings.FORM_CONTENTTYPE_OVERRIDE: content_type -        } -        request = Request(factory.post('/', form_data)) -        request.parsers = (JSONParser(), ) -        self.assertEqual(request.DATA, json_data) - -    def test_form_POST_unicode(self): -        """ -        JSON POST via default web interface with unicode data -        """ -        # Note: environ and other variables here have simplified content compared to real Request -        CONTENT = b'_content_type=application%2Fjson&_content=%7B%22request%22%3A+4%2C+%22firm%22%3A+1%2C+%22text%22%3A+%22%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82%21%22%7D' -        environ = { -            'REQUEST_METHOD': 'POST', -            'CONTENT_TYPE': 'application/x-www-form-urlencoded', -            'CONTENT_LENGTH': len(CONTENT), -            'wsgi.input': BytesIO(CONTENT), -        } -        wsgi_request = WSGIRequest(environ=environ) -        wsgi_request._load_post_and_files() -        parsers = (JSONParser(), FormParser(), MultiPartParser()) -        parser_context = { -            'encoding': 'utf-8', -            'kwargs': {}, -            'args': (), -        } -        request = Request(wsgi_request, parsers=parsers, parser_context=parser_context) -        method = request.method -        self.assertEqual(method, 'POST') -        self.assertEqual(request._content_type, 'application/json') -        self.assertEqual(request._stream.getvalue(), b'{"request": 4, "firm": 1, "text": "\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82!"}') -        self.assertEqual(request._data, Empty) -        self.assertEqual(request._files, Empty) - -    # def test_accessing_post_after_data_form(self): -    #     """ -    #     Ensures request.POST can be accessed after request.DATA in -    #     form request. -    #     """ -    #     data = {'qwerty': 'uiop'} -    #     request = factory.post('/', data=data) -    #     self.assertEqual(request.DATA.items(), data.items()) -    #     self.assertEqual(request.POST.items(), data.items()) - -    # def test_accessing_post_after_data_for_json(self): -    #     """ -    #     Ensures request.POST can be accessed after request.DATA in -    #     json request. -    #     """ -    #     data = {'qwerty': 'uiop'} -    #     content = json.dumps(data) -    #     content_type = 'application/json' -    #     parsers = (JSONParser, ) - -    #     request = factory.post('/', content, content_type=content_type, -    #                            parsers=parsers) -    #     self.assertEqual(request.DATA.items(), data.items()) -    #     self.assertEqual(request.POST.items(), []) - -    # def test_accessing_post_after_data_for_overloaded_json(self): -    #     """ -    #     Ensures request.POST can be accessed after request.DATA in overloaded -    #     json request. -    #     """ -    #     data = {'qwerty': 'uiop'} -    #     content = json.dumps(data) -    #     content_type = 'application/json' -    #     parsers = (JSONParser, ) -    #     form_data = {Request._CONTENT_PARAM: content, -    #                  Request._CONTENTTYPE_PARAM: content_type} - -    #     request = factory.post('/', form_data, parsers=parsers) -    #     self.assertEqual(request.DATA.items(), data.items()) -    #     self.assertEqual(request.POST.items(), form_data.items()) - -    # def test_accessing_data_after_post_form(self): -    #     """ -    #     Ensures request.DATA can be accessed after request.POST in -    #     form request. -    #     """ -    #     data = {'qwerty': 'uiop'} -    #     parsers = (FormParser, MultiPartParser) -    #     request = factory.post('/', data, parsers=parsers) - -    #     self.assertEqual(request.POST.items(), data.items()) -    #     self.assertEqual(request.DATA.items(), data.items()) - -    # def test_accessing_data_after_post_for_json(self): -    #     """ -    #     Ensures request.DATA can be accessed after request.POST in -    #     json request. -    #     """ -    #     data = {'qwerty': 'uiop'} -    #     content = json.dumps(data) -    #     content_type = 'application/json' -    #     parsers = (JSONParser, ) -    #     request = factory.post('/', content, content_type=content_type, -    #                            parsers=parsers) -    #     self.assertEqual(request.POST.items(), []) -    #     self.assertEqual(request.DATA.items(), data.items()) - -    # def test_accessing_data_after_post_for_overloaded_json(self): -    #     """ -    #     Ensures request.DATA can be accessed after request.POST in overloaded -    #     json request -    #     """ -    #     data = {'qwerty': 'uiop'} -    #     content = json.dumps(data) -    #     content_type = 'application/json' -    #     parsers = (JSONParser, ) -    #     form_data = {Request._CONTENT_PARAM: content, -    #                  Request._CONTENTTYPE_PARAM: content_type} - -    #     request = factory.post('/', form_data, parsers=parsers) -    #     self.assertEqual(request.POST.items(), form_data.items()) -    #     self.assertEqual(request.DATA.items(), data.items()) - - -class MockView(APIView): -    authentication_classes = (SessionAuthentication,) - -    def post(self, request): -        if request.POST.get('example') is not None: -            return Response(status=status.HTTP_200_OK) - -        return Response(status=status.INTERNAL_SERVER_ERROR) - -urlpatterns = patterns('', -    (r'^$', MockView.as_view()), -) - - -class TestContentParsingWithAuthentication(TestCase): -    urls = 'rest_framework.tests.test_request' - -    def setUp(self): -        self.csrf_client = APIClient(enforce_csrf_checks=True) -        self.username = 'john' -        self.email = 'lennon@thebeatles.com' -        self.password = 'password' -        self.user = User.objects.create_user(self.username, self.email, self.password) - -    def test_user_logged_in_authentication_has_POST_when_not_logged_in(self): -        """ -        Ensures request.POST exists after SessionAuthentication when user -        doesn't log in. -        """ -        content = {'example': 'example'} - -        response = self.client.post('/', content) -        self.assertEqual(status.HTTP_200_OK, response.status_code) - -        response = self.csrf_client.post('/', content) -        self.assertEqual(status.HTTP_200_OK, response.status_code) - -    # def test_user_logged_in_authentication_has_post_when_logged_in(self): -    #     """Ensures request.POST exists after UserLoggedInAuthentication when user does log in""" -    #     self.client.login(username='john', password='password') -    #     self.csrf_client.login(username='john', password='password') -    #     content = {'example': 'example'} - -    #     response = self.client.post('/', content) -    #     self.assertEqual(status.OK, response.status_code, "POST data is malformed") - -    #     response = self.csrf_client.post('/', content) -    #     self.assertEqual(status.OK, response.status_code, "POST data is malformed") - - -class TestUserSetter(TestCase): - -    def setUp(self): -        # Pass request object through session middleware so session is -        # available to login and logout functions -        self.request = Request(factory.get('/')) -        SessionMiddleware().process_request(self.request) - -        User.objects.create_user('ringo', 'starr@thebeatles.com', 'yellow') -        self.user = authenticate(username='ringo', password='yellow') - -    def test_user_can_be_set(self): -        self.request.user = self.user -        self.assertEqual(self.request.user, self.user) - -    def test_user_can_login(self): -        login(self.request, self.user) -        self.assertEqual(self.request.user, self.user) - -    def test_user_can_logout(self): -        self.request.user = self.user -        self.assertFalse(self.request.user.is_anonymous()) -        logout(self.request) -        self.assertTrue(self.request.user.is_anonymous()) - - -class TestAuthSetter(TestCase): - -    def test_auth_can_be_set(self): -        request = Request(factory.get('/')) -        request.auth = 'DUMMY' -        self.assertEqual(request.auth, 'DUMMY')  | 
