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)
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", }, ]
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())