diff --git a/rest_framework/test.py b/rest_framework/test.py index 730b7708e2..c273724b99 100644 --- a/rest_framework/test.py +++ b/rest_framework/test.py @@ -150,6 +150,8 @@ 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 (b'', content_type) assert format is None or content_type is None, ( 'You may not set both `format` and `content_type`.' @@ -161,9 +163,6 @@ def _encode_data(self, data, format=None, content_type=None): 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) @@ -181,6 +180,7 @@ 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 = renderer.media_type @@ -189,11 +189,6 @@ def _encode_data(self, data, format=None, content_type=None): content_type, renderer.charset ) - if data is None: - ret = '' - else: - ret = renderer.render(data) - # Coerce text to bytes if required. if isinstance(ret, str): ret = ret.encode(renderer.charset) diff --git a/tests/test_testing.py b/tests/test_testing.py index 62dd24dfc6..26a6e8ffb9 100644 --- a/tests/test_testing.py +++ b/tests/test_testing.py @@ -8,9 +8,11 @@ from django.test import TestCase, override_settings from django.urls import path -from rest_framework import fields, parsers, serializers +from rest_framework import fields, parsers, renderers, serializers, status from rest_framework.authtoken.models import Token -from rest_framework.decorators import api_view, parser_classes +from rest_framework.decorators import ( + api_view, parser_classes, renderer_classes +) from rest_framework.response import Response from rest_framework.test import ( APIClient, APIRequestFactory, URLPatternsTestCase, force_authenticate @@ -56,6 +58,12 @@ def post_json_view(request): return Response(request.data) +@api_view(['DELETE']) +@renderer_classes((renderers.JSONRenderer, )) +def delete_json_view(request): + return Response(status=status.HTTP_204_NO_CONTENT) + + @api_view(['POST']) def post_view(request): serializer = BasicSerializer(data=request.data) @@ -69,6 +77,7 @@ def post_view(request): path('redirect-view/', redirect_view), path('redirect-view//', redirect_307_308_view), path('post-json-view/', post_json_view), + path('delete-json-view/', delete_json_view), path('post-view/', post_view), ] @@ -254,6 +263,11 @@ def test_post_encodes_data_based_on_json_content_type(self): assert response.status_code == 200 assert response.data == data + def test_delete_based_on_format(self): + response = self.client.delete('/delete-json-view/', format='json') + assert response.status_code == status.HTTP_204_NO_CONTENT + assert response.data is None + class TestAPIRequestFactory(TestCase): def test_csrf_exempt_by_default(self): pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy