diff options
| author | Tom Christie | 2013-05-18 17:21:43 +0100 |
|---|---|---|
| committer | Tom Christie | 2013-05-18 17:21:43 +0100 |
| commit | 0d3d66cb0232e1067600ef22fcf88937ac6bee9d (patch) | |
| tree | e39f1750d919026607ba2d99610207e5fecb2e37 /rest_framework/tests | |
| parent | 5bebd29f11dd9268b9a23c27cf58c8440664f5e9 (diff) | |
| download | django-rest-framework-0d3d66cb0232e1067600ef22fcf88937ac6bee9d.tar.bz2 | |
Added proper charset support
Diffstat (limited to 'rest_framework/tests')
| -rw-r--r-- | rest_framework/tests/htmlrenderer.py | 10 | ||||
| -rw-r--r-- | rest_framework/tests/negotiation.py | 28 | ||||
| -rw-r--r-- | rest_framework/tests/response.py | 50 |
3 files changed, 38 insertions, 50 deletions
diff --git a/rest_framework/tests/htmlrenderer.py b/rest_framework/tests/htmlrenderer.py index 8f2e2b5a..5d18a6e8 100644 --- a/rest_framework/tests/htmlrenderer.py +++ b/rest_framework/tests/htmlrenderer.py @@ -66,19 +66,19 @@ class TemplateHTMLRendererTests(TestCase): def test_simple_html_view(self): response = self.client.get('/') self.assertContains(response, "example: foobar") - self.assertEqual(response['Content-Type'], 'text/html') + self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8') def test_not_found_html_view(self): response = self.client.get('/not_found') self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) self.assertEqual(response.content, six.b("404 Not Found")) - self.assertEqual(response['Content-Type'], 'text/html') + self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8') def test_permission_denied_html_view(self): response = self.client.get('/permission_denied') self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) self.assertEqual(response.content, six.b("403 Forbidden")) - self.assertEqual(response['Content-Type'], 'text/html') + self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8') class TemplateHTMLRendererExceptionTests(TestCase): @@ -109,10 +109,10 @@ class TemplateHTMLRendererExceptionTests(TestCase): response = self.client.get('/not_found') self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) self.assertEqual(response.content, six.b("404: Not found")) - self.assertEqual(response['Content-Type'], 'text/html') + self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8') def test_permission_denied_html_view_with_template(self): response = self.client.get('/permission_denied') self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) self.assertEqual(response.content, six.b("403: Permission denied")) - self.assertEqual(response['Content-Type'], 'text/html') + self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8') diff --git a/rest_framework/tests/negotiation.py b/rest_framework/tests/negotiation.py index d7ef6470..7f84827f 100644 --- a/rest_framework/tests/negotiation.py +++ b/rest_framework/tests/negotiation.py @@ -12,15 +12,14 @@ factory = RequestFactory() class MockJSONRenderer(BaseRenderer): media_type = 'application/json' + class MockHTMLRenderer(BaseRenderer): media_type = 'text/html' + class NoCharsetSpecifiedRenderer(BaseRenderer): media_type = 'my/media' -class CharsetSpecifiedRenderer(BaseRenderer): - media_type = 'my/media' - charset = 'mycharset' class TestAcceptedMediaType(TestCase): def setUp(self): @@ -32,32 +31,15 @@ class TestAcceptedMediaType(TestCase): def test_client_without_accept_use_renderer(self): request = Request(factory.get('/')) - accepted_renderer, accepted_media_type, charset = self.select_renderer(request) + accepted_renderer, accepted_media_type = self.select_renderer(request) self.assertEqual(accepted_media_type, 'application/json') def test_client_underspecifies_accept_use_renderer(self): request = Request(factory.get('/', HTTP_ACCEPT='*/*')) - accepted_renderer, accepted_media_type, charset = self.select_renderer(request) + accepted_renderer, accepted_media_type = self.select_renderer(request) self.assertEqual(accepted_media_type, 'application/json') def test_client_overspecifies_accept_use_client(self): request = Request(factory.get('/', HTTP_ACCEPT='application/json; indent=8')) - accepted_renderer, accepted_media_type, charset = self.select_renderer(request) + accepted_renderer, accepted_media_type = self.select_renderer(request) self.assertEqual(accepted_media_type, 'application/json; indent=8') - -class TestCharset(TestCase): - def setUp(self): - self.renderers = [NoCharsetSpecifiedRenderer()] - self.negotiator = DefaultContentNegotiation() - - def test_returns_none_if_no_charset_set(self): - request = Request(factory.get('/')) - renderers = [NoCharsetSpecifiedRenderer()] - _, _, charset = self.negotiator.select_renderer(request, renderers) - self.assertIsNone(charset) - - def test_returns_attribute_from_renderer_if_charset_is_set(self): - request = Request(factory.get('/')) - renderers = [CharsetSpecifiedRenderer()] - _, _, charset = self.negotiator.select_renderer(request, renderers) - self.assertEquals(CharsetSpecifiedRenderer.charset, charset)
\ No newline at end of file diff --git a/rest_framework/tests/response.py b/rest_framework/tests/response.py index f2a1c635..8f1163e8 100644 --- a/rest_framework/tests/response.py +++ b/rest_framework/tests/response.py @@ -12,6 +12,7 @@ from rest_framework.renderers import ( from rest_framework.settings import api_settings from rest_framework.compat import six + class MockPickleRenderer(BaseRenderer): media_type = 'application/pickle' @@ -19,6 +20,7 @@ class MockPickleRenderer(BaseRenderer): class MockJsonRenderer(BaseRenderer): media_type = 'application/json' + class MockTextMediaRenderer(BaseRenderer): media_type = 'text/html' @@ -44,6 +46,7 @@ class RendererB(BaseRenderer): def render(self, data, media_type=None, renderer_context=None): return RENDERER_B_SERIALIZER(data) + class RendererC(RendererB): media_type = 'mock/rendererc' format = 'formatc' @@ -56,6 +59,14 @@ class MockView(APIView): def get(self, request, **kwargs): return Response(DUMMYCONTENT, status=DUMMYSTATUS) + +class MockViewSettingCharset(APIView): + renderer_classes = (RendererA, RendererB, RendererC) + + def get(self, request, **kwargs): + return Response(DUMMYCONTENT, status=DUMMYSTATUS, charset='setbyview') + + class HTMLView(APIView): renderer_classes = (BrowsableAPIRenderer, ) @@ -70,6 +81,7 @@ class HTMLView1(APIView): return Response('text') urlpatterns = patterns('', + url(r'^setbyview$', MockViewSettingCharset.as_view(renderer_classes=[RendererA, RendererB, RendererC])), url(r'^.*\.(?P<format>.+)$', MockView.as_view(renderer_classes=[RendererA, RendererB, RendererC])), url(r'^$', MockView.as_view(renderer_classes=[RendererA, RendererB, RendererC])), url(r'^html$', HTMLView.as_view()), @@ -178,43 +190,37 @@ class Issue122Tests(TestCase): """ self.client.get('/html1') + class Issue807Testts(TestCase): """ Covers #807 """ - + urls = 'rest_framework.tests.response' - + def test_does_not_append_charset_by_default(self): """ - For backwards compatibility `REST_FRAMEWORK['DEFAULT_CHARSET']` defaults - to None, so that all legacy code works as expected. + Renderers don't include a charset unless set explicitly. """ headers = {"HTTP_ACCEPT": RendererA.media_type} resp = self.client.get('/', **headers) - self.assertEquals(RendererA.media_type, resp['Content-Type']) - + self.assertEqual(RendererA.media_type, resp['Content-Type']) + def test_if_there_is_charset_specified_on_renderer_it_gets_appended(self): """ If renderer class has charset attribute declared, it gets appended to Response's Content-Type """ - resp = self.client.get('/?format=%s' % RendererC.format) + headers = {"HTTP_ACCEPT": RendererC.media_type} + resp = self.client.get('/', **headers) expected = "{0}; charset={1}".format(RendererC.media_type, RendererC.charset) - self.assertEquals(expected, resp['Content-Type']) - - def test_if_there_is_default_charset_specified_it_gets_appended(self): + self.assertEqual(expected, resp['Content-Type']) + + def test_charset_set_explictly_on_response(self): """ - If user defines `REST_FRAMEWORK['DEFAULT_CHARSET']` it will get appended - to Content-Type of all responses. + The charset may be set explictly on the response. """ - original_default_charset = api_settings.DEFAULT_CHARSET - api_settings.DEFAULT_CHARSET = "utf-8" - headers = {'HTTP_ACCEPT': RendererA.media_type} - resp = self.client.get('/', **headers) - expected = "{0}; charset={1}".format( - RendererA.media_type, - api_settings.DEFAULT_CHARSET - ) - self.assertEquals(expected, resp['Content-Type']) - api_settings.DEFAULT_CHARSET = original_default_charset
\ No newline at end of file + headers = {"HTTP_ACCEPT": RendererC.media_type} + resp = self.client.get('/setbyview', **headers) + expected = "{0}; charset={1}".format(RendererC.media_type, 'setbyview') + self.assertEqual(expected, resp['Content-Type']) |
