aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework/tests
diff options
context:
space:
mode:
Diffstat (limited to 'rest_framework/tests')
-rw-r--r--rest_framework/tests/decorators.py2
-rw-r--r--rest_framework/tests/htmlrenderer.py50
-rw-r--r--rest_framework/tests/negotiation.py37
3 files changed, 88 insertions, 1 deletions
diff --git a/rest_framework/tests/decorators.py b/rest_framework/tests/decorators.py
index 4be53786..e943d8fe 100644
--- a/rest_framework/tests/decorators.py
+++ b/rest_framework/tests/decorators.py
@@ -58,7 +58,7 @@ class DecoratorTestCase(TestCase):
request = self.factory.get('/')
response = view(request)
- self.assertTrue(isinstance(response.renderer, JSONRenderer))
+ self.assertTrue(isinstance(response.accepted_renderer, JSONRenderer))
def test_parser_classes(self):
diff --git a/rest_framework/tests/htmlrenderer.py b/rest_framework/tests/htmlrenderer.py
new file mode 100644
index 00000000..7a7f2743
--- /dev/null
+++ b/rest_framework/tests/htmlrenderer.py
@@ -0,0 +1,50 @@
+from django.conf.urls.defaults import patterns, url
+from django.test import TestCase
+from django.template import TemplateDoesNotExist, Template
+import django.template.loader
+from rest_framework.decorators import api_view, renderer_classes
+from rest_framework.renderers import HTMLTemplateRenderer
+from rest_framework.response import Response
+
+
+@api_view(('GET',))
+@renderer_classes((HTMLTemplateRenderer,))
+def example(request):
+ """
+ A view that can returns an HTML representation.
+ """
+ data = {'object': 'foobar'}
+ return Response(data, template_name='example.html')
+
+
+urlpatterns = patterns('',
+ url(r'^$', example),
+)
+
+
+class HTMLRendererTests(TestCase):
+ urls = 'rest_framework.tests.htmlrenderer'
+
+ def setUp(self):
+ """
+ Monkeypatch get_template
+ """
+ self.get_template = django.template.loader.get_template
+
+ def get_template(template_name):
+ if template_name == 'example.html':
+ return Template("example: {{ object }}")
+ raise TemplateDoesNotExist(template_name)
+
+ django.template.loader.get_template = get_template
+
+ def tearDown(self):
+ """
+ Revert monkeypatching
+ """
+ django.template.loader.get_template = self.get_template
+
+ def test_simple_html_view(self):
+ response = self.client.get('/')
+ self.assertContains(response, "example: foobar")
+ self.assertEquals(response['Content-Type'], 'text/html')
diff --git a/rest_framework/tests/negotiation.py b/rest_framework/tests/negotiation.py
new file mode 100644
index 00000000..d8265b43
--- /dev/null
+++ b/rest_framework/tests/negotiation.py
@@ -0,0 +1,37 @@
+from django.test import TestCase
+from django.test.client import RequestFactory
+from rest_framework.negotiation import DefaultContentNegotiation
+
+factory = RequestFactory()
+
+
+class MockJSONRenderer(object):
+ media_type = 'application/json'
+
+
+class MockHTMLRenderer(object):
+ media_type = 'text/html'
+
+
+class TestAcceptedMediaType(TestCase):
+ def setUp(self):
+ self.renderers = [MockJSONRenderer(), MockHTMLRenderer()]
+ self.negotiator = DefaultContentNegotiation()
+
+ def negotiate(self, request):
+ return self.negotiator.negotiate(request, self.renderers)
+
+ def test_client_without_accept_use_renderer(self):
+ request = factory.get('/')
+ accepted_renderer, accepted_media_type = self.negotiate(request)
+ self.assertEquals(accepted_media_type, 'application/json')
+
+ def test_client_underspecifies_accept_use_renderer(self):
+ request = factory.get('/', HTTP_ACCEPT='*/*')
+ accepted_renderer, accepted_media_type = self.negotiate(request)
+ self.assertEquals(accepted_media_type, 'application/json')
+
+ def test_client_overspecifies_accept_use_client(self):
+ request = factory.get('/', HTTP_ACCEPT='application/json; indent=8')
+ accepted_renderer, accepted_media_type = self.negotiate(request)
+ self.assertEquals(accepted_media_type, 'application/json; indent=8')