from __future__ import unicode_literals from django.test import TestCase from rest_framework.negotiation import DefaultContentNegotiation from rest_framework.renderers import BaseRenderer from rest_framework.request import Request from rest_framework.test import APIRequestFactory factory = APIRequestFactory() class MockOpenAPIRenderer(BaseRenderer): media_type = 'application/openapi+json;version=2.0' format = 'swagger' class MockJSONRenderer(BaseRenderer): media_type = 'application/json' class MockHTMLRenderer(BaseRenderer): media_type = 'text/html' class NoCharsetSpecifiedRenderer(BaseRenderer): media_type = 'my/media' 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'