Exemplo n.º 1
0
 def setUp(self):
     self.renderers = [
         MockJSONRenderer(),
         MockHTMLRenderer(),
         MockOpenAPIRenderer()
     ]
     self.negotiator = DefaultContentNegotiation()
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)
class TestAcceptedMediaType(TestCase):
    def setUp(self):
        self.renderers = [MockJSONRenderer(), MockHTMLRenderer(), MockOpenAPIRenderer()]
        self.negotiator = DefaultContentNegotiation()

    def select_renderer(self, request):
        return self.negotiator.select_renderer(request, self.renderers)

    def test_client_without_accept_use_renderer(self):
        request = Request(factory.get('/'))
        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 = 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 = self.select_renderer(request)
        self.assertEqual(accepted_media_type, 'application/json; indent=8')

    def test_client_specifies_parameter(self):
        request = Request(factory.get('/', HTTP_ACCEPT='application/openapi+json;version=2.0'))
        accepted_renderer, accepted_media_type = self.select_renderer(request)
        self.assertEqual(accepted_media_type, 'application/openapi+json;version=2.0')
        self.assertEqual(accepted_renderer.format, 'swagger')
Exemplo n.º 4
0
def is_browser_request(request):
    """
    Differentiate between command line and browser requests
    """
    drf_renderer = DefaultContentNegotiation().select_renderer(
        RestRequest(request),
        [renderers.JSONRenderer, renderers.TemplateHTMLRenderer])
    return drf_renderer[0] is renderers.TemplateHTMLRenderer
Exemplo n.º 5
0
class TestAcceptedMediaType(TestCase):
    def setUp(self):
        self.renderers = [
            MockJSONRenderer(),
            MockHTMLRenderer(),
            MockOpenAPIRenderer()
        ]
        self.negotiator = DefaultContentNegotiation()

    def select_renderer(self, request):
        return self.negotiator.select_renderer(request, self.renderers)

    def test_client_without_accept_use_renderer(self):
        request = Request(factory.get('/'))
        accepted_renderer, accepted_media_type = self.select_renderer(request)
        assert accepted_media_type == 'application/json'

    def test_client_underspecifies_accept_use_renderer(self):
        request = Request(factory.get('/', HTTP_ACCEPT='*/*'))
        accepted_renderer, accepted_media_type = self.select_renderer(request)
        assert 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 = self.select_renderer(request)
        assert accepted_media_type == 'application/json; indent=8'

    def test_client_specifies_parameter(self):
        request = Request(
            factory.get('/',
                        HTTP_ACCEPT='application/openapi+json;version=2.0'))
        accepted_renderer, accepted_media_type = self.select_renderer(request)
        assert accepted_media_type == 'application/openapi+json;version=2.0'
        assert accepted_renderer.format == 'swagger'

    def test_match_is_false_if_main_types_not_match(self):
        mediatype = _MediaType('test_1')
        anoter_mediatype = _MediaType('test_2')
        assert mediatype.match(anoter_mediatype) is False

    def test_mediatype_match_is_false_if_keys_not_match(self):
        mediatype = _MediaType(';test_param=foo')
        another_mediatype = _MediaType(';test_param=bar')
        assert mediatype.match(another_mediatype) is False

    def test_mediatype_precedence_with_wildcard_subtype(self):
        mediatype = _MediaType('test/*')
        assert mediatype.precedence == 1

    def test_mediatype_string_representation(self):
        mediatype = _MediaType('test/*; foo=bar')
        params_str = ''
        for key, val in mediatype.params.items():
            params_str += '; %s=%s' % (key, val)
        expected = 'test/*' + params_str
        assert str(mediatype) == expected
Exemplo n.º 6
0
 def select_renderer(self, request, renderers, format_suffix):
     """
     Select the first renderer in the `.renderer_classes` list.
     """
     # Allow URL style format override.  eg. "?format=json
     format_query_param = self.settings.URL_FORMAT_OVERRIDE
     format = format_suffix or request.query_params.get(format_query_param)
     if format is None:
         return (renderers[0], renderers[0].media_type)
     else:
         return DefaultContentNegotiation.select_renderer(
             self, request, renderers, format_suffix
         )
Exemplo n.º 7
0
 def get(self, request, *args, **kwargs):
     # The django.auth.contrib login form doesn't perform the content
     # negotiation we've come to expect from DRF; add in code to catch
     # situations where Accept != text/html (or */*) and reply with
     # an HTTP 406
     try:
         DefaultContentNegotiation().select_renderer(request, [StaticHTMLRenderer], 'html')
     except NotAcceptable:
         resp = Response(status=status.HTTP_406_NOT_ACCEPTABLE)
         resp.accepted_renderer = StaticHTMLRenderer()
         resp.accepted_media_type = 'text/plain'
         resp.renderer_context = {}
         return resp
     return super(LoggedLoginView, self).get(request, *args, **kwargs)
Exemplo n.º 8
0
    def select_renderer(self, request, renderers, format_suffix):
        """
            Select the first renderer in the .'renderer_classes' list or 'DEFAULT_RENDER_CLASES' list.
        """
        # Allow URL style format override.  eg. "?format=json
        format_query_param = self.settings.URL_FORMAT_OVERRIDE
        format = format_suffix or request.query_params.get(format_query_param)
        request.query_params.get((format_query_param), format)

        if format != 'xml':
            # Return json render, get render of render_clases list in views
            return (renderers[0], renderers[0].media_type)
        else:
            # Return content negotiation by default of DRF
            return DefaultContentNegotiation.select_renderer(self, request, renderers, format_suffix)
Exemplo n.º 9
0
class TestAcceptedMediaType(TestCase):
    def setUp(self):
        self.renderers = [MockJSONRenderer(), MockHTMLRenderer()]
        self.negotiator = DefaultContentNegotiation()

    def select_renderer(self, request):
        return self.negotiator.select_renderer(request, self.renderers)

    def test_client_without_accept_use_renderer(self):
        request = Request(factory.get("/"))
        accepted_renderer, accepted_media_type = self.select_renderer(request)
        self.assertEquals(accepted_media_type, "application/json")

    def test_client_underspecifies_accept_use_renderer(self):
        request = Request(factory.get("/", HTTP_ACCEPT="*/*"))
        accepted_renderer, accepted_media_type = self.select_renderer(request)
        self.assertEquals(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 = self.select_renderer(request)
        self.assertEquals(accepted_media_type, "application/json; indent=8")
Exemplo n.º 10
0
class TestAcceptedMediaType(TestCase):
    def setUp(self):
        self.renderers = [MockJSONRenderer(), MockHTMLRenderer()]
        self.negotiator = DefaultContentNegotiation()

    def select_renderer(self, request):
        return self.negotiator.select_renderer(request, self.renderers)

    def test_client_without_accept_use_renderer(self):
        request = factory.get('/')
        accepted_renderer, accepted_media_type = self.select_renderer(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.select_renderer(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.select_renderer(request)
        self.assertEquals(accepted_media_type, 'application/json; indent=8')
Exemplo n.º 11
0
 def setUp(self):
     self.renderers = [MockJSONRenderer(), MockHTMLRenderer()]
     self.negotiator = DefaultContentNegotiation()
Exemplo n.º 12
0
 def setUp(self):
     self.renderers = [NoCharsetSpecifiedRenderer()]
     self.negotiator = DefaultContentNegotiation()
Exemplo n.º 13
0
class TestAcceptedMediaType(TestCase):
    def setUp(self):
        self.renderers = [
            MockJSONRenderer(),
            MockHTMLRenderer(),
            MockOpenAPIRenderer()
        ]
        self.negotiator = DefaultContentNegotiation()

    def select_renderer(self, request):
        return self.negotiator.select_renderer(request, self.renderers)

    def test_client_without_accept_use_renderer(self):
        request = Request(factory.get('/'))
        accepted_renderer, accepted_media_type = self.select_renderer(request)
        assert accepted_media_type == 'application/json'

    def test_client_underspecifies_accept_use_renderer(self):
        request = Request(factory.get('/', HTTP_ACCEPT='*/*'))
        accepted_renderer, accepted_media_type = self.select_renderer(request)
        assert 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 = self.select_renderer(request)
        assert accepted_media_type == 'application/json; indent=8'

    def test_client_specifies_parameter(self):
        request = Request(
            factory.get('/',
                        HTTP_ACCEPT='application/openapi+json;version=2.0'))
        accepted_renderer, accepted_media_type = self.select_renderer(request)
        assert accepted_media_type == 'application/openapi+json;version=2.0'
        assert accepted_renderer.format == 'swagger'

    def test_match_is_false_if_main_types_not_match(self):
        mediatype = _MediaType('test_1')
        anoter_mediatype = _MediaType('test_2')
        assert mediatype.match(anoter_mediatype) is False

    def test_mediatype_match_is_false_if_keys_not_match(self):
        mediatype = _MediaType(';test_param=foo')
        another_mediatype = _MediaType(';test_param=bar')
        assert mediatype.match(another_mediatype) is False

    def test_mediatype_precedence_with_wildcard_subtype(self):
        mediatype = _MediaType('test/*')
        assert mediatype.precedence == 1

    def test_mediatype_string_representation(self):
        mediatype = _MediaType('test/*; foo=bar')
        assert str(mediatype) == 'test/*; foo=bar'

    def test_raise_error_if_no_suitable_renderers_found(self):
        class MockRenderer:
            format = 'xml'

        renderers = [MockRenderer()]
        with pytest.raises(Http404):
            self.negotiator.filter_renderers(renderers, format='json')