diff options
Diffstat (limited to 'djangorestframework/tests/renderers.py')
| -rw-r--r-- | djangorestframework/tests/renderers.py | 98 | 
1 files changed, 93 insertions, 5 deletions
| diff --git a/djangorestframework/tests/renderers.py b/djangorestframework/tests/renderers.py index 569eb640..d2046212 100644 --- a/djangorestframework/tests/renderers.py +++ b/djangorestframework/tests/renderers.py @@ -2,16 +2,17 @@ from django.conf.urls.defaults import patterns, url  from django import http  from django.test import TestCase +from djangorestframework import status  from djangorestframework.compat import View as DjangoView -from djangorestframework.renderers import BaseRenderer, JSONRenderer -from djangorestframework.parsers import JSONParser +from djangorestframework.renderers import BaseRenderer, JSONRenderer, YAMLRenderer +from djangorestframework.parsers import JSONParser, YAMLParser  from djangorestframework.mixins import ResponseMixin  from djangorestframework.response import Response  from djangorestframework.utils.mediatypes import add_media_type_param  from StringIO import StringIO -DUMMYSTATUS = 200 +DUMMYSTATUS = status.HTTP_200_OK  DUMMYCONTENT = 'dummycontent'  RENDERER_A_SERIALIZER = lambda x: 'Renderer A: %s' % x @@ -19,12 +20,14 @@ RENDERER_B_SERIALIZER = lambda x: 'Renderer B: %s' % x  class RendererA(BaseRenderer):      media_type = 'mock/renderera' +    format="formata"      def render(self, obj=None, media_type=None):          return RENDERER_A_SERIALIZER(obj)  class RendererB(BaseRenderer):      media_type = 'mock/rendererb' +    format="formatb"      def render(self, obj=None, media_type=None):          return RENDERER_B_SERIALIZER(obj) @@ -32,11 +35,13 @@ class RendererB(BaseRenderer):  class MockView(ResponseMixin, DjangoView):      renderers = (RendererA, RendererB) -    def get(self, request): +    def get(self, request, **kwargs):          response = Response(DUMMYSTATUS, DUMMYCONTENT)          return self.render(response) +      urlpatterns = patterns('', +    url(r'^.*\.(?P<format>.+)$', MockView.as_view(renderers=[RendererA, RendererB])),      url(r'^$', MockView.as_view(renderers=[RendererA, RendererB])),  ) @@ -85,10 +90,58 @@ class RendererIntegrationTests(TestCase):          self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))          self.assertEquals(resp.status_code, DUMMYSTATUS) +    def test_specified_renderer_serializes_content_on_accept_query(self): +        """The '_accept' query string should behave in the same way as the Accept header.""" +        resp = self.client.get('/?_accept=%s' % RendererB.media_type) +        self.assertEquals(resp['Content-Type'], RendererB.media_type) +        self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) +        self.assertEquals(resp.status_code, DUMMYSTATUS) +      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, 406) +        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 +        format attribute should serialize the response.""" +        resp = self.client.get('/?format=%s' % RendererB.format) +        self.assertEquals(resp['Content-Type'], RendererB.media_type) +        self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) +        self.assertEquals(resp.status_code, DUMMYSTATUS) + +    def test_specified_renderer_serializes_content_on_format_kwargs(self): +        """If a 'format' keyword arg is specified, the renderer with the matching +        format attribute should serialize the response.""" +        resp = self.client.get('/something.formatb') +        self.assertEquals(resp['Content-Type'], RendererB.media_type) +        self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) +        self.assertEquals(resp.status_code, DUMMYSTATUS) + +    def test_specified_renderer_is_used_on_format_query_with_matching_accept(self): +        """If both a 'format' query and a matching Accept header specified, +        the renderer with the matching format attribute should serialize the response.""" +        resp = self.client.get('/?format=%s' % RendererB.format, +                               HTTP_ACCEPT=RendererB.media_type) +        self.assertEquals(resp['Content-Type'], RendererB.media_type) +        self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) +        self.assertEquals(resp.status_code, DUMMYSTATUS) + +    def test_conflicting_format_query_and_accept_ignores_accept(self): +        """If a 'format' query is specified that does not match the Accept +        header, we should only honor the 'format' query string.""" +        resp = self.client.get('/?format=%s' % RendererB.format, +                               HTTP_ACCEPT='dummy') +        self.assertEquals(resp['Content-Type'], RendererB.media_type) +        self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) +        self.assertEquals(resp.status_code, DUMMYSTATUS) + +    def test_bla(self): +        resp = self.client.get('/?format=formatb', +            HTTP_ACCEPT='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8') +        self.assertEquals(resp['Content-Type'], RendererB.media_type) +        self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT)) +        self.assertEquals(resp.status_code, DUMMYSTATUS)  _flat_repr = '{"foo": ["bar", "baz"]}' @@ -136,3 +189,38 @@ class JSONRendererTests(TestCase):          content = renderer.render(obj, 'application/json')          (data, files) = parser.parse(StringIO(content))          self.assertEquals(obj, data)     + + + +if YAMLRenderer: +    _yaml_repr = 'foo: [bar, baz]\n' +     +     +    class YAMLRendererTests(TestCase): +        """ +        Tests specific to the JSON Renderer +        """ +     +        def test_render(self): +            """ +            Test basic YAML rendering. +            """ +            obj = {'foo':['bar','baz']} +            renderer = YAMLRenderer(None) +            content = renderer.render(obj, 'application/yaml') +            self.assertEquals(content, _yaml_repr) +     +         +        def test_render_and_parse(self): +            """ +            Test rendering and then parsing returns the original object. +            IE obj -> render -> parse -> obj. +            """ +            obj = {'foo':['bar','baz']} +     +            renderer = YAMLRenderer(None) +            parser = YAMLParser(None) +     +            content = renderer.render(obj, 'application/yaml') +            (data, files) = parser.parse(StringIO(content)) +            self.assertEquals(obj, data)    
\ No newline at end of file | 
