mirror of
https://github.com/LukeHagar/connexion.git
synced 2025-12-09 20:37:46 +00:00
This PR updates the examples for Connexion 3.0 and merges them for OpenAPI and Swagger. 2 examples required some changes to make them work: - The reverse proxy example required some fixes to the SwaggerUIMiddleware to leverage the `root_path` correctly. This is included in the PR. - The enforced defaults example requires the json validator to adapt the body and pass it on. We currently pass on the original body after validation, and I'm not sure if we should change this. I'll submit a separate PR to discuss this.
146 lines
4.5 KiB
Python
146 lines
4.5 KiB
Python
import os
|
|
import pathlib
|
|
import tempfile
|
|
from unittest.mock import MagicMock
|
|
|
|
import pytest
|
|
from connexion import FlaskApi
|
|
from connexion.exceptions import InvalidSpecification, ResolverError
|
|
from connexion.spec import canonical_base_path
|
|
from yaml import YAMLError
|
|
|
|
TEST_FOLDER = pathlib.Path(__file__).parent
|
|
|
|
|
|
def test_canonical_base_path():
|
|
assert canonical_base_path("") == ""
|
|
assert canonical_base_path("/") == ""
|
|
assert canonical_base_path("/api") == "/api"
|
|
assert canonical_base_path("/api/") == "/api"
|
|
|
|
|
|
def test_api():
|
|
api = FlaskApi(TEST_FOLDER / "fixtures/simple/swagger.yaml", base_path="/api/v1.0")
|
|
assert api.blueprint.name == "/api/v1_0"
|
|
assert api.blueprint.url_prefix == "/api/v1.0"
|
|
|
|
api2 = FlaskApi(TEST_FOLDER / "fixtures/simple/swagger.yaml")
|
|
assert api2.blueprint.name == "/v1_0"
|
|
assert api2.blueprint.url_prefix == "/v1.0"
|
|
|
|
api3 = FlaskApi(TEST_FOLDER / "fixtures/simple/openapi.yaml", base_path="/api/v1.0")
|
|
assert api3.blueprint.name == "/api/v1_0"
|
|
assert api3.blueprint.url_prefix == "/api/v1.0"
|
|
|
|
api4 = FlaskApi(TEST_FOLDER / "fixtures/simple/openapi.yaml")
|
|
assert api4.blueprint.name == "/v1_0"
|
|
assert api4.blueprint.url_prefix == "/v1.0"
|
|
|
|
|
|
def test_api_base_path_slash():
|
|
api = FlaskApi(TEST_FOLDER / "fixtures/simple/basepath-slash.yaml")
|
|
assert api.blueprint.name == ""
|
|
assert api.blueprint.url_prefix == ""
|
|
|
|
|
|
def test_template():
|
|
api1 = FlaskApi(
|
|
TEST_FOLDER / "fixtures/simple/swagger.yaml",
|
|
base_path="/api/v1.0",
|
|
arguments={"title": "test"},
|
|
)
|
|
assert api1.specification["info"]["title"] == "test"
|
|
|
|
api2 = FlaskApi(
|
|
TEST_FOLDER / "fixtures/simple/swagger.yaml",
|
|
base_path="/api/v1.0",
|
|
arguments={"title": "other test"},
|
|
)
|
|
assert api2.specification["info"]["title"] == "other test"
|
|
|
|
|
|
def test_invalid_operation_does_stop_application_to_setup():
|
|
with pytest.raises(ImportError):
|
|
FlaskApi(
|
|
TEST_FOLDER / "fixtures/op_error_api/swagger.yaml",
|
|
base_path="/api/v1.0",
|
|
arguments={"title": "OK"},
|
|
)
|
|
|
|
with pytest.raises(ValueError):
|
|
FlaskApi(
|
|
TEST_FOLDER / "fixtures/missing_op_id/swagger.yaml",
|
|
base_path="/api/v1.0",
|
|
arguments={"title": "OK"},
|
|
)
|
|
|
|
with pytest.raises(ImportError):
|
|
FlaskApi(
|
|
TEST_FOLDER / "fixtures/module_not_implemented/swagger.yaml",
|
|
base_path="/api/v1.0",
|
|
arguments={"title": "OK"},
|
|
)
|
|
|
|
with pytest.raises(ValueError):
|
|
FlaskApi(
|
|
TEST_FOLDER / "fixtures/user_module_loading_error/swagger.yaml",
|
|
base_path="/api/v1.0",
|
|
arguments={"title": "OK"},
|
|
)
|
|
|
|
|
|
def test_other_errors_stop_application_to_setup():
|
|
# Errors should still result exceptions!
|
|
with pytest.raises(InvalidSpecification):
|
|
FlaskApi(
|
|
TEST_FOLDER / "fixtures/bad_specs/swagger.yaml",
|
|
base_path="/api/v1.0",
|
|
arguments={"title": "OK"},
|
|
)
|
|
|
|
|
|
def test_invalid_schema_file_structure():
|
|
with pytest.raises(InvalidSpecification):
|
|
FlaskApi(
|
|
TEST_FOLDER / "fixtures/invalid_schema/swagger.yaml",
|
|
base_path="/api/v1.0",
|
|
arguments={"title": "OK"},
|
|
)
|
|
|
|
|
|
def test_invalid_encoding():
|
|
with tempfile.NamedTemporaryFile(mode="wb", delete=False) as f:
|
|
f.write(
|
|
"swagger: '2.0'\ninfo:\n title: Foo 整\n version: v1\npaths: {}".encode(
|
|
"gbk"
|
|
)
|
|
)
|
|
FlaskApi(pathlib.Path(f.name), base_path="/api/v1.0")
|
|
os.unlink(f.name)
|
|
|
|
|
|
def test_use_of_safe_load_for_yaml_swagger_specs():
|
|
with pytest.raises(YAMLError):
|
|
with tempfile.NamedTemporaryFile(delete=False) as f:
|
|
f.write(b"!!python/object:object {}\n")
|
|
try:
|
|
FlaskApi(pathlib.Path(f.name), base_path="/api/v1.0")
|
|
os.unlink(f.name)
|
|
except InvalidSpecification:
|
|
pytest.fail("Could load invalid YAML file, use yaml.safe_load!")
|
|
|
|
|
|
def test_validation_error_on_completely_invalid_swagger_spec():
|
|
with tempfile.NamedTemporaryFile(delete=False) as f:
|
|
f.write(b"[1]\n")
|
|
with pytest.raises(InvalidSpecification):
|
|
FlaskApi(pathlib.Path(f.name), base_path="/api/v1.0")
|
|
os.unlink(f.name)
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_api_logger(monkeypatch):
|
|
mocked_logger = MagicMock(name="mocked_logger")
|
|
monkeypatch.setattr("connexion.apis.abstract.logger", mocked_logger)
|
|
return mocked_logger
|