コード例 #1
0
def override_fastapi_openapi_method(app: FastAPI):
    # pylint: disable=protected-access
    app._original_openapi = types.MethodType(copy_func(app.openapi),
                                             app)  # type: ignore

    def _custom_openapi_method(self: FastAPI) -> Dict:
        """Overrides FastAPI.openapi member function
        returns OAS schema with vendor extensions
        """
        # NOTE: see fastapi.applications.py:FastApi.openapi(self) implementation
        if not self.openapi_schema:
            self.openapi_schema = self._original_openapi()  # type: ignore
            _patch_openapi_specs(self.openapi_schema)

        return self.openapi_schema

    app.openapi = types.MethodType(_custom_openapi_method, app)
コード例 #2
0
def test_overriding_openapi_method(app: FastAPI):
    assert not hasattr(app, "_original_openapi")
    assert app.openapi.__doc__ is None

    override_fastapi_openapi_method(app)

    assert hasattr(app, "_original_openapi")
    assert "Overrides FastAPI.openapi member function" in str(
        app.openapi.__doc__)

    # override patches should now work
    openapi = app.openapi()
    assert openapi and isinstance(openapi, dict)

    validate_spec(openapi)

    params = openapi["paths"]["/data"]["get"]["parameters"]
    assert params == [
        {
            "required": True,
            "schema": {
                "title": "X",
                "exclusiveMinimum": True,
                "type": "number",
                "minimum": 0.0,
            },
            "name": "x",
            "in": "query",
        },
        {
            "required": True,
            "schema": {
                "title": "Y",
                "exclusiveMaximum": True,
                "exclusiveMinimum": True,
                "type": "integer",
                "maximum": 4,
                "minimum": 3,
            },
            "name": "y",
            "in": "query",
        },
    ]
コード例 #3
0
def test_exclusive_min_openapi_issue(app: FastAPI):
    # Tests patched issues is still unresolved https://github.com/tiangolo/fastapi/issues/240
    # When this test fails, remove patch
    with pytest.raises(OpenAPIValidationError):
        validate_spec(app.openapi())