def test__parse_accept__default(settings, accept, expected_version): settings.API_FALLBACK_VERSION = 'fallback' settings.API_DEFAULT_VERSION = 'default' settings.API_VERSIONS = {'v1': 'v1', 'v2': 'v2'} settings.API_FALLBACK_FOR_APPLICATION_JSON_ONLY = True result = parse_accept(accept) assert expected_version == result.version
def test__parse_accept__versions_and_resource_discriminator( settings, accept, expected_version, expected_discriminator): settings.API_FALLBACK_VERSION = 'fallback' settings.API_DEFAULT_VERSION = 'default' settings.API_RESOURCE_DEFAULT = 'common' settings.API_VERSIONS = {'v1': 'v1', 'v2': 'v2'} result = parse_accept(accept) assert expected_version == result.version assert expected_discriminator == result.resource_discriminator
def test_parse_accept_versions(settings, header, expected_version): settings.API_FALLBACK_VERSION = 'fallback' settings.API_DEFAULT_VERSION = 'default' settings.API_VERSIONS = { 'v1': 'v1', 'v2': 'v2', } result = parse_accept(header) assert expected_version == result.version
def test_parse_accept_fallback(settings, header, expected_version): settings.API_FALLBACK_VERSION = 'fallback' settings.API_DEFAULT_VERSION = 'default' settings.API_VERSIONS = { 'v1': 'v1', 'v2': 'v2', } settings.API_FALLBACK_FOR_APPLICATION_JSON_ONLY = False result = parse_accept(header) assert expected_version == result.version
def __call__(self, request: HttpRequest) -> HttpResponse: if not self.is_api_call(request): return self.get_response(request) if self.is_schema_call(request): api_params = parse_accept( f'application/vnd.{self.api_vendor_accept}', vendor=self.api_vendor_accept) else: api_params = parse_accept(request.headers.get('accept'), vendor=self.api_vendor_accept) request.api_params = api_params api_version = (api_params and api_params.version) or self.api_fallback_version request.urlconf = self.api_versions.get(api_version, self.fallback_urlconf) response = self.get_response(request) if api_params is not None: response[ f'X-{self.api_vendor_string}-Media-Type'] = get_api_header( api_params) return response
def __init__(self, *args: typing.Any, **kwargs: typing.Any) -> None: self.local_refs_registry = LocalRefsRegistry() if not self.openapi_version: self.openapi_version = VersionInfo.parse(settings.API_DEFAULT_OPENAPI_VERSION) self._operation_ids: typing.Dict[str, typing.Tuple[str, str]] = {} self.api_default_version = settings.API_DEFAULT_VERSION self.api_default_format = settings.API_DEFAULT_FORMAT self.api_default_content_type = f'application/vnd.{settings.API_VENDOR_STRING.lower()}' accept = kwargs.pop('accept', None) if accept: api_params = parse_accept(accept, settings.API_VENDOR_STRING.lower()) api_version = api_params and api_params.version urlconf = settings.API_VERSIONS.get(api_version) if urlconf is None: raise Exception(f'Can not determine URLCONF for Accept string {accept}') self.api_version = api_version self.api_resource = api_params.resource_discriminator self.api_formats = [api_params.format] self.include_default_schema = False else: self.api_version = self.api_default_version urlconf = kwargs.pop('urlconf', None) if urlconf: for api_version, api_urlconf in settings.API_VERSIONS.items(): if api_urlconf == urlconf: self.api_version = api_version break self.api_resource = None self.api_formats = get_available_format(settings.API_FORMATS) self.include_default_schema = True kwargs['urlconf'] = urlconf super().__init__(*args, **kwargs)
def test__parse_accept__vendor_success_case(vendor, expected_vendor): result = parse_accept('application/vnd', vendor=vendor) assert expected_vendor == result.vendor
def test_parse_none(): result = parse_accept(None) assert result is None