aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework/tests
diff options
context:
space:
mode:
authorTom Christie2013-05-18 17:21:43 +0100
committerTom Christie2013-05-18 17:21:43 +0100
commit0d3d66cb0232e1067600ef22fcf88937ac6bee9d (patch)
treee39f1750d919026607ba2d99610207e5fecb2e37 /rest_framework/tests
parent5bebd29f11dd9268b9a23c27cf58c8440664f5e9 (diff)
downloaddjango-rest-framework-0d3d66cb0232e1067600ef22fcf88937ac6bee9d.tar.bz2
Added proper charset support
Diffstat (limited to 'rest_framework/tests')
-rw-r--r--rest_framework/tests/htmlrenderer.py10
-rw-r--r--rest_framework/tests/negotiation.py28
-rw-r--r--rest_framework/tests/response.py50
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'])