Fixed #29082 -- Allowed the test client to encode JSON request data.

This commit is contained in:
Nick Sarbicki 2018-02-05 10:22:24 +00:00 committed by Tim Graham
parent d968788b57
commit 47268242b0
7 changed files with 86 additions and 6 deletions

View file

@ -21,6 +21,7 @@ rather than the HTML rendered to the end-user.
"""
import itertools
import tempfile
from unittest import mock
from django.contrib.auth.models import User
from django.core import mail
@ -86,6 +87,31 @@ class ClientTest(TestCase):
self.assertEqual(response.templates[0].name, 'POST Template')
self.assertContains(response, 'Data received')
def test_json_serialization(self):
"""The test client serializes JSON data."""
methods = ('post', 'put', 'patch', 'delete')
for method in methods:
with self.subTest(method=method):
client_method = getattr(self.client, method)
method_name = method.upper()
response = client_method('/json_view/', {'value': 37}, content_type='application/json')
self.assertEqual(response.status_code, 200)
self.assertEqual(response.context['data'], 37)
self.assertContains(response, 'Viewing %s page.' % method_name)
def test_json_encoder_argument(self):
"""The test Client accepts a json_encoder."""
mock_encoder = mock.MagicMock()
mock_encoding = mock.MagicMock()
mock_encoder.return_value = mock_encoding
mock_encoding.encode.return_value = '{"value": 37}'
client = self.client_class(json_encoder=mock_encoder)
# Vendored tree JSON content types are accepted.
client.post('/json_view/', {'value': 37}, content_type='application/vnd.api+json')
self.assertTrue(mock_encoder.called)
self.assertTrue(mock_encoding.encode.called)
def test_trace(self):
"""TRACE a view"""
response = self.client.trace('/trace_view/')

View file

@ -25,6 +25,7 @@ urlpatterns = [
url(r'^form_view/$', views.form_view),
url(r'^form_view_with_template/$', views.form_view_with_template),
url(r'^formset_view/$', views.formset_view),
url(r'^json_view/$', views.json_view),
url(r'^login_protected_view/$', views.login_protected_view),
url(r'^login_protected_method_view/$', views.login_protected_method_view),
url(r'^login_protected_view_custom_redirect/$', views.login_protected_view_changed_redirect),

View file

@ -1,3 +1,4 @@
import json
from urllib.parse import urlencode
from xml.dom.minidom import parseString
@ -73,7 +74,20 @@ def post_view(request):
else:
t = Template('Viewing GET page.', name='Empty GET Template')
c = Context()
return HttpResponse(t.render(c))
def json_view(request):
"""
A view that expects a request with the header 'application/json' and JSON
data with a key named 'value'.
"""
if request.META.get('CONTENT_TYPE') != 'application/json':
return HttpResponse()
t = Template('Viewing {} page. With data {{ data }}.'.format(request.method))
data = json.loads(request.body.decode('utf-8'))
c = Context({'data': data['value']})
return HttpResponse(t.render(c))