aboutsummaryrefslogtreecommitdiffstats
path: root/djangorestframework/tests/response.py
diff options
context:
space:
mode:
Diffstat (limited to 'djangorestframework/tests/response.py')
-rw-r--r--djangorestframework/tests/response.py71
1 files changed, 45 insertions, 26 deletions
diff --git a/djangorestframework/tests/response.py b/djangorestframework/tests/response.py
index 5a01e356..b8cc5c1b 100644
--- a/djangorestframework/tests/response.py
+++ b/djangorestframework/tests/response.py
@@ -1,9 +1,10 @@
import json
+import unittest
from django.conf.urls.defaults import patterns, url
from django.test import TestCase
-from djangorestframework.response import Response, ErrorResponse
+from djangorestframework.response import Response, ImmediateResponse
from djangorestframework.mixins import ResponseMixin
from djangorestframework.views import View
from djangorestframework.compat import View as DjangoView
@@ -17,13 +18,16 @@ from djangorestframework.renderers import BaseRenderer, JSONRenderer, YAMLRender
class TestResponseDetermineRenderer(TestCase):
def get_response(self, url='', accept_list=[], renderers=[]):
- request = RequestFactory().get(url, HTTP_ACCEPT=','.join(accept_list))
+ kwargs = {}
+ if accept_list is not None:
+ kwargs['HTTP_ACCEPT'] = HTTP_ACCEPT=','.join(accept_list)
+ request = RequestFactory().get(url, **kwargs)
return Response(request=request, renderers=renderers)
def get_renderer_mock(self, media_type):
return type('RendererMock', (BaseRenderer,), {
'media_type': media_type,
- })
+ })()
def test_determine_accept_list_accept_header(self):
"""
@@ -32,6 +36,13 @@ class TestResponseDetermineRenderer(TestCase):
accept_list = ['application/pickle', 'application/json']
response = self.get_response(accept_list=accept_list)
self.assertEqual(response._determine_accept_list(), accept_list)
+
+ def test_determine_accept_list_default(self):
+ """
+ Test that determine_accept_list takes the default renderer if Accept is not specified.
+ """
+ response = self.get_response(accept_list=None)
+ self.assertEqual(response._determine_accept_list(), ['*/*'])
def test_determine_accept_list_overriden_header(self):
"""
@@ -47,38 +58,46 @@ class TestResponseDetermineRenderer(TestCase):
Test that right renderer is chosen, in the order of Accept list.
"""
accept_list = ['application/pickle', 'application/json']
- PRenderer = self.get_renderer_mock('application/pickle')
- JRenderer = self.get_renderer_mock('application/json')
+ prenderer = self.get_renderer_mock('application/pickle')
+ jrenderer = self.get_renderer_mock('application/json')
- renderers = (PRenderer, JRenderer)
- response = self.get_response(accept_list=accept_list, renderers=renderers)
+ response = self.get_response(accept_list=accept_list, renderers=(prenderer, jrenderer))
renderer, media_type = response._determine_renderer()
self.assertEqual(media_type, 'application/pickle')
- self.assertTrue(isinstance(renderer, PRenderer))
+ self.assertTrue(renderer, prenderer)
- renderers = (JRenderer,)
- response = self.get_response(accept_list=accept_list, renderers=renderers)
+ response = self.get_response(accept_list=accept_list, renderers=(jrenderer,))
renderer, media_type = response._determine_renderer()
self.assertEqual(media_type, 'application/json')
- self.assertTrue(isinstance(renderer, JRenderer))
+ self.assertTrue(renderer, jrenderer)
+
+ def test_determine_renderer_default(self):
+ """
+ Test determine renderer when Accept was not specified.
+ """
+ prenderer = self.get_renderer_mock('application/pickle')
+
+ response = self.get_response(accept_list=None, renderers=(prenderer,))
+ renderer, media_type = response._determine_renderer()
+ self.assertEqual(media_type, '*/*')
+ self.assertTrue(renderer, prenderer)
def test_determine_renderer_no_renderer(self):
"""
Test determine renderer when no renderer can satisfy the Accept list.
"""
accept_list = ['application/json']
- PRenderer = self.get_renderer_mock('application/pickle')
+ prenderer = self.get_renderer_mock('application/pickle')
- renderers = (PRenderer,)
- response = self.get_response(accept_list=accept_list, renderers=renderers)
- self.assertRaises(ErrorResponse, response._determine_renderer)
+ response = self.get_response(accept_list=accept_list, renderers=(prenderer,))
+ self.assertRaises(ImmediateResponse, response._determine_renderer)
class TestResponseRenderContent(TestCase):
def get_response(self, url='', accept_list=[], content=None):
request = RequestFactory().get(url, HTTP_ACCEPT=','.join(accept_list))
- return Response(request=request, content=content, renderers=DEFAULT_RENDERERS)
+ return Response(request=request, content=content, renderers=[r() for r in DEFAULT_RENDERERS])
def test_render(self):
"""
@@ -116,7 +135,7 @@ class RendererB(BaseRenderer):
class MockView(ResponseMixin, DjangoView):
- renderers = (RendererA, RendererB)
+ renderer_classes = (RendererA, RendererB)
def get(self, request, **kwargs):
response = Response(DUMMYCONTENT, status=DUMMYSTATUS)
@@ -124,22 +143,22 @@ class MockView(ResponseMixin, DjangoView):
class HTMLView(View):
- renderers = (DocumentingHTMLRenderer, )
+ renderer_classes = (DocumentingHTMLRenderer, )
def get(self, request, **kwargs):
return Response('text')
class HTMLView1(View):
- renderers = (DocumentingHTMLRenderer, JSONRenderer)
+ renderer_classes = (DocumentingHTMLRenderer, JSONRenderer)
def get(self, request, **kwargs):
return Response('text')
urlpatterns = patterns('',
- url(r'^.*\.(?P<format>.+)$', MockView.as_view(renderers=[RendererA, RendererB])),
- url(r'^$', MockView.as_view(renderers=[RendererA, RendererB])),
+ url(r'^.*\.(?P<format>.+)$', MockView.as_view(renderer_classes=[RendererA, RendererB])),
+ url(r'^$', MockView.as_view(renderer_classes=[RendererA, RendererB])),
url(r'^html$', HTMLView.as_view()),
url(r'^html1$', HTMLView1.as_view()),
)
@@ -197,11 +216,11 @@ class RendererIntegrationTests(TestCase):
self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
self.assertEquals(resp.status_code, DUMMYSTATUS)
-# TODO: can't pass because view is a simple Django view and response is an ErrorResponse
-# def test_unsatisfiable_accept_header_on_request_returns_406_status(self):
-# """If the Accept header is unsatisfiable we should return a 406 Not Acceptable response."""
-# resp = self.client.get('/', HTTP_ACCEPT='foo/bar')
-# self.assertEquals(resp.status_code, status.HTTP_406_NOT_ACCEPTABLE)
+ @unittest.skip('can\'t pass because view is a simple Django view and response is an ImmediateResponse')
+ def test_unsatisfiable_accept_header_on_request_returns_406_status(self):
+ """If the Accept header is unsatisfiable we should return a 406 Not Acceptable response."""
+ resp = self.client.get('/', HTTP_ACCEPT='foo/bar')
+ self.assertEquals(resp.status_code, status.HTTP_406_NOT_ACCEPTABLE)
def test_specified_renderer_serializes_content_on_format_query(self):
"""If a 'format' query is specified, the renderer with the matching