summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorNick Sarbicki <nick.a.sarbicki@gmail.com>2018-02-05 10:22:24 +0000
committerTim Graham <timograham@gmail.com>2018-02-06 18:29:04 -0500
commit47268242b071895dd269d97540e45dce646f675c (patch)
treedd03c4fc91098c58507b11e7db78b36c99e581b3 /tests
parentd968788b57f41b7def88046d1178fd2932a32a4e (diff)
Fixed #29082 -- Allowed the test client to encode JSON request data.
Diffstat (limited to 'tests')
-rw-r--r--tests/test_client/tests.py26
-rw-r--r--tests/test_client/urls.py1
-rw-r--r--tests/test_client/views.py14
3 files changed, 41 insertions, 0 deletions
diff --git a/tests/test_client/tests.py b/tests/test_client/tests.py
index 2643a279b1..393678ca03 100644
--- a/tests/test_client/tests.py
+++ b/tests/test_client/tests.py
@@ -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/')
diff --git a/tests/test_client/urls.py b/tests/test_client/urls.py
index 749426f2c4..9d1d8f49e1 100644
--- a/tests/test_client/urls.py
+++ b/tests/test_client/urls.py
@@ -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),
diff --git a/tests/test_client/views.py b/tests/test_client/views.py
index 80daa9bcad..9ffb1bd6a3 100644
--- a/tests/test_client/views.py
+++ b/tests/test_client/views.py
@@ -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))