mirror of
https://github.com/LukeHagar/connexion.git
synced 2025-12-06 04:19:26 +00:00
Leverage Starlette TestClient for both FlaskApp and AsyncApp tests
This commit is contained in:
@@ -6,6 +6,7 @@ import abc
|
||||
import pathlib
|
||||
import typing as t
|
||||
|
||||
from starlette.testclient import TestClient
|
||||
from starlette.types import Receive, Scope, Send
|
||||
|
||||
from connexion.middleware import ConnexionMiddleware, SpecMiddleware
|
||||
@@ -224,6 +225,7 @@ class AbstractApp:
|
||||
@abc.abstractmethod
|
||||
def test_client(self, **kwargs):
|
||||
"""Creates a test client for this application."""
|
||||
return TestClient(self, **kwargs)
|
||||
|
||||
def run(self, import_string: str = None, **kwargs):
|
||||
"""Run the application using uvicorn.
|
||||
|
||||
@@ -8,7 +8,6 @@ import typing as t
|
||||
|
||||
from starlette.responses import Response as StarletteResponse
|
||||
from starlette.routing import Router
|
||||
from starlette.testclient import TestClient
|
||||
from starlette.types import Receive, Scope, Send
|
||||
|
||||
from connexion.apps.abstract import AbstractApp
|
||||
@@ -186,6 +185,3 @@ class AsyncApp(AbstractApp):
|
||||
self, code_or_exception: t.Union[int, t.Type[Exception]], function: t.Callable
|
||||
) -> None:
|
||||
"""TODO: implement"""
|
||||
|
||||
def test_client(self, **kwargs):
|
||||
return TestClient(self)
|
||||
|
||||
@@ -5,12 +5,10 @@ This module defines a FlaskApp, a Connexion application to wrap a Flask applicat
|
||||
import pathlib
|
||||
import typing as t
|
||||
|
||||
import a2wsgi
|
||||
import flask
|
||||
import werkzeug.exceptions
|
||||
from flask import Response as FlaskResponse
|
||||
from flask import signals
|
||||
from flask.testing import FlaskClient
|
||||
from starlette.types import Receive, Scope, Send
|
||||
|
||||
from connexion.apps.abstract import AbstractApp
|
||||
@@ -251,15 +249,3 @@ class FlaskApp(AbstractApp):
|
||||
self, code_or_exception: t.Union[int, t.Type[Exception]], function: t.Callable
|
||||
) -> None:
|
||||
self.app.register_error_handler(code_or_exception, function)
|
||||
|
||||
def test_client(self, **kwargs):
|
||||
self.app.wsgi_app = a2wsgi.ASGIMiddleware(self.middleware)
|
||||
self.app.test_client_class = ConnexionTestClient
|
||||
return self.app.test_client(**kwargs)
|
||||
|
||||
|
||||
class ConnexionTestClient(FlaskClient):
|
||||
def open(self, *args, **kwargs):
|
||||
# Align with async test client
|
||||
kwargs["query_string"] = kwargs.pop("params", None)
|
||||
return super().open(*args, **kwargs)
|
||||
|
||||
@@ -54,7 +54,7 @@ Jinja2 = "^3.0.0"
|
||||
python-multipart = "~0.0.5"
|
||||
PyYAML = ">= 5.1, < 7"
|
||||
requests = "^2.27"
|
||||
starlette = "^0.19"
|
||||
starlette = "^0.22"
|
||||
typing-extensions = "^4"
|
||||
werkzeug = "^2.2.1"
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ def test_app_with_relative_path(simple_api_spec_dir, spec):
|
||||
app_client = app.test_client()
|
||||
get_bye = app_client.get("/v1.0/bye/jsantos")
|
||||
assert get_bye.status_code == 200
|
||||
assert get_bye.data == b"Goodbye jsantos"
|
||||
assert get_bye.text == "Goodbye jsantos"
|
||||
|
||||
|
||||
def test_app_with_resolver(simple_api_spec_dir, spec):
|
||||
@@ -53,7 +53,7 @@ def test_app_with_different_uri_parser(simple_api_spec_dir):
|
||||
app_client = app.test_client()
|
||||
resp = app_client.get("/v1.0/test_array_csv_query_param?items=a,b,c&items=d,e,f")
|
||||
assert resp.status_code == 200
|
||||
j = json.loads(resp.get_data(as_text=True))
|
||||
j = resp.json()
|
||||
assert j == ["a", "b", "c"]
|
||||
|
||||
|
||||
@@ -64,9 +64,9 @@ def test_swagger_ui(simple_api_spec_dir, spec):
|
||||
swagger_ui = app_client.get("/v1.0/ui/")
|
||||
assert swagger_ui.status_code == 200
|
||||
spec_json_filename = "/v1.0/{spec}".format(spec=spec.replace("yaml", "json"))
|
||||
assert spec_json_filename.encode() in swagger_ui.data
|
||||
assert spec_json_filename in swagger_ui.text
|
||||
if "openapi" in spec:
|
||||
assert b"swagger-ui-config.json" not in swagger_ui.data
|
||||
assert "swagger-ui-config.json" not in swagger_ui.text
|
||||
|
||||
|
||||
def test_swagger_ui_with_config(simple_api_spec_dir, spec):
|
||||
@@ -82,7 +82,7 @@ def test_swagger_ui_with_config(simple_api_spec_dir, spec):
|
||||
swagger_ui = app_client.get("/v1.0/ui/")
|
||||
assert swagger_ui.status_code == 200
|
||||
if "openapi" in spec:
|
||||
assert b'configUrl: "swagger-ui-config.json"' in swagger_ui.data
|
||||
assert 'configUrl: "swagger-ui-config.json"' in swagger_ui.text
|
||||
|
||||
|
||||
def test_no_swagger_ui(simple_api_spec_dir, spec):
|
||||
@@ -119,9 +119,7 @@ def test_swagger_ui_config_json(simple_api_spec_dir, spec):
|
||||
url = "/v1.0/ui/swagger-ui-config.json"
|
||||
swagger_ui_config_json = app_client.get(url)
|
||||
assert swagger_ui_config_json.status_code == 200
|
||||
assert swagger_ui_config == json.loads(
|
||||
swagger_ui_config_json.get_data(as_text=True)
|
||||
)
|
||||
assert swagger_ui_config == swagger_ui_config_json.json()
|
||||
|
||||
|
||||
def test_no_swagger_ui_config_json(simple_api_spec_dir, spec):
|
||||
@@ -241,13 +239,13 @@ def test_single_route():
|
||||
app.add_url_rule("/single1", "single1", route1, methods=["GET"])
|
||||
|
||||
get_single1 = app_client.get("/single1")
|
||||
assert get_single1.data == b"single 1"
|
||||
assert get_single1.text == "single 1"
|
||||
|
||||
post_single1 = app_client.post("/single1")
|
||||
assert post_single1.status_code == 405
|
||||
|
||||
post_single2 = app_client.post("/single2")
|
||||
assert post_single2.data == b"single 2"
|
||||
assert post_single2.text == "single 2"
|
||||
|
||||
get_single2 = app_client.get("/single2")
|
||||
assert get_single2.status_code == 405
|
||||
|
||||
@@ -13,7 +13,7 @@ def test_errors(problem_app):
|
||||
greeting404 = app_client.get("/v1.0/greeting")
|
||||
assert greeting404.headers.get("content-type") == "application/problem+json"
|
||||
assert greeting404.status_code == 404
|
||||
error404 = flask.json.loads(fix_data(greeting404.data))
|
||||
error404 = greeting404.json()
|
||||
assert error404["type"] == "about:blank"
|
||||
assert error404["title"] == "Not Found"
|
||||
assert (
|
||||
@@ -26,7 +26,7 @@ def test_errors(problem_app):
|
||||
get_greeting = app_client.get("/v1.0/greeting/jsantos")
|
||||
assert get_greeting.headers.get("content-type") == "application/problem+json"
|
||||
assert get_greeting.status_code == 405
|
||||
error405 = json.loads(get_greeting.text)
|
||||
error405 = get_greeting.json()
|
||||
assert error405["type"] == "about:blank"
|
||||
assert error405["title"] == "Method Not Allowed"
|
||||
assert error405["status"] == 405
|
||||
@@ -35,7 +35,7 @@ def test_errors(problem_app):
|
||||
get500 = app_client.get("/v1.0/except")
|
||||
assert get500.headers.get("content-type") == "application/problem+json"
|
||||
assert get500.status_code == 500
|
||||
error500 = json.loads(get500.text)
|
||||
error500 = get500.json()
|
||||
assert error500["type"] == "about:blank"
|
||||
assert error500["title"] == "Internal Server Error"
|
||||
assert (
|
||||
@@ -50,7 +50,7 @@ def test_errors(problem_app):
|
||||
assert get_problem.headers.get("content-type") == "application/problem+json"
|
||||
assert get_problem.status_code == 402
|
||||
assert get_problem.headers["x-Test-Header"] == "In Test"
|
||||
error_problem = json.loads(get_problem.text)
|
||||
error_problem = get_problem.json()
|
||||
assert error_problem["type"] == "http://www.example.com/error"
|
||||
assert error_problem["title"] == "Some Error"
|
||||
assert error_problem["detail"] == "Something went wrong somewhere"
|
||||
@@ -60,7 +60,7 @@ def test_errors(problem_app):
|
||||
get_problem2 = app_client.get("/v1.0/other_problem")
|
||||
assert get_problem2.headers.get("content-type") == "application/problem+json"
|
||||
assert get_problem2.status_code == 402
|
||||
error_problem2 = json.loads(get_problem2.text)
|
||||
error_problem2 = get_problem2.json()
|
||||
assert error_problem2["type"] == "about:blank"
|
||||
assert error_problem2["title"] == "Some Error"
|
||||
assert error_problem2["detail"] == "Something went wrong somewhere"
|
||||
@@ -74,21 +74,23 @@ def test_errors(problem_app):
|
||||
|
||||
custom_problem = app_client.get("/v1.0/customized_problem_response")
|
||||
assert custom_problem.status_code == 403
|
||||
problem_body = json.loads(custom_problem.text)
|
||||
problem_body = custom_problem.json()
|
||||
assert "amount" in problem_body
|
||||
assert problem_body["amount"] == 23.0
|
||||
|
||||
problem_as_exception = app_client.get("/v1.0/problem_exception_with_extra_args")
|
||||
assert problem_as_exception.status_code == 400
|
||||
problem_as_exception_body = json.loads(problem_as_exception.text)
|
||||
problem_as_exception_body = problem_as_exception.json()
|
||||
assert "age" in problem_as_exception_body
|
||||
assert problem_as_exception_body["age"] == 30
|
||||
|
||||
unsupported_media_type = app_client.post(
|
||||
"/v1.0/post_wrong_content_type", data="<html></html>", content_type="text/html"
|
||||
"/v1.0/post_wrong_content_type",
|
||||
data="<html></html>",
|
||||
headers={"content-type": "text/html"},
|
||||
)
|
||||
assert unsupported_media_type.status_code == 415
|
||||
unsupported_media_type_body = json.loads(unsupported_media_type.text)
|
||||
unsupported_media_type_body = unsupported_media_type.json()
|
||||
assert unsupported_media_type_body["type"] == "about:blank"
|
||||
assert unsupported_media_type_body["title"] == "Unsupported Media Type"
|
||||
assert unsupported_media_type_body["detail"].startswith(
|
||||
|
||||
@@ -27,7 +27,7 @@ def test_header_not_returned(simple_openapi_app):
|
||||
response.status_code == 500
|
||||
) # view_func has not returned what was promised in spec
|
||||
assert response.headers.get("content-type") == "application/problem+json"
|
||||
data = json.loads(response.text)
|
||||
data = response.json()
|
||||
assert data["type"] == "about:blank"
|
||||
assert data["title"] == "Response headers do not conform to specification"
|
||||
assert (
|
||||
|
||||
@@ -44,35 +44,31 @@ def test_array_query_param(simple_app):
|
||||
headers = {"Content-type": "application/json"}
|
||||
url = "/v1.0/test_array_csv_query_param"
|
||||
response = app_client.get(url, headers=headers)
|
||||
array_response: List[str] = json.loads(response.text)
|
||||
array_response: List[str] = response.json()
|
||||
assert array_response == ["squash", "banana"]
|
||||
url = "/v1.0/test_array_csv_query_param?items=one,two,three"
|
||||
response = app_client.get(url, headers=headers)
|
||||
array_response: List[str] = json.loads(response.text)
|
||||
array_response: List[str] = response.json()
|
||||
assert array_response == ["one", "two", "three"]
|
||||
url = "/v1.0/test_array_pipes_query_param?items=1|2|3"
|
||||
response = app_client.get(url, headers=headers)
|
||||
array_response: List[int] = json.loads(response.text)
|
||||
array_response: List[int] = response.json()
|
||||
assert array_response == [1, 2, 3]
|
||||
url = "/v1.0/test_array_unsupported_query_param?items=1;2;3"
|
||||
response = app_client.get(url, headers=headers)
|
||||
array_response: List[str] = json.loads(
|
||||
response.text
|
||||
) # unsupported collectionFormat
|
||||
array_response: List[str] = response.json() # unsupported collectionFormat
|
||||
assert array_response == ["1;2;3"]
|
||||
url = "/v1.0/test_array_csv_query_param?items=A&items=B&items=C&items=D,E,F"
|
||||
response = app_client.get(url, headers=headers)
|
||||
array_response: List[str] = json.loads(response.text) # multi array with csv format
|
||||
array_response: List[str] = response.json() # multi array with csv format
|
||||
assert array_response == ["D", "E", "F"]
|
||||
url = "/v1.0/test_array_multi_query_param?items=A&items=B&items=C&items=D,E,F"
|
||||
response = app_client.get(url, headers=headers)
|
||||
array_response: List[str] = json.loads(response.text) # multi array with csv format
|
||||
array_response: List[str] = response.json() # multi array with csv format
|
||||
assert array_response == ["A", "B", "C", "D", "E", "F"]
|
||||
url = "/v1.0/test_array_pipes_query_param?items=4&items=5&items=6&items=7|8|9"
|
||||
response = app_client.get(url, headers=headers)
|
||||
array_response: List[int] = json.loads(
|
||||
response.text
|
||||
) # multi array with pipes format
|
||||
array_response: List[int] = response.json() # multi array with pipes format
|
||||
assert array_response == [7, 8, 9]
|
||||
|
||||
|
||||
@@ -81,27 +77,25 @@ def test_array_form_param(simple_app):
|
||||
headers = {"Content-type": "application/x-www-form-urlencoded"}
|
||||
url = "/v1.0/test_array_csv_form_param"
|
||||
response = app_client.post(url, headers=headers)
|
||||
array_response: List[str] = json.loads(response.text)
|
||||
array_response: List[str] = response.json()
|
||||
assert array_response == ["squash", "banana"]
|
||||
url = "/v1.0/test_array_csv_form_param"
|
||||
response = app_client.post(url, headers=headers, data={"items": "one,two,three"})
|
||||
array_response: List[str] = json.loads(response.text)
|
||||
array_response: List[str] = response.json()
|
||||
assert array_response == ["one", "two", "three"]
|
||||
url = "/v1.0/test_array_pipes_form_param"
|
||||
response = app_client.post(url, headers=headers, data={"items": "1|2|3"})
|
||||
array_response: List[int] = json.loads(response.text)
|
||||
array_response: List[int] = response.json()
|
||||
assert array_response == [1, 2, 3]
|
||||
url = "/v1.0/test_array_csv_form_param"
|
||||
data = "items=A&items=B&items=C&items=D,E,F"
|
||||
response = app_client.post(url, headers=headers, data=data)
|
||||
array_response: List[str] = json.loads(response.text) # multi array with csv format
|
||||
array_response: List[str] = response.json() # multi array with csv format
|
||||
assert array_response == ["D", "E", "F"]
|
||||
url = "/v1.0/test_array_pipes_form_param"
|
||||
data = "items=4&items=5&items=6&items=7|8|9"
|
||||
response = app_client.post(url, headers=headers, data=data)
|
||||
array_response: List[int] = json.loads(
|
||||
response.text
|
||||
) # multi array with pipes format
|
||||
array_response: List[int] = response.json() # multi array with pipes format
|
||||
assert array_response == [7, 8, 9]
|
||||
|
||||
|
||||
@@ -119,7 +113,7 @@ def test_strict_extra_query_param(strict_app):
|
||||
url = "/v1.0/test_parameter_validation?extra_parameter=true"
|
||||
resp = app_client.get(url, headers=headers)
|
||||
assert resp.status_code == 400
|
||||
response = json.loads(resp.text)
|
||||
response = resp.json()
|
||||
assert response["detail"] == "Extra query parameter(s) extra_parameter not in spec"
|
||||
|
||||
|
||||
@@ -128,7 +122,7 @@ def test_strict_formdata_param(strict_app):
|
||||
headers = {"Content-type": "application/x-www-form-urlencoded"}
|
||||
url = "/v1.0/test_array_csv_form_param"
|
||||
resp = app_client.post(url, headers=headers, data={"items": "mango"})
|
||||
response = json.loads(resp.text)
|
||||
response = resp.json()
|
||||
assert response == ["mango"]
|
||||
assert resp.status_code == 200
|
||||
|
||||
@@ -198,7 +192,7 @@ def test_default_param(strict_app):
|
||||
app_client = strict_app.test_client()
|
||||
resp = app_client.get("/v1.0/test-default-query-parameter")
|
||||
assert resp.status_code == 200
|
||||
response = json.loads(resp.text)
|
||||
response = resp.json()
|
||||
assert response["app_name"] == "connexion"
|
||||
|
||||
|
||||
@@ -206,12 +200,12 @@ def test_falsy_param(simple_app):
|
||||
app_client = simple_app.test_client()
|
||||
resp = app_client.get("/v1.0/test-falsy-param", params={"falsy": 0})
|
||||
assert resp.status_code == 200
|
||||
response = json.loads(resp.text)
|
||||
response = resp.json()
|
||||
assert response == 0
|
||||
|
||||
resp = app_client.get("/v1.0/test-falsy-param")
|
||||
assert resp.status_code == 200
|
||||
response = json.loads(resp.text)
|
||||
response = resp.json()
|
||||
assert response == 1
|
||||
|
||||
|
||||
@@ -219,7 +213,7 @@ def test_formdata_param(simple_app):
|
||||
app_client = simple_app.test_client()
|
||||
resp = app_client.post("/v1.0/test-formData-param", data={"formData": "test"})
|
||||
assert resp.status_code == 200
|
||||
response = json.loads(resp.text)
|
||||
response = resp.json()
|
||||
assert response == "test"
|
||||
|
||||
|
||||
@@ -227,7 +221,7 @@ def test_formdata_bad_request(simple_app):
|
||||
app_client = simple_app.test_client()
|
||||
resp = app_client.post("/v1.0/test-formData-param")
|
||||
assert resp.status_code == 400
|
||||
response = json.loads(resp.text)
|
||||
response = resp.json()
|
||||
assert response["detail"] in [
|
||||
"Missing formdata parameter 'formData'",
|
||||
"'formData' is a required property", # OAS3
|
||||
@@ -256,9 +250,9 @@ def test_strict_formdata_extra_param(strict_app):
|
||||
"/v1.0/test-formData-param", data={"formData": "test", "extra_formData": "test"}
|
||||
)
|
||||
assert resp.status_code == 400
|
||||
response = json.loads(resp.text)
|
||||
assert (
|
||||
response["detail"] == "Extra formData parameter(s) extra_formData not in spec"
|
||||
resp.json()["detail"]
|
||||
== "Extra formData parameter(s) extra_formData not in spec"
|
||||
)
|
||||
|
||||
|
||||
@@ -266,20 +260,17 @@ def test_formdata_file_upload(simple_app):
|
||||
app_client = simple_app.test_client()
|
||||
resp = app_client.post(
|
||||
"/v1.0/test-formData-file-upload",
|
||||
data={"fileData": (BytesIO(b"file contents"), "filename.txt")},
|
||||
headers={"content-type": "multipart/form-data"},
|
||||
files={"fileData": ("filename.txt", BytesIO(b"file contents"))},
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
response = json.loads(resp.text)
|
||||
assert response == {"filename.txt": "file contents"}
|
||||
assert resp.json() == {"filename.txt": "file contents"}
|
||||
|
||||
|
||||
def test_formdata_file_upload_bad_request(simple_app):
|
||||
app_client = simple_app.test_client()
|
||||
resp = app_client.post("/v1.0/test-formData-file-upload")
|
||||
assert resp.status_code == 400
|
||||
response = json.loads(resp.text)
|
||||
assert response["detail"] in [
|
||||
assert resp.json()["detail"] in [
|
||||
"Missing formdata parameter 'fileData'",
|
||||
"'fileData' is a required property", # OAS3
|
||||
]
|
||||
@@ -289,8 +280,7 @@ def test_formdata_file_upload_missing_param(simple_app):
|
||||
app_client = simple_app.test_client()
|
||||
resp = app_client.post(
|
||||
"/v1.0/test-formData-file-upload-missing-param",
|
||||
data={"missing_fileData": (BytesIO(b"file contents"), "example.txt")},
|
||||
headers={"content-type": "multipart/form-data"},
|
||||
files={"missing_fileData": ("example.txt", BytesIO(b"file contents"))},
|
||||
)
|
||||
assert resp.status_code == 200, resp.text
|
||||
|
||||
@@ -305,7 +295,7 @@ def test_body_not_allowed_additional_properties(simple_app):
|
||||
)
|
||||
assert resp.status_code == 400
|
||||
|
||||
response = json.loads(resp.text)
|
||||
response = resp.json()
|
||||
assert "Additional properties are not allowed" in response["detail"]
|
||||
|
||||
|
||||
@@ -316,7 +306,7 @@ def test_bool_as_default_param(simple_app):
|
||||
|
||||
resp = app_client.get("/v1.0/test-bool-param", params={"thruthiness": True})
|
||||
assert resp.status_code == 200
|
||||
response = json.loads(resp.text)
|
||||
response = resp.json()
|
||||
assert response is True
|
||||
|
||||
|
||||
@@ -324,12 +314,12 @@ def test_bool_param(simple_app):
|
||||
app_client = simple_app.test_client()
|
||||
resp = app_client.get("/v1.0/test-bool-param", params={"thruthiness": True})
|
||||
assert resp.status_code == 200
|
||||
response = json.loads(resp.text)
|
||||
response = resp.json()
|
||||
assert response is True
|
||||
|
||||
resp = app_client.get("/v1.0/test-bool-param", params={"thruthiness": False})
|
||||
assert resp.status_code == 200
|
||||
response = json.loads(resp.text)
|
||||
response = resp.json()
|
||||
assert response is False
|
||||
|
||||
|
||||
@@ -337,13 +327,13 @@ def test_bool_array_param(simple_app):
|
||||
app_client = simple_app.test_client()
|
||||
resp = app_client.get("/v1.0/test-bool-array-param?thruthiness=true,true,true")
|
||||
assert resp.status_code == 200, resp.text
|
||||
response = json.loads(resp.text)
|
||||
response = resp.json()
|
||||
assert response is True
|
||||
|
||||
app_client = simple_app.test_client()
|
||||
resp = app_client.get("/v1.0/test-bool-array-param?thruthiness=true,true,false")
|
||||
assert resp.status_code == 200, resp.text
|
||||
response = json.loads(resp.text)
|
||||
response = resp.json()
|
||||
assert response is False
|
||||
|
||||
app_client = simple_app.test_client()
|
||||
@@ -368,7 +358,7 @@ def test_parameters_defined_in_path_level(simple_app):
|
||||
app_client = simple_app.test_client()
|
||||
resp = app_client.get("/v1.0/parameters-in-root-path?title=nice-get")
|
||||
assert resp.status_code == 200
|
||||
assert json.loads(resp.text) == ["nice-get"]
|
||||
assert resp.json() == ["nice-get"]
|
||||
|
||||
resp = app_client.get("/v1.0/parameters-in-root-path")
|
||||
assert resp.status_code == 400
|
||||
@@ -377,10 +367,10 @@ def test_parameters_defined_in_path_level(simple_app):
|
||||
def test_array_in_path(simple_app):
|
||||
app_client = simple_app.test_client()
|
||||
resp = app_client.get("/v1.0/test-array-in-path/one_item")
|
||||
assert json.loads(resp.text) == ["one_item"]
|
||||
assert resp.json() == ["one_item"]
|
||||
|
||||
resp = app_client.get("/v1.0/test-array-in-path/one_item,another_item")
|
||||
assert json.loads(resp.text) == [
|
||||
assert resp.json() == [
|
||||
"one_item",
|
||||
"another_item",
|
||||
]
|
||||
@@ -389,43 +379,43 @@ def test_array_in_path(simple_app):
|
||||
def test_nullable_parameter(simple_app):
|
||||
app_client = simple_app.test_client()
|
||||
resp = app_client.get("/v1.0/nullable-parameters?time_start=null")
|
||||
assert json.loads(resp.text) == "it was None"
|
||||
assert resp.json() == "it was None"
|
||||
|
||||
resp = app_client.get("/v1.0/nullable-parameters?time_start=None")
|
||||
assert json.loads(resp.text) == "it was None"
|
||||
assert resp.json() == "it was None"
|
||||
|
||||
time_start = 1010
|
||||
resp = app_client.get(f"/v1.0/nullable-parameters?time_start={time_start}")
|
||||
assert json.loads(resp.text) == time_start
|
||||
assert resp.json() == time_start
|
||||
|
||||
resp = app_client.post("/v1.0/nullable-parameters", data={"post_param": "None"})
|
||||
assert json.loads(resp.text) == "it was None"
|
||||
assert resp.json() == "it was None"
|
||||
|
||||
resp = app_client.post("/v1.0/nullable-parameters", data={"post_param": "null"})
|
||||
assert json.loads(resp.text) == "it was None"
|
||||
assert resp.json() == "it was None"
|
||||
|
||||
headers = {"Content-Type": "application/json"}
|
||||
resp = app_client.put("/v1.0/nullable-parameters", data="null", headers=headers)
|
||||
assert json.loads(resp.text) == "it was None"
|
||||
assert resp.json() == "it was None"
|
||||
|
||||
resp = app_client.put("/v1.0/nullable-parameters", data="None", headers=headers)
|
||||
assert json.loads(resp.text) == "it was None"
|
||||
assert resp.json() == "it was None"
|
||||
|
||||
resp = app_client.put(
|
||||
"/v1.0/nullable-parameters-noargs", data="None", headers=headers
|
||||
)
|
||||
assert json.loads(resp.text) == "hello"
|
||||
assert resp.json() == "hello"
|
||||
|
||||
|
||||
def test_args_kwargs(simple_app):
|
||||
app_client = simple_app.test_client()
|
||||
resp = app_client.get("/v1.0/query-params-as-kwargs")
|
||||
assert resp.status_code == 200
|
||||
assert json.loads(resp.text) == {}
|
||||
assert resp.json() == {}
|
||||
|
||||
resp = app_client.get("/v1.0/query-params-as-kwargs?foo=a&bar=b")
|
||||
assert resp.status_code == 200
|
||||
assert json.loads(resp.text) == {"foo": "a"}
|
||||
assert resp.json() == {"foo": "a"}
|
||||
|
||||
if simple_app._spec_file == "openapi.yaml":
|
||||
body = {"foo": "a", "bar": "b"}
|
||||
@@ -436,7 +426,7 @@ def test_args_kwargs(simple_app):
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
# having only kwargs, the handler would have been passed 'body'
|
||||
assert json.loads(resp.text) == {
|
||||
assert resp.json() == {
|
||||
"body": {"foo": "a", "bar": "b"},
|
||||
}
|
||||
|
||||
@@ -445,13 +435,13 @@ def test_param_sanitization(simple_app):
|
||||
app_client = simple_app.test_client()
|
||||
resp = app_client.post("/v1.0/param-sanitization")
|
||||
assert resp.status_code == 200
|
||||
assert json.loads(resp.text) == {}
|
||||
assert resp.json() == {}
|
||||
|
||||
resp = app_client.post(
|
||||
"/v1.0/param-sanitization?$query=queryString", data={"$form": "formString"}
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert json.loads(resp.text) == {
|
||||
assert resp.json() == {
|
||||
"query": "queryString",
|
||||
"form": "formString",
|
||||
}
|
||||
@@ -463,7 +453,7 @@ def test_param_sanitization(simple_app):
|
||||
headers={"Content-Type": "application/json"},
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert json.loads(resp.text) == body
|
||||
assert resp.json() == body
|
||||
|
||||
body = {"body1": "bodyString", "body2": 12, "body3": {"a": "otherString"}}
|
||||
resp = app_client.post(
|
||||
@@ -472,7 +462,7 @@ def test_param_sanitization(simple_app):
|
||||
headers={"Content-Type": "application/json"},
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert json.loads(resp.text) == body
|
||||
assert resp.json() == body
|
||||
|
||||
body = {
|
||||
"body1": "bodyString",
|
||||
@@ -485,7 +475,7 @@ def test_param_sanitization(simple_app):
|
||||
headers={"Content-Type": "application/json"},
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert json.loads(resp.text) == body
|
||||
assert resp.json() == body
|
||||
|
||||
|
||||
def test_no_sanitization_in_request_body(simple_app):
|
||||
@@ -502,7 +492,7 @@ def test_no_sanitization_in_request_body(simple_app):
|
||||
response = app_client.post("/v1.0/forward", json=data)
|
||||
|
||||
assert response.status_code == 200
|
||||
assert json.loads(response.text) == data
|
||||
assert response.json() == data
|
||||
|
||||
|
||||
def test_parameters_snake_case(snake_case_app):
|
||||
@@ -546,22 +536,22 @@ def test_parameters_snake_case(snake_case_app):
|
||||
"/v1.0/test-get-camel-case-version?truthiness=true&orderBy=asc"
|
||||
)
|
||||
assert resp.status_code == 200, resp.text
|
||||
assert json.loads(resp.text) == {"truthiness": True, "order_by": "asc"}
|
||||
assert resp.json() == {"truthiness": True, "order_by": "asc"}
|
||||
resp = app_client.get("/v1.0/test-get-camel-case-version?truthiness=5")
|
||||
assert resp.status_code == 400
|
||||
assert json.loads(resp.text)["detail"].startswith("'5' is not of type 'boolean'")
|
||||
assert resp.json()["detail"].startswith("'5' is not of type 'boolean'")
|
||||
# Incorrectly cased params should be ignored
|
||||
resp = app_client.get(
|
||||
"/v1.0/test-get-camel-case-version?Truthiness=true&order_by=asc"
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert json.loads(resp.text) == {
|
||||
assert resp.json() == {
|
||||
"truthiness": False,
|
||||
"order_by": None,
|
||||
} # default values
|
||||
resp = app_client.get("/v1.0/test-get-camel-case-version?Truthiness=5&order_by=4")
|
||||
assert resp.status_code == 200
|
||||
assert json.loads(resp.text) == {
|
||||
assert resp.json() == {
|
||||
"truthiness": False,
|
||||
"order_by": None,
|
||||
} # default values
|
||||
@@ -573,15 +563,11 @@ def test_get_unicode_request(simple_app):
|
||||
app_client = simple_app.test_client()
|
||||
resp = app_client.get("/v1.0/get_unicode_request?price=%C2%A319.99") # £19.99
|
||||
assert resp.status_code == 200
|
||||
assert json.loads(resp.text)["price"] == "£19.99"
|
||||
assert resp.json()["price"] == "£19.99"
|
||||
|
||||
|
||||
def test_cookie_param(simple_app):
|
||||
try:
|
||||
app_client = simple_app.test_client(cookies={"test_cookie": "hello"})
|
||||
except TypeError:
|
||||
app_client = simple_app.test_client()
|
||||
app_client.set_cookie("localhost", "test_cookie", "hello")
|
||||
app_client = simple_app.test_client(cookies={"test_cookie": "hello"})
|
||||
response = app_client.get("/v1.0/test-cookie-param")
|
||||
assert response.status_code == 200
|
||||
assert response.json == {"cookie_value": "hello"}
|
||||
assert response.json() == {"cookie_value": "hello"}
|
||||
|
||||
@@ -22,7 +22,7 @@ def test_app(simple_app):
|
||||
)
|
||||
assert post_greeting_url.status_code == 200
|
||||
assert post_greeting_url.headers.get("content-type") == "application/json"
|
||||
greeting_response_url = json.loads(post_greeting_url.text)
|
||||
greeting_response_url = post_greeting_url.json()
|
||||
assert (
|
||||
greeting_response_url["greeting"]
|
||||
== "Hello jsantos thanks for the/third/of/his/name"
|
||||
@@ -31,7 +31,7 @@ def test_app(simple_app):
|
||||
post_greeting = app_client.post("/v1.0/greeting/jsantos", data={})
|
||||
assert post_greeting.status_code == 200
|
||||
assert post_greeting.headers.get("content-type") == "application/json"
|
||||
greeting_response = json.loads(post_greeting.text)
|
||||
greeting_response = post_greeting.json()
|
||||
assert greeting_response["greeting"] == "Hello jsantos"
|
||||
|
||||
get_bye = app_client.get("/v1.0/bye/jsantos")
|
||||
@@ -41,7 +41,7 @@ def test_app(simple_app):
|
||||
post_greeting = app_client.post("/v1.0/greeting/jsantos", data={})
|
||||
assert post_greeting.status_code == 200
|
||||
assert post_greeting.headers.get("content-type") == "application/json"
|
||||
greeting_response = json.loads(post_greeting.text)
|
||||
greeting_response = post_greeting.json()
|
||||
assert greeting_response["greeting"] == "Hello jsantos"
|
||||
|
||||
|
||||
@@ -88,31 +88,31 @@ def test_returning_flask_response_tuple(simple_app):
|
||||
result = app_client.get("/v1.0/flask_response_tuple")
|
||||
assert result.status_code == 201, result.text
|
||||
assert result.headers.get("content-type") == "application/json"
|
||||
result_data = json.loads(result.text)
|
||||
result_data = result.json()
|
||||
assert result_data == {"foo": "bar"}
|
||||
|
||||
|
||||
def test_jsonifier(simple_app):
|
||||
app_client = simple_app.test_client()
|
||||
|
||||
post_greeting = app_client.post("/v1.0/greeting/jsantos", data={})
|
||||
post_greeting = app_client.post("/v1.0/greeting/jsantos")
|
||||
assert post_greeting.status_code == 200
|
||||
assert post_greeting.headers.get("content-type") == "application/json"
|
||||
greeting_reponse = json.loads(post_greeting.text)
|
||||
greeting_reponse = post_greeting.json()
|
||||
assert greeting_reponse["greeting"] == "Hello jsantos"
|
||||
|
||||
get_list_greeting = app_client.get("/v1.0/list/jsantos", data={})
|
||||
get_list_greeting = app_client.get("/v1.0/list/jsantos")
|
||||
assert get_list_greeting.status_code == 200
|
||||
assert get_list_greeting.headers.get("content-type") == "application/json"
|
||||
greeting_reponse = json.loads(get_list_greeting.text)
|
||||
greeting_reponse = get_list_greeting.json()
|
||||
assert len(greeting_reponse) == 2
|
||||
assert greeting_reponse[0] == "hello"
|
||||
assert greeting_reponse[1] == "jsantos"
|
||||
|
||||
get_greetings = app_client.get("/v1.0/greetings/jsantos", data={})
|
||||
get_greetings = app_client.get("/v1.0/greetings/jsantos")
|
||||
assert get_greetings.status_code == 200
|
||||
assert get_greetings.headers.get("content-type") == "application/x.connexion+json"
|
||||
greetings_reponse = json.loads(get_greetings.text)
|
||||
greetings_reponse = get_greetings.json()
|
||||
assert len(greetings_reponse) == 1
|
||||
assert greetings_reponse["greetings"] == "Hello jsantos"
|
||||
|
||||
@@ -128,9 +128,9 @@ def test_not_content_response(simple_app):
|
||||
def test_pass_through(simple_app):
|
||||
app_client = simple_app.test_client()
|
||||
|
||||
response = app_client.get("/v1.0/multimime", data={})
|
||||
response = app_client.get("/v1.0/multimime")
|
||||
assert response.status_code == 500
|
||||
detail = json.loads(response.text)["detail"]
|
||||
detail = response.json()["detail"]
|
||||
assert (
|
||||
detail == "Multiple response content types are defined in the "
|
||||
"operation spec, but the handler response did not specify "
|
||||
@@ -151,7 +151,7 @@ def test_exploded_deep_object_param_endpoint_openapi_simple(simple_openapi_app):
|
||||
|
||||
response = app_client.get("/v1.0/exploded-deep-object-param?id[foo]=bar")
|
||||
assert response.status_code == 200
|
||||
response_data = json.loads(response.text)
|
||||
response_data = response.json()
|
||||
assert response_data == {"foo": "bar", "foo4": "blubb"}
|
||||
|
||||
|
||||
@@ -164,7 +164,7 @@ def test_exploded_deep_object_param_endpoint_openapi_multiple_data_types(
|
||||
"/v1.0/exploded-deep-object-param?id[foo]=bar&id[fooint]=2&id[fooboo]=false"
|
||||
)
|
||||
assert response.status_code == 200, response.text
|
||||
response_data = json.loads(response.text)
|
||||
response_data = response.json()
|
||||
assert response_data == {
|
||||
"foo": "bar",
|
||||
"fooint": 2,
|
||||
@@ -182,7 +182,7 @@ def test_exploded_deep_object_param_endpoint_openapi_additional_properties(
|
||||
"/v1.0/exploded-deep-object-param-additional-properties?id[foo]=bar&id[fooint]=2"
|
||||
)
|
||||
assert response.status_code == 200
|
||||
response_data = json.loads(response.text)
|
||||
response_data = response.json()
|
||||
assert response_data == {"foo": "bar", "fooint": "2"}
|
||||
|
||||
|
||||
@@ -204,7 +204,7 @@ def test_exploded_deep_object_param_endpoint_openapi_with_dots(simple_openapi_ap
|
||||
"/v1.0/exploded-deep-object-param-additional-properties?id[foo]=bar&id[foo.foo]=barbar"
|
||||
)
|
||||
assert response.status_code == 200
|
||||
response_data = json.loads(response.text)
|
||||
response_data = response.json()
|
||||
assert response_data == {"foo": "bar", "foo.foo": "barbar"}
|
||||
|
||||
|
||||
@@ -215,7 +215,7 @@ def test_nested_exploded_deep_object_param_endpoint_openapi(simple_openapi_app):
|
||||
"/v1.0/nested-exploded-deep-object-param?id[foo][foo2]=bar&id[foofoo]=barbar"
|
||||
)
|
||||
assert response.status_code == 200
|
||||
response_data = json.loads(response.text)
|
||||
response_data = response.json()
|
||||
assert response_data == {
|
||||
"foo": {"foo2": "bar", "foo3": "blubb"},
|
||||
"foofoo": "barbar",
|
||||
@@ -224,13 +224,15 @@ def test_nested_exploded_deep_object_param_endpoint_openapi(simple_openapi_app):
|
||||
|
||||
def test_redirect_endpoint(simple_app):
|
||||
app_client = simple_app.test_client()
|
||||
resp = app_client.get("/v1.0/test-redirect-endpoint")
|
||||
resp = app_client.get("/v1.0/test-redirect-endpoint", follow_redirects=False)
|
||||
assert resp.status_code == 302
|
||||
|
||||
|
||||
def test_redirect_response_endpoint(simple_app):
|
||||
app_client = simple_app.test_client()
|
||||
resp = app_client.get("/v1.0/test-redirect-response-endpoint")
|
||||
resp = app_client.get(
|
||||
"/v1.0/test-redirect-response-endpoint", follow_redirects=False
|
||||
)
|
||||
assert resp.status_code == 302
|
||||
|
||||
|
||||
@@ -238,12 +240,12 @@ def test_default_object_body(simple_app):
|
||||
app_client = simple_app.test_client()
|
||||
resp = app_client.post("/v1.0/test-default-object-body")
|
||||
assert resp.status_code == 200
|
||||
response = json.loads(resp.text)
|
||||
response = resp.json()
|
||||
assert response["stack"] == {"image_version": "default_image"}
|
||||
|
||||
resp = app_client.post("/v1.0/test-default-integer-body")
|
||||
assert resp.status_code == 200
|
||||
response = json.loads(resp.text)
|
||||
response = resp.json()
|
||||
assert response == 1
|
||||
|
||||
|
||||
@@ -255,7 +257,7 @@ def test_empty_object_body(simple_app):
|
||||
headers={"Content-Type": "application/json"},
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
response = json.loads(resp.text)
|
||||
response = resp.json()
|
||||
assert response["stack"] == {}
|
||||
|
||||
|
||||
@@ -267,7 +269,7 @@ def test_nested_additional_properties(simple_openapi_app):
|
||||
headers={"Content-Type": "application/json"},
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
response = json.loads(resp.text)
|
||||
response = resp.json()
|
||||
assert response == {"nested": {"object": True}}
|
||||
|
||||
|
||||
@@ -281,11 +283,11 @@ def test_custom_provider(simple_app):
|
||||
|
||||
flask_app = simple_app.app
|
||||
flask_app.json = CustomProvider(flask_app)
|
||||
app_client = flask_app.test_client()
|
||||
app_client = simple_app.test_client()
|
||||
|
||||
resp = app_client.get("/v1.0/custom-json-response")
|
||||
assert resp.status_code == 200
|
||||
response = json.loads(resp.text)
|
||||
response = resp.json()
|
||||
assert response["theResult"] == "cool result"
|
||||
|
||||
|
||||
@@ -385,7 +387,7 @@ def test_get_unicode_response(simple_app):
|
||||
app_client = simple_app.test_client()
|
||||
resp = app_client.get("/v1.0/get_unicode_response")
|
||||
actualJson = {"currency": "\xa3", "key": "leena"}
|
||||
assert json.loads(resp.text) == actualJson
|
||||
assert resp.json() == actualJson
|
||||
|
||||
|
||||
def test_get_enum_response(simple_app):
|
||||
@@ -428,7 +430,7 @@ def test_oneof(simple_openapi_app):
|
||||
)
|
||||
assert post_greeting.status_code == 200
|
||||
assert post_greeting.headers.get("content-type") == "application/json"
|
||||
greeting_reponse = json.loads(post_greeting.text)
|
||||
greeting_reponse = post_greeting.json()
|
||||
assert greeting_reponse["greeting"] == "Hello 3"
|
||||
|
||||
post_greeting = app_client.post(
|
||||
@@ -438,7 +440,7 @@ def test_oneof(simple_openapi_app):
|
||||
)
|
||||
assert post_greeting.status_code == 200
|
||||
assert post_greeting.headers.get("content-type") == "application/json"
|
||||
greeting_reponse = json.loads(post_greeting.text)
|
||||
greeting_reponse = post_greeting.json()
|
||||
assert greeting_reponse["greeting"] == "Hello True"
|
||||
|
||||
post_greeting = app_client.post(
|
||||
|
||||
@@ -10,7 +10,7 @@ def test_schema(schema_app):
|
||||
)
|
||||
assert empty_request.status_code == 400
|
||||
assert empty_request.headers.get("content-type") == "application/problem+json"
|
||||
empty_request_response = json.loads(empty_request.text)
|
||||
empty_request_response = empty_request.json()
|
||||
assert empty_request_response["title"] == "Bad Request"
|
||||
assert empty_request_response["detail"].startswith(
|
||||
"'image_version' is a required property"
|
||||
@@ -21,7 +21,7 @@ def test_schema(schema_app):
|
||||
)
|
||||
assert bad_type.status_code == 400
|
||||
assert bad_type.headers.get("content-type") == "application/problem+json"
|
||||
bad_type_response = json.loads(bad_type.text)
|
||||
bad_type_response = bad_type.json()
|
||||
assert bad_type_response["title"] == "Bad Request"
|
||||
assert bad_type_response["detail"].startswith("22 is not of type 'string'")
|
||||
|
||||
@@ -30,7 +30,7 @@ def test_schema(schema_app):
|
||||
)
|
||||
assert bad_type_path.status_code == 400
|
||||
assert bad_type_path.headers.get("content-type") == "application/problem+json"
|
||||
bad_type_path_response = json.loads(bad_type.text)
|
||||
bad_type_path_response = bad_type_path.json()
|
||||
assert bad_type_path_response["title"] == "Bad Request"
|
||||
assert bad_type_path_response["detail"].endswith(" - 'image_version'")
|
||||
|
||||
@@ -40,7 +40,7 @@ def test_schema(schema_app):
|
||||
data=json.dumps({"image_version": "version"}),
|
||||
)
|
||||
assert good_request.status_code == 200
|
||||
good_request_response = json.loads(good_request.text)
|
||||
good_request_response = good_request.json()
|
||||
assert good_request_response["image_version"] == "version"
|
||||
|
||||
good_request_extra = app_client.post(
|
||||
@@ -49,7 +49,7 @@ def test_schema(schema_app):
|
||||
data=json.dumps({"image_version": "version", "extra": "stuff"}),
|
||||
)
|
||||
assert good_request_extra.status_code == 200
|
||||
good_request_extra_response = json.loads(good_request.text)
|
||||
good_request_extra_response = good_request.json()
|
||||
assert good_request_extra_response["image_version"] == "version"
|
||||
|
||||
wrong_type = app_client.post(
|
||||
@@ -57,7 +57,7 @@ def test_schema(schema_app):
|
||||
)
|
||||
assert wrong_type.status_code == 400
|
||||
assert wrong_type.headers.get("content-type") == "application/problem+json"
|
||||
wrong_type_response = json.loads(wrong_type.text)
|
||||
wrong_type_response = wrong_type.json()
|
||||
assert wrong_type_response["title"] == "Bad Request"
|
||||
assert wrong_type_response["detail"].startswith("42 is not of type 'object'")
|
||||
|
||||
@@ -66,59 +66,59 @@ def test_schema_response(schema_app):
|
||||
app_client = schema_app.test_client()
|
||||
|
||||
request = app_client.get(
|
||||
"/v1.0/test_schema/response/object/valid", headers={}, data=None
|
||||
"/v1.0/test_schema/response/object/valid",
|
||||
)
|
||||
assert request.status_code == 200, request.text
|
||||
request = app_client.get(
|
||||
"/v1.0/test_schema/response/object/invalid_type", headers={}, data=None
|
||||
"/v1.0/test_schema/response/object/invalid_type",
|
||||
)
|
||||
assert request.status_code == 500, request.text
|
||||
request = app_client.get(
|
||||
"/v1.0/test_schema/response/object/invalid_requirements", headers={}, data=None
|
||||
"/v1.0/test_schema/response/object/invalid_requirements",
|
||||
)
|
||||
assert request.status_code == 500, request.text
|
||||
request = app_client.get(
|
||||
"/v1.0/test_schema/response/string/valid", headers={}, data=None
|
||||
"/v1.0/test_schema/response/string/valid",
|
||||
)
|
||||
assert request.status_code == 200, request.text
|
||||
request = app_client.get(
|
||||
"/v1.0/test_schema/response/string/invalid", headers={}, data=None
|
||||
"/v1.0/test_schema/response/string/invalid",
|
||||
)
|
||||
assert request.status_code == 500, request.text
|
||||
request = app_client.get(
|
||||
"/v1.0/test_schema/response/integer/valid", headers={}, data=None
|
||||
"/v1.0/test_schema/response/integer/valid",
|
||||
)
|
||||
assert request.status_code == 200, request.text
|
||||
request = app_client.get(
|
||||
"/v1.0/test_schema/response/integer/invalid", headers={}, data=None
|
||||
"/v1.0/test_schema/response/integer/invalid",
|
||||
)
|
||||
assert request.status_code == 500, request.text
|
||||
request = app_client.get(
|
||||
"/v1.0/test_schema/response/number/valid", headers={}, data=None
|
||||
"/v1.0/test_schema/response/number/valid",
|
||||
)
|
||||
assert request.status_code == 200, request.text
|
||||
request = app_client.get(
|
||||
"/v1.0/test_schema/response/number/invalid", headers={}, data=None
|
||||
"/v1.0/test_schema/response/number/invalid",
|
||||
)
|
||||
assert request.status_code == 500, request.text
|
||||
request = app_client.get(
|
||||
"/v1.0/test_schema/response/boolean/valid", headers={}, data=None
|
||||
"/v1.0/test_schema/response/boolean/valid",
|
||||
)
|
||||
assert request.status_code == 200, request.text
|
||||
request = app_client.get(
|
||||
"/v1.0/test_schema/response/boolean/invalid", headers={}, data=None
|
||||
"/v1.0/test_schema/response/boolean/invalid",
|
||||
)
|
||||
assert request.status_code == 500, request.text
|
||||
request = app_client.get(
|
||||
"/v1.0/test_schema/response/array/valid", headers={}, data=None
|
||||
"/v1.0/test_schema/response/array/valid",
|
||||
)
|
||||
assert request.status_code == 200, request.text
|
||||
request = app_client.get(
|
||||
"/v1.0/test_schema/response/array/invalid_dict", headers={}, data=None
|
||||
"/v1.0/test_schema/response/array/invalid_dict",
|
||||
)
|
||||
assert request.status_code == 500, request.text
|
||||
request = app_client.get(
|
||||
"/v1.0/test_schema/response/array/invalid_string", headers={}, data=None
|
||||
"/v1.0/test_schema/response/array/invalid_string",
|
||||
)
|
||||
assert request.status_code == 500, request.text
|
||||
|
||||
@@ -133,7 +133,7 @@ def test_schema_in_query(schema_app):
|
||||
params={"image_version": "version", "not_required": "test"},
|
||||
)
|
||||
assert good_request.status_code == 200
|
||||
good_request_response = json.loads(good_request.text)
|
||||
good_request_response = good_request.json()
|
||||
assert good_request_response["image_version"] == "version"
|
||||
|
||||
|
||||
@@ -146,7 +146,7 @@ def test_schema_list(schema_app):
|
||||
)
|
||||
assert wrong_type.status_code == 400
|
||||
assert wrong_type.headers.get("content-type") == "application/problem+json"
|
||||
wrong_type_response = json.loads(wrong_type.text)
|
||||
wrong_type_response = wrong_type.json()
|
||||
assert wrong_type_response["title"] == "Bad Request"
|
||||
assert wrong_type_response["detail"].startswith("42 is not of type 'array'")
|
||||
|
||||
@@ -155,7 +155,7 @@ def test_schema_list(schema_app):
|
||||
)
|
||||
assert wrong_items.status_code == 400
|
||||
assert wrong_items.headers.get("content-type") == "application/problem+json"
|
||||
wrong_items_response = json.loads(wrong_items.text)
|
||||
wrong_items_response = wrong_items.json()
|
||||
assert wrong_items_response["title"] == "Bad Request"
|
||||
assert wrong_items_response["detail"].startswith("42 is not of type 'string'")
|
||||
|
||||
@@ -176,7 +176,7 @@ def test_schema_map(schema_app):
|
||||
)
|
||||
assert wrong_type.status_code == 400
|
||||
assert wrong_type.headers.get("content-type") == "application/problem+json"
|
||||
wrong_type_response = json.loads(wrong_type.text)
|
||||
wrong_type_response = wrong_type.json()
|
||||
assert wrong_type_response["title"] == "Bad Request"
|
||||
assert wrong_type_response["detail"].startswith("42 is not of type 'object'")
|
||||
|
||||
@@ -185,7 +185,7 @@ def test_schema_map(schema_app):
|
||||
)
|
||||
assert wrong_items.status_code == 400
|
||||
assert wrong_items.headers.get("content-type") == "application/problem+json"
|
||||
wrong_items_response = json.loads(wrong_items.text)
|
||||
wrong_items_response = wrong_items.json()
|
||||
assert wrong_items_response["title"] == "Bad Request"
|
||||
assert wrong_items_response["detail"].startswith("42 is not of type 'object'")
|
||||
|
||||
@@ -218,7 +218,7 @@ def test_schema_recursive(schema_app):
|
||||
)
|
||||
assert wrong_type.status_code == 400
|
||||
assert wrong_type.headers.get("content-type") == "application/problem+json"
|
||||
wrong_type_response = json.loads(wrong_type.text)
|
||||
wrong_type_response = wrong_type.json()
|
||||
assert wrong_type_response["title"] == "Bad Request"
|
||||
assert wrong_type_response["detail"].startswith("42 is not of type 'object'")
|
||||
|
||||
@@ -227,7 +227,7 @@ def test_schema_recursive(schema_app):
|
||||
)
|
||||
assert wrong_items.status_code == 400
|
||||
assert wrong_items.headers.get("content-type") == "application/problem+json"
|
||||
wrong_items_response = json.loads(wrong_items.text)
|
||||
wrong_items_response = wrong_items.json()
|
||||
assert wrong_items_response["title"] == "Bad Request"
|
||||
assert wrong_items_response["detail"].startswith("42 is not of type 'object'")
|
||||
|
||||
@@ -246,7 +246,7 @@ def test_schema_format(schema_app):
|
||||
)
|
||||
assert wrong_type.status_code == 400
|
||||
assert wrong_type.headers.get("content-type") == "application/problem+json"
|
||||
wrong_type_response = json.loads(wrong_type.text)
|
||||
wrong_type_response = wrong_type.json()
|
||||
assert wrong_type_response["title"] == "Bad Request"
|
||||
assert "'xy' is not a 'email'" in wrong_type_response["detail"]
|
||||
|
||||
@@ -260,7 +260,7 @@ def test_schema_array(schema_app):
|
||||
)
|
||||
assert array_request.status_code == 200
|
||||
assert array_request.headers.get("content-type") == "application/json"
|
||||
array_response = json.loads(array_request.text)
|
||||
array_response = array_request.json()
|
||||
assert array_response == ["list", "hello"]
|
||||
|
||||
|
||||
@@ -273,14 +273,14 @@ def test_schema_int(schema_app):
|
||||
)
|
||||
assert array_request.status_code == 200
|
||||
assert array_request.headers.get("content-type") == "application/json"
|
||||
array_response = json.loads(array_request.text) # type: list
|
||||
array_response = array_request.json() # type: list
|
||||
assert array_response == 42
|
||||
|
||||
|
||||
def test_global_response_definitions(schema_app):
|
||||
app_client = schema_app.test_client()
|
||||
resp = app_client.get("/v1.0/define_global_response")
|
||||
assert json.loads(resp.text) == ["general", "list"]
|
||||
assert resp.json() == ["general", "list"]
|
||||
|
||||
|
||||
def test_media_range(schema_app):
|
||||
|
||||
@@ -92,7 +92,7 @@ def test_security(oauth_requests, secure_endpoint_app):
|
||||
get_bye_no_auth = app_client.get("/v1.0/byesecure/jsantos")
|
||||
assert get_bye_no_auth.status_code == 401
|
||||
assert get_bye_no_auth.headers.get("content-type") == "application/problem+json"
|
||||
get_bye_no_auth_reponse = json.loads(get_bye_no_auth.text)
|
||||
get_bye_no_auth_reponse = get_bye_no_auth.json()
|
||||
assert get_bye_no_auth_reponse["detail"] == "No authorization token provided"
|
||||
|
||||
headers = {"Authorization": "Bearer 100"}
|
||||
@@ -104,7 +104,7 @@ def test_security(oauth_requests, secure_endpoint_app):
|
||||
get_bye_wrong_scope = app_client.get("/v1.0/byesecure/jsantos", headers=headers)
|
||||
assert get_bye_wrong_scope.status_code == 403
|
||||
assert get_bye_wrong_scope.headers.get("content-type") == "application/problem+json"
|
||||
get_bye_wrong_scope_reponse = json.loads(get_bye_wrong_scope.text)
|
||||
get_bye_wrong_scope_reponse = get_bye_wrong_scope.json()
|
||||
assert (
|
||||
get_bye_wrong_scope_reponse["detail"]
|
||||
== "Provided token doesn't have the required scope"
|
||||
@@ -114,7 +114,7 @@ def test_security(oauth_requests, secure_endpoint_app):
|
||||
get_bye_bad_token = app_client.get("/v1.0/byesecure/jsantos", headers=headers)
|
||||
assert get_bye_bad_token.status_code == 401
|
||||
assert get_bye_bad_token.headers.get("content-type") == "application/problem+json"
|
||||
get_bye_bad_token_reponse = json.loads(get_bye_bad_token.text)
|
||||
get_bye_bad_token_reponse = get_bye_bad_token.json()
|
||||
assert get_bye_bad_token_reponse["detail"] == "Provided token is not valid"
|
||||
|
||||
response = app_client.get("/v1.0/more-than-one-security-definition")
|
||||
|
||||
@@ -5,5 +5,5 @@ def test_app(unordered_definition_app):
|
||||
app_client = unordered_definition_app.test_client()
|
||||
response = app_client.get("/v1.0/unordered-params/1?first=first&second=2")
|
||||
assert response.status_code == 400
|
||||
response_data = json.loads(response.text)
|
||||
response_data = response.json()
|
||||
assert response_data["detail"].startswith("'first' is not of type 'integer'")
|
||||
|
||||
@@ -15,6 +15,7 @@ OPENAPI3_SPEC = "openapi.yaml"
|
||||
SPECS = [OPENAPI2_SPEC, OPENAPI3_SPEC]
|
||||
METHOD_VIEW_RESOLVERS = [MethodResolver, MethodViewResolver]
|
||||
APP_CLASSES = [FlaskApp, AsyncApp]
|
||||
# APP_CLASSES = [FlaskApp]
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
|
||||
@@ -51,7 +51,7 @@ def test_readonly(json_datetime_dir, spec, app_class):
|
||||
|
||||
res = app_client.get("/v1.0/" + spec.replace("yaml", "json"))
|
||||
assert res.status_code == 200, f"Error is {res.data}"
|
||||
spec_data = json.loads(res.text)
|
||||
spec_data = res.json()
|
||||
|
||||
if spec == "openapi.yaml":
|
||||
response_path = "responses.200.content.application/json.schema"
|
||||
@@ -76,15 +76,15 @@ def test_readonly(json_datetime_dir, spec, app_class):
|
||||
|
||||
res = app_client.get("/v1.0/datetime")
|
||||
assert res.status_code == 200, f"Error is {res.data}"
|
||||
data = json.loads(res.text)
|
||||
data = res.json()
|
||||
assert data == {"value": "2000-01-02T03:04:05.000006Z"}
|
||||
|
||||
res = app_client.get("/v1.0/date")
|
||||
assert res.status_code == 200, f"Error is {res.data}"
|
||||
data = json.loads(res.text)
|
||||
data = res.json()
|
||||
assert data == {"value": "2000-01-02"}
|
||||
|
||||
res = app_client.get("/v1.0/uuid")
|
||||
assert res.status_code == 200, f"Error is {res.data}"
|
||||
data = json.loads(res.text)
|
||||
data = res.json()
|
||||
assert data == {"value": "e7ff66d0-3ec2-4c4e-bed0-6e4723c24c51"}
|
||||
|
||||
@@ -40,12 +40,14 @@ def test_validator_map(json_validation_spec_dir, spec):
|
||||
res = app_client.post(
|
||||
"/v1.0/minlength",
|
||||
data=json.dumps({"foo": "bar"}),
|
||||
content_type="application/json",
|
||||
headers={"content-type": "application/json"},
|
||||
)
|
||||
assert res.status_code == 200
|
||||
|
||||
res = app_client.post(
|
||||
"/v1.0/minlength", data=json.dumps({"foo": ""}), content_type="application/json"
|
||||
"/v1.0/minlength",
|
||||
data=json.dumps({"foo": ""}),
|
||||
headers={"content-type": "application/json"},
|
||||
)
|
||||
assert res.status_code == 400
|
||||
|
||||
@@ -63,7 +65,7 @@ def test_readonly(json_validation_spec_dir, spec, app_class):
|
||||
|
||||
res = app_client.get("/v1.0/user")
|
||||
assert res.status_code == 200
|
||||
assert json.loads(res.text).get("user_id") == 7
|
||||
assert res.json().get("user_id") == 7
|
||||
|
||||
res = app_client.post(
|
||||
"/v1.0/user",
|
||||
@@ -71,7 +73,7 @@ def test_readonly(json_validation_spec_dir, spec, app_class):
|
||||
headers=headers,
|
||||
)
|
||||
assert res.status_code == 200
|
||||
assert json.loads(res.text).get("user_id") == 8
|
||||
assert res.json().get("user_id") == 8
|
||||
|
||||
res = app_client.post(
|
||||
"/v1.0/user",
|
||||
@@ -96,18 +98,15 @@ def test_writeonly(json_validation_spec_dir, spec, app_class):
|
||||
headers={"content-type": "application/json"},
|
||||
)
|
||||
assert res.status_code == 200
|
||||
assert "password" not in json.loads(res.text)
|
||||
assert "password" not in res.json()
|
||||
|
||||
res = app_client.get("/v1.0/user")
|
||||
assert res.status_code == 200
|
||||
assert "password" not in json.loads(res.text)
|
||||
assert "password" not in res.json()
|
||||
|
||||
res = app_client.get("/v1.0/user_with_password")
|
||||
assert res.status_code == 500
|
||||
assert (
|
||||
json.loads(res.text)["title"]
|
||||
== "Response body does not conform to specification"
|
||||
)
|
||||
assert res.json()["title"] == "Response body does not conform to specification"
|
||||
|
||||
|
||||
def test_nullable_default(json_validation_spec_dir, spec):
|
||||
@@ -127,9 +126,9 @@ def test_multipart_form_json(json_validation_spec_dir, spec, app_class):
|
||||
|
||||
res = app_client.post(
|
||||
"/v1.0/multipart_form_json",
|
||||
files={"file": b""}, # Force multipart/form-data content-type
|
||||
data={"x": json.dumps({"name": "joe", "age": 20})},
|
||||
headers={"content-type": "multipart/form-data"},
|
||||
)
|
||||
assert res.status_code == 200
|
||||
assert json.loads(res.text)["name"] == "joe-reply"
|
||||
assert json.loads(res.text)["age"] == 30
|
||||
assert res.json()["name"] == "joe-reply"
|
||||
assert res.json()["age"] == 30
|
||||
|
||||
@@ -201,13 +201,13 @@ def test_method_view_resolver_integration(spec, app_class, method_view_resolver)
|
||||
client = method_view_app.test_client()
|
||||
|
||||
r = client.get("/v1.0/pets")
|
||||
assert r.json == [{"name": "get"}]
|
||||
assert r.json() == [{"name": "get"}]
|
||||
|
||||
r = client.get("/v1.0/pets/1")
|
||||
assert r.json == {"name": "get", "petId": 1}
|
||||
assert r.json() == {"name": "get", "petId": 1}
|
||||
|
||||
r = client.post("/v1.0/pets", json={"name": "Musti"})
|
||||
assert r.json == {"name": "post", "body": {"name": "Musti"}}
|
||||
assert r.json() == {"name": "post", "body": {"name": "Musti"}}
|
||||
|
||||
r = client.put("/v1.0/pets/1", json={"name": "Igor"})
|
||||
assert r.json == {"name": "put", "petId": 1, "body": {"name": "Igor"}}
|
||||
assert r.json() == {"name": "put", "petId": 1, "body": {"name": "Igor"}}
|
||||
|
||||
Reference in New Issue
Block a user