diff options
| author | Nick Sarbicki <nick.a.sarbicki@gmail.com> | 2018-02-05 10:22:24 +0000 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2018-02-06 18:29:04 -0500 |
| commit | 47268242b071895dd269d97540e45dce646f675c (patch) | |
| tree | dd03c4fc91098c58507b11e7db78b36c99e581b3 /tests | |
| parent | d968788b57f41b7def88046d1178fd2932a32a4e (diff) | |
Fixed #29082 -- Allowed the test client to encode JSON request data.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/test_client/tests.py | 26 | ||||
| -rw-r--r-- | tests/test_client/urls.py | 1 | ||||
| -rw-r--r-- | tests/test_client/views.py | 14 |
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)) |
