diff --git a/fastapi/openapi/models.py b/fastapi/openapi/models.py index fd480946d..efbd88ad7 100644 --- a/fastapi/openapi/models.py +++ b/fastapi/openapi/models.py @@ -117,6 +117,9 @@ class SchemaBase(BaseModel): example: Optional[Any] = None deprecated: Optional[bool] = None + class Config: + extra: str = "allow" + class Schema(SchemaBase): allOf: Optional[List[SchemaBase]] = None diff --git a/tests/test_custom_schema_fields.py b/tests/test_custom_schema_fields.py new file mode 100644 index 000000000..10b02608c --- /dev/null +++ b/tests/test_custom_schema_fields.py @@ -0,0 +1,51 @@ +from fastapi import FastAPI +from fastapi.testclient import TestClient +from pydantic import BaseModel + +app = FastAPI() + + +class Item(BaseModel): + name: str + + class Config: + schema_extra = { + "x-something-internal": {"level": 4}, + } + + +@app.get("/foo", response_model=Item) +def foo(): + return {"name": "Foo item"} + + +client = TestClient(app) + + +item_schema = { + "title": "Item", + "required": ["name"], + "type": "object", + "x-something-internal": { + "level": 4, + }, + "properties": { + "name": { + "title": "Name", + "type": "string", + } + }, +} + + +def test_custom_response_schema(): + response = client.get("/openapi.json") + assert response.status_code == 200, response.text + assert response.json()["components"]["schemas"]["Item"] == item_schema + + +def test_response(): + # For coverage + response = client.get("/foo") + assert response.status_code == 200, response.text + assert response.json() == {"name": "Foo item"}