Improve host, schemes and basePath handling (#42)

* added handling of basePath by taking into account SCRIPT_NAME and the longest common prefix
* improved handling of NamespaceVersioning by excluding URLs of differing versions
* added documentation and error messages for the problem reported in #37
This commit is contained in:
Cristi Vîjdea
2018-01-12 03:37:04 +01:00
committed by GitHub
parent 757d47e1c0
commit 7a3fe8ec0c
13 changed files with 247 additions and 99 deletions
+14 -4
View File
@@ -5,6 +5,7 @@ import pytest
from drf_yasg import codecs, openapi
from drf_yasg.codecs import yaml_sane_load
from drf_yasg.errors import SwaggerGenerationError
from drf_yasg.generators import OpenAPISchemaGenerator
@@ -46,14 +47,23 @@ def test_yaml_and_json_match(codec_yaml, codec_json, swagger):
def test_basepath_only(mock_schema_request):
with pytest.raises(SwaggerGenerationError):
generator = OpenAPISchemaGenerator(
info=openapi.Info(title="Test generator", default_version="v1"),
version="v2",
url='/basepath/',
)
generator.get_schema(mock_schema_request, public=True)
def test_no_netloc(mock_schema_request):
generator = OpenAPISchemaGenerator(
info=openapi.Info(title="Test generator", default_version="v1"),
version="v2",
url='/basepath/',
url='',
)
swagger = generator.get_schema(mock_schema_request, public=True)
assert 'host' not in swagger
assert 'schemes' not in swagger
assert swagger['basePath'] == '/' # base path is not implemented for now
assert 'host' not in swagger and 'schemes' not in swagger
assert swagger['info']['version'] == 'v2'
+15 -18
View File
@@ -4,24 +4,25 @@ from drf_yasg.codecs import yaml_sane_load
def _get_versioned_schema(prefix, client, validate_schema):
response = client.get(prefix + 'swagger.yaml')
response = client.get(prefix + '/swagger.yaml')
assert response.status_code == 200
swagger = yaml_sane_load(response.content.decode('utf-8'))
assert swagger['basePath'] == prefix
validate_schema(swagger)
assert prefix + 'snippets/' in swagger['paths']
assert '/snippets/' in swagger['paths']
return swagger
def _check_v1(swagger, prefix):
def _check_v1(swagger):
assert swagger['info']['version'] == '1.0'
versioned_post = swagger['paths'][prefix + 'snippets/']['post']
versioned_post = swagger['paths']['/snippets/']['post']
assert versioned_post['responses']['201']['schema']['$ref'] == '#/definitions/Snippet'
assert 'v2field' not in swagger['definitions']['Snippet']['properties']
def _check_v2(swagger, prefix):
def _check_v2(swagger):
assert swagger['info']['version'] == '2.0'
versioned_post = swagger['paths'][prefix + 'snippets/']['post']
versioned_post = swagger['paths']['/snippets/']['post']
assert versioned_post['responses']['201']['schema']['$ref'] == '#/definitions/SnippetV2'
assert 'v2field' in swagger['definitions']['SnippetV2']['properties']
v2field = swagger['definitions']['SnippetV2']['properties']['v2field']
@@ -30,27 +31,23 @@ def _check_v2(swagger, prefix):
@pytest.mark.urls('urlconfs.url_versioning')
def test_url_v1(client, validate_schema):
prefix = '/versioned/url/v1.0/'
swagger = _get_versioned_schema(prefix, client, validate_schema)
_check_v1(swagger, prefix)
swagger = _get_versioned_schema('/versioned/url/v1.0', client, validate_schema)
_check_v1(swagger)
@pytest.mark.urls('urlconfs.url_versioning')
def test_url_v2(client, validate_schema):
prefix = '/versioned/url/v2.0/'
swagger = _get_versioned_schema(prefix, client, validate_schema)
_check_v2(swagger, prefix)
swagger = _get_versioned_schema('/versioned/url/v2.0', client, validate_schema)
_check_v2(swagger)
@pytest.mark.urls('urlconfs.ns_versioning')
def test_ns_v1(client, validate_schema):
prefix = '/versioned/ns/v1.0/'
swagger = _get_versioned_schema(prefix, client, validate_schema)
_check_v1(swagger, prefix)
swagger = _get_versioned_schema('/versioned/ns/v1.0', client, validate_schema)
_check_v1(swagger)
@pytest.mark.urls('urlconfs.ns_versioning')
def test_ns_v2(client, validate_schema):
prefix = '/versioned/ns/v2.0/'
swagger = _get_versioned_schema(prefix, client, validate_schema)
_check_v2(swagger, prefix)
swagger = _get_versioned_schema('/versioned/ns/v2.0', client, validate_schema)
_check_v2(swagger)
+1 -1
View File
@@ -17,7 +17,7 @@ class SnippetListV2(SnippetListV1):
serializer_class = SnippetSerializerV2
app_name = 'test_ns_versioning'
app_name = '2.0'
urlpatterns = [
url(r"^$", SnippetListV2.as_view())
+1 -1
View File
@@ -19,7 +19,7 @@ schema_patterns = [
urlpatterns = [
url(VERSION_PREFIX_NS + r"v1.0/snippets/", include(ns_version1, namespace='1.0')),
url(VERSION_PREFIX_NS + r"v2.0/snippets/", include(ns_version2, namespace='2.0')),
url(VERSION_PREFIX_NS + r"v2.0/snippets/", include(ns_version2)),
url(VERSION_PREFIX_NS + r'v1.0/', include((schema_patterns, '1.0'))),
url(VERSION_PREFIX_NS + r'v2.0/', include((schema_patterns, '2.0'))),
]