Skip to content
This repository was archived by the owner on Nov 19, 2023. It is now read-only.

Commit 40324dc

Browse files
authored
Merge pull request #284 from darduf/support-for-other-content-types
regex to support alt application/*json types
2 parents a6b60f0 + 73b7fb7 commit 40324dc

File tree

5 files changed

+862
-3
lines changed

5 files changed

+862
-3
lines changed

openapi_tester/schema_tester.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
""" Schema Tester """
22
from __future__ import annotations
33

4+
import re
45
from itertools import chain
56
from typing import TYPE_CHECKING, Any, Callable, cast
67

@@ -89,11 +90,16 @@ def __init__(
8990
raise ImproperlyConfigured(INIT_ERROR)
9091

9192
@staticmethod
92-
def get_key_value(schema: dict[str, dict], key: str, error_addon: str = "") -> dict:
93+
def get_key_value(schema: dict[str, dict], key: str, error_addon: str = "", use_regex=False) -> dict:
9394
"""
9495
Returns the value of a given key
9596
"""
9697
try:
98+
if use_regex:
99+
compiled_pattern = re.compile(key)
100+
for key_ in schema.keys():
101+
if compiled_pattern.match(key_):
102+
return schema[key_]
97103
return schema[key]
98104
except KeyError as e:
99105
raise UndocumentedSchemaSectionError(
@@ -168,9 +174,10 @@ def get_response_schema_section(self, response: Response) -> dict[str, Any]:
168174
)
169175
json_object = self.get_key_value(
170176
content_object,
171-
"application/json",
177+
r"^application\/.*json$",
172178
"\n\nNo `application/json` responses documented for method: "
173179
f"{response_method}, path: {parameterized_path}",
180+
use_regex=True,
174181
)
175182
return self.get_key_value(json_object, "schema")
176183

test_project/api/views/pets.py

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from __future__ import annotations
2+
3+
from typing import TYPE_CHECKING
4+
5+
from rest_framework.response import Response
6+
from rest_framework.status import HTTP_200_OK
7+
from rest_framework.views import APIView
8+
9+
if TYPE_CHECKING:
10+
from rest_framework.request import Request
11+
12+
13+
class Pet(APIView):
14+
def get(self, request: Request, petId: int) -> Response:
15+
pet = {"name": "doggie", "category": {"id": 1, "name": "Dogs"}, "photoUrls": [], "status": "available"}
16+
return Response(pet, HTTP_200_OK)

test_project/urls.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from django.conf.urls.i18n import i18n_patterns
2-
from django.urls import include, path
2+
from django.urls import include, path, re_path
33
from drf_yasg import openapi
44
from drf_yasg.views import get_schema_view
55
from rest_framework import permissions, routers
@@ -11,6 +11,7 @@
1111
from test_project.api.views.i18n import Languages
1212
from test_project.api.views.items import Items
1313
from test_project.api.views.names import EmptyNameViewSet, NamesRetrieveView, NameViewSet
14+
from test_project.api.views.pets import Pet
1415
from test_project.api.views.products import Products
1516
from test_project.api.views.snake_cased_response import SnakeCasedResponse
1617
from test_project.api.views.trucks import BadTrucks, GoodTrucks
@@ -34,6 +35,7 @@
3435
path("api/<str:version>/snake-case/", SnakeCasedResponse.as_view()),
3536
# ^trailing slash is here on purpose
3637
path("api/<str:version>/router_generated/", include(router.urls)),
38+
re_path(r"api/pet/(?P<petId>\d+)", Pet.as_view(), name="get-pet"),
3739
]
3840

3941
internationalised_urlpatterns = i18n_patterns(

0 commit comments

Comments
 (0)