3
from fastapi import FastAPI
4
from fastapi._compat import PYDANTIC_V2
5
from fastapi.testclient import TestClient
6
from pydantic import BaseModel, ConfigDict, Field
11
class Model(BaseModel):
12
name: str = Field(alias="alias")
15
class ModelNoAlias(BaseModel):
19
model_config = ConfigDict(
22
"response_model_by_alias=False is basically a quick hack, to support "
23
"proper OpenAPI use another model with the correct field names"
32
"response_model_by_alias=False is basically a quick hack, to support "
33
"proper OpenAPI use another model with the correct field names"
38
@app.get("/dict", response_model=Model, response_model_by_alias=False)
40
return {"alias": "Foo"}
43
@app.get("/model", response_model=Model, response_model_by_alias=False)
45
return Model(alias="Foo")
48
@app.get("/list", response_model=List[Model], response_model_by_alias=False)
50
return [{"alias": "Foo"}, {"alias": "Bar"}]
53
@app.get("/by-alias/dict", response_model=Model)
55
return {"alias": "Foo"}
58
@app.get("/by-alias/model", response_model=Model)
60
return Model(alias="Foo")
63
@app.get("/by-alias/list", response_model=List[Model])
65
return [{"alias": "Foo"}, {"alias": "Bar"}]
68
@app.get("/no-alias/dict", response_model=ModelNoAlias)
70
return {"name": "Foo"}
73
@app.get("/no-alias/model", response_model=ModelNoAlias)
75
return ModelNoAlias(name="Foo")
78
@app.get("/no-alias/list", response_model=List[ModelNoAlias])
80
return [{"name": "Foo"}, {"name": "Bar"}]
83
client = TestClient(app)
87
response = client.get("/dict")
88
assert response.status_code == 200, response.text
89
assert response.json() == {"name": "Foo"}
93
response = client.get("/model")
94
assert response.status_code == 200, response.text
95
assert response.json() == {"name": "Foo"}
99
response = client.get("/list")
100
assert response.status_code == 200, response.text
101
assert response.json() == [
107
def test_read_dict_by_alias():
108
response = client.get("/by-alias/dict")
109
assert response.status_code == 200, response.text
110
assert response.json() == {"alias": "Foo"}
113
def test_read_model_by_alias():
114
response = client.get("/by-alias/model")
115
assert response.status_code == 200, response.text
116
assert response.json() == {"alias": "Foo"}
119
def test_read_list_by_alias():
120
response = client.get("/by-alias/list")
121
assert response.status_code == 200, response.text
122
assert response.json() == [
128
def test_read_dict_no_alias():
129
response = client.get("/no-alias/dict")
130
assert response.status_code == 200, response.text
131
assert response.json() == {"name": "Foo"}
134
def test_read_model_no_alias():
135
response = client.get("/no-alias/model")
136
assert response.status_code == 200, response.text
137
assert response.json() == {"name": "Foo"}
140
def test_read_list_no_alias():
141
response = client.get("/no-alias/list")
142
assert response.status_code == 200, response.text
143
assert response.json() == [
149
def test_openapi_schema():
150
response = client.get("/openapi.json")
151
assert response.status_code == 200, response.text
152
assert response.json() == {
154
"info": {"title": "FastAPI", "version": "0.1.0"},
158
"summary": "Read Dict",
159
"operationId": "read_dict_dict_get",
162
"description": "Successful Response",
164
"application/json": {
165
"schema": {"$ref": "#/components/schemas/Model"}
174
"summary": "Read Model",
175
"operationId": "read_model_model_get",
178
"description": "Successful Response",
180
"application/json": {
181
"schema": {"$ref": "#/components/schemas/Model"}
190
"summary": "Read List",
191
"operationId": "read_list_list_get",
194
"description": "Successful Response",
196
"application/json": {
198
"title": "Response Read List List Get",
200
"items": {"$ref": "#/components/schemas/Model"},
210
"summary": "By Alias Dict",
211
"operationId": "by_alias_dict_by_alias_dict_get",
214
"description": "Successful Response",
216
"application/json": {
217
"schema": {"$ref": "#/components/schemas/Model"}
226
"summary": "By Alias Model",
227
"operationId": "by_alias_model_by_alias_model_get",
230
"description": "Successful Response",
232
"application/json": {
233
"schema": {"$ref": "#/components/schemas/Model"}
242
"summary": "By Alias List",
243
"operationId": "by_alias_list_by_alias_list_get",
246
"description": "Successful Response",
248
"application/json": {
250
"title": "Response By Alias List By Alias List Get",
252
"items": {"$ref": "#/components/schemas/Model"},
262
"summary": "No Alias Dict",
263
"operationId": "no_alias_dict_no_alias_dict_get",
266
"description": "Successful Response",
268
"application/json": {
270
"$ref": "#/components/schemas/ModelNoAlias"
280
"summary": "No Alias Model",
281
"operationId": "no_alias_model_no_alias_model_get",
284
"description": "Successful Response",
286
"application/json": {
288
"$ref": "#/components/schemas/ModelNoAlias"
298
"summary": "No Alias List",
299
"operationId": "no_alias_list_no_alias_list_get",
302
"description": "Successful Response",
304
"application/json": {
306
"title": "Response No Alias List No Alias List Get",
309
"$ref": "#/components/schemas/ModelNoAlias"
323
"required": ["alias"],
325
"properties": {"alias": {"title": "Alias", "type": "string"}},
328
"title": "ModelNoAlias",
329
"required": ["name"],
331
"properties": {"name": {"title": "Name", "type": "string"}},
332
"description": "response_model_by_alias=False is basically a quick hack, to support proper OpenAPI use another model with the correct field names",