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')
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
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
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 )
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)
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)
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")
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')
def setUp(self): self.renderers = [MockJSONRenderer(), MockHTMLRenderer()] self.negotiator = DefaultContentNegotiation()
def setUp(self): self.renderers = [NoCharsetSpecifiedRenderer()] self.negotiator = DefaultContentNegotiation()
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')