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
Exemple #6
0
    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