mirror of
https://github.com/django/django.git
synced 2025-08-03 02:23:12 +00:00
Fixed #29082 -- Allowed the test client to encode JSON request data.
This commit is contained in:
parent
d968788b57
commit
47268242b0
7 changed files with 86 additions and 6 deletions
|
@ -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/')
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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))
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue