Skip to content

Commit 4a1d773

Browse files
authored
Fixed regression that tests using format still work (#9615)
* Fixed regression that tests using format still work Error only occurred on tests which return no content and use a renderer without charset (e.g. JSONRenderer) * Fixed linting * Used early return as before * Move ret str check back to where it was
1 parent a4f6059 commit 4a1d773

File tree

2 files changed

+19
-10
lines changed

2 files changed

+19
-10
lines changed

rest_framework/test.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@ def _encode_data(self, data, format=None, content_type=None):
150150
"""
151151
Encode the data returning a two tuple of (bytes, content_type)
152152
"""
153+
if data is None:
154+
return (b'', content_type)
153155

154156
assert format is None or content_type is None, (
155157
'You may not set both `format` and `content_type`.'
@@ -161,9 +163,6 @@ def _encode_data(self, data, format=None, content_type=None):
161163
except AttributeError:
162164
pass
163165

164-
if data is None:
165-
data = ''
166-
167166
# Content type specified explicitly, treat data as a raw bytestring
168167
ret = force_bytes(data, settings.DEFAULT_CHARSET)
169168

@@ -181,6 +180,7 @@ def _encode_data(self, data, format=None, content_type=None):
181180

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

185185
# Determine the content-type header from the renderer
186186
content_type = renderer.media_type
@@ -189,11 +189,6 @@ def _encode_data(self, data, format=None, content_type=None):
189189
content_type, renderer.charset
190190
)
191191

192-
if data is None:
193-
ret = ''
194-
else:
195-
ret = renderer.render(data)
196-
197192
# Coerce text to bytes if required.
198193
if isinstance(ret, str):
199194
ret = ret.encode(renderer.charset)

tests/test_testing.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
from django.test import TestCase, override_settings
99
from django.urls import path
1010

11-
from rest_framework import fields, parsers, serializers
11+
from rest_framework import fields, parsers, renderers, serializers, status
1212
from rest_framework.authtoken.models import Token
13-
from rest_framework.decorators import api_view, parser_classes
13+
from rest_framework.decorators import (
14+
api_view, parser_classes, renderer_classes
15+
)
1416
from rest_framework.response import Response
1517
from rest_framework.test import (
1618
APIClient, APIRequestFactory, URLPatternsTestCase, force_authenticate
@@ -56,6 +58,12 @@ def post_json_view(request):
5658
return Response(request.data)
5759

5860

61+
@api_view(['DELETE'])
62+
@renderer_classes((renderers.JSONRenderer, ))
63+
def delete_json_view(request):
64+
return Response(status=status.HTTP_204_NO_CONTENT)
65+
66+
5967
@api_view(['POST'])
6068
def post_view(request):
6169
serializer = BasicSerializer(data=request.data)
@@ -69,6 +77,7 @@ def post_view(request):
6977
path('redirect-view/', redirect_view),
7078
path('redirect-view/<int:code>/', redirect_307_308_view),
7179
path('post-json-view/', post_json_view),
80+
path('delete-json-view/', delete_json_view),
7281
path('post-view/', post_view),
7382
]
7483

@@ -254,6 +263,11 @@ def test_post_encodes_data_based_on_json_content_type(self):
254263
assert response.status_code == 200
255264
assert response.data == data
256265

266+
def test_delete_based_on_format(self):
267+
response = self.client.delete('/delete-json-view/', format='json')
268+
assert response.status_code == status.HTTP_204_NO_CONTENT
269+
assert response.data is None
270+
257271

258272
class TestAPIRequestFactory(TestCase):
259273
def test_csrf_exempt_by_default(self):

0 commit comments

Comments
 (0)