99from django .test import TestCase , override_settings
1010from django .urls import path
1111
12- from rest_framework import fields , serializers
13- from rest_framework .decorators import api_view
12+ from rest_framework import fields , parsers , serializers
13+ from rest_framework .decorators import api_view , parser_classes
1414from rest_framework .response import Response
1515from rest_framework .test import (
1616 APIClient , APIRequestFactory , URLPatternsTestCase , force_authenticate
@@ -48,6 +48,12 @@ class BasicSerializer(serializers.Serializer):
4848 flag = fields .BooleanField (default = lambda : True )
4949
5050
51+ @api_view (['POST' ])
52+ @parser_classes ((parsers .JSONParser ,))
53+ def post_json_view (request ):
54+ return Response (request .data )
55+
56+
5157@api_view (['POST' ])
5258def post_view (request ):
5359 serializer = BasicSerializer (data = request .data )
@@ -60,7 +66,8 @@ def post_view(request):
6066 path ('session-view/' , session_view ),
6167 path ('redirect-view/' , redirect_view ),
6268 path ('redirect-view/<int:code>/' , redirect_307_308_view ),
63- path ('post-view/' , post_view )
69+ path ('post-json-view/' , post_json_view ),
70+ path ('post-view/' , post_view ),
6471]
6572
6673
@@ -201,6 +208,21 @@ def test_empty_post_uses_default_boolean_value(self):
201208 assert response .status_code == 200
202209 assert response .data == {"flag" : True }
203210
211+ def test_post_encodes_data_based_on_json_content_type (self ):
212+ data = {'data' : True }
213+ response = self .client .post (
214+ '/post-json-view/' ,
215+ data = data ,
216+ content_type = 'application/json'
217+ )
218+
219+ if django .VERSION < (2 , 1 ):
220+ assert response .status_code == 400
221+ assert response .data ['detail' ].code == 'parse_error'
222+ else :
223+ assert response .status_code == 200
224+ assert response .data == data
225+
204226
205227class TestAPIRequestFactory (TestCase ):
206228 def test_csrf_exempt_by_default (self ):
0 commit comments