From ff6b51999868c4d6d4d4b61233f8cc201249b94b Mon Sep 17 00:00:00 2001 From: Oliver Sauder Date: Tue, 7 Jan 2025 21:59:48 +0400 Subject: [PATCH] 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) --- rest_framework/test.py | 2 +- tests/test_testing.py | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/rest_framework/test.py b/rest_framework/test.py index 730b7708e2..690303fbf6 100644 --- a/rest_framework/test.py +++ b/rest_framework/test.py @@ -195,7 +195,7 @@ def _encode_data(self, data, format=None, content_type=None): ret = renderer.render(data) # Coerce text to bytes if required. - if isinstance(ret, str): + if isinstance(ret, str) and renderer.charset: ret = ret.encode(renderer.charset) return ret, content_type diff --git a/tests/test_testing.py b/tests/test_testing.py index 62dd24dfc6..dd67b058a2 100644 --- a/tests/test_testing.py +++ b/tests/test_testing.py @@ -8,9 +8,9 @@ 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 @@ -55,6 +55,10 @@ class BasicSerializer(serializers.Serializer): 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): @@ -69,6 +73,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 +259,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):