Skip to content

Commit

Permalink
support django 2.1 test client json data automatically serialized
Browse files Browse the repository at this point in the history
  • Loading branch information
terencehonles committed May 11, 2019
1 parent 9811a29 commit 4ed1e0e
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 7 deletions.
17 changes: 13 additions & 4 deletions rest_framework/test.py
Expand Up @@ -151,14 +151,19 @@ def _encode_data(self, data, format=None, content_type=None):
Encode the data returning a two tuple of (bytes, content_type)
"""

if data is None:
return ('', content_type)

assert format is None or content_type is None, (
'You may not set both `format` and `content_type`.'
)

if content_type:
try:
data = self._encode_json(data, content_type)
except AttributeError:
pass

if data is None:
data = ''

# Content type specified explicitly, treat data as a raw bytestring
ret = force_bytes(data, settings.DEFAULT_CHARSET)

Expand All @@ -176,13 +181,17 @@ def _encode_data(self, data, format=None, content_type=None):

# Use format and render the data into a bytestring
renderer = self.renderer_classes[format]()
ret = renderer.render(data)

# Determine the content-type header from the renderer
content_type = "{}; charset={}".format(
renderer.media_type, renderer.charset
)

if data is None:
ret = ''
else:
ret = renderer.render(data)

# Coerce text to bytes if required.
if isinstance(ret, str):
ret = bytes(ret.encode(renderer.charset))
Expand Down
29 changes: 26 additions & 3 deletions tests/test_testing.py
@@ -1,12 +1,13 @@
from io import BytesIO

from django import VERSION as DJANGO_VERSION
from django.conf.urls import url
from django.contrib.auth.models import User
from django.shortcuts import redirect
from django.test import TestCase, override_settings

from rest_framework import fields, serializers
from rest_framework.decorators import api_view
from rest_framework import fields, parsers, serializers
from rest_framework.decorators import api_view, parser_classes
from rest_framework.response import Response
from rest_framework.test import (
APIClient, APIRequestFactory, URLPatternsTestCase, force_authenticate
Expand Down Expand Up @@ -46,11 +47,18 @@ def post_view(request):
return Response(serializer.validated_data)


@api_view(['POST'])
@parser_classes((parsers.JSONParser,))
def post_json_view(request):
return Response(request.data)


urlpatterns = [
url(r'^view/$', view),
url(r'^session-view/$', session_view),
url(r'^redirect-view/$', redirect_view),
url(r'^post-view/$', post_view)
url(r'^post-view/$', post_view),
url(r'^post-json-view/$', post_json_view),
]


Expand Down Expand Up @@ -200,6 +208,21 @@ def test_empty_post_uses_default_boolean_value(self):
assert response.status_code == 200
assert response.data == {"flag": True}

def test_post_encodes_data_based_on_json_content_type(self):
data = {'data': True}
response = self.client.post(
'/post-json-view/',
data=data,
content_type='application/json'
)

if DJANGO_VERSION < (2, 1):
assert response.status_code == 400
assert response.data['detail'].code == 'parse_error'
else:
assert response.status_code == 200
assert response.data == data


class TestAPIRequestFactory(TestCase):
def test_csrf_exempt_by_default(self):
Expand Down

0 comments on commit 4ed1e0e

Please sign in to comment.