Coverage for tests / test_serialize_response_model.py: 100%
65 statements
« prev ^ index » next coverage.py v7.13.3, created at 2026-04-06 01:24 +0000
« prev ^ index » next coverage.py v7.13.3, created at 2026-04-06 01:24 +0000
1from fastapi import FastAPI 1abcd
2from pydantic import BaseModel, Field 1abcd
3from starlette.testclient import TestClient 1abcd
5app = FastAPI() 1abcd
8class Item(BaseModel): 1abcd
9 name: str = Field(alias="aliased_name") 1abcd
10 price: float | None = None 1abcd
11 owner_ids: list[int] | None = None 1abcd
14@app.get("/items/valid", response_model=Item) 1abcd
15def get_valid(): 1abcd
16 return Item(aliased_name="valid", price=1.0) 1efgh
19@app.get("/items/coerce", response_model=Item) 1abcd
20def get_coerce(): 1abcd
21 return Item(aliased_name="coerce", price="1.0") 1ijkl
24@app.get("/items/validlist", response_model=list[Item]) 1abcd
25def get_validlist(): 1abcd
26 return [ 1mnop
27 Item(aliased_name="foo"),
28 Item(aliased_name="bar", price=1.0),
29 Item(aliased_name="baz", price=2.0, owner_ids=[1, 2, 3]),
30 ]
33@app.get("/items/validdict", response_model=dict[str, Item]) 1abcd
34def get_validdict(): 1abcd
35 return { 1qrst
36 "k1": Item(aliased_name="foo"),
37 "k2": Item(aliased_name="bar", price=1.0),
38 "k3": Item(aliased_name="baz", price=2.0, owner_ids=[1, 2, 3]),
39 }
42@app.get( 1abcd
43 "/items/valid-exclude-unset", response_model=Item, response_model_exclude_unset=True
44)
45def get_valid_exclude_unset(): 1abcd
46 return Item(aliased_name="valid", price=1.0) 1uvwx
49@app.get( 1abcd
50 "/items/coerce-exclude-unset",
51 response_model=Item,
52 response_model_exclude_unset=True,
53)
54def get_coerce_exclude_unset(): 1abcd
55 return Item(aliased_name="coerce", price="1.0") 1yzAB
58@app.get( 1abcd
59 "/items/validlist-exclude-unset",
60 response_model=list[Item],
61 response_model_exclude_unset=True,
62)
63def get_validlist_exclude_unset(): 1abcd
64 return [ 1CDEF
65 Item(aliased_name="foo"),
66 Item(aliased_name="bar", price=1.0),
67 Item(aliased_name="baz", price=2.0, owner_ids=[1, 2, 3]),
68 ]
71@app.get( 1abcd
72 "/items/validdict-exclude-unset",
73 response_model=dict[str, Item],
74 response_model_exclude_unset=True,
75)
76def get_validdict_exclude_unset(): 1abcd
77 return { 1GHIJ
78 "k1": Item(aliased_name="foo"),
79 "k2": Item(aliased_name="bar", price=1.0),
80 "k3": Item(aliased_name="baz", price=2.0, owner_ids=[1, 2, 3]),
81 }
84client = TestClient(app) 1abcd
87def test_valid(): 1abcd
88 response = client.get("/items/valid") 1efgh
89 response.raise_for_status() 1efgh
90 assert response.json() == {"aliased_name": "valid", "price": 1.0, "owner_ids": None} 1efgh
93def test_coerce(): 1abcd
94 response = client.get("/items/coerce") 1ijkl
95 response.raise_for_status() 1ijkl
96 assert response.json() == { 1ijkl
97 "aliased_name": "coerce",
98 "price": 1.0,
99 "owner_ids": None,
100 }
103def test_validlist(): 1abcd
104 response = client.get("/items/validlist") 1mnop
105 response.raise_for_status() 1mnop
106 assert response.json() == [ 1mnop
107 {"aliased_name": "foo", "price": None, "owner_ids": None},
108 {"aliased_name": "bar", "price": 1.0, "owner_ids": None},
109 {"aliased_name": "baz", "price": 2.0, "owner_ids": [1, 2, 3]},
110 ]
113def test_validdict(): 1abcd
114 response = client.get("/items/validdict") 1qrst
115 response.raise_for_status() 1qrst
116 assert response.json() == { 1qrst
117 "k1": {"aliased_name": "foo", "price": None, "owner_ids": None},
118 "k2": {"aliased_name": "bar", "price": 1.0, "owner_ids": None},
119 "k3": {"aliased_name": "baz", "price": 2.0, "owner_ids": [1, 2, 3]},
120 }
123def test_valid_exclude_unset(): 1abcd
124 response = client.get("/items/valid-exclude-unset") 1uvwx
125 response.raise_for_status() 1uvwx
126 assert response.json() == {"aliased_name": "valid", "price": 1.0} 1uvwx
129def test_coerce_exclude_unset(): 1abcd
130 response = client.get("/items/coerce-exclude-unset") 1yzAB
131 response.raise_for_status() 1yzAB
132 assert response.json() == {"aliased_name": "coerce", "price": 1.0} 1yzAB
135def test_validlist_exclude_unset(): 1abcd
136 response = client.get("/items/validlist-exclude-unset") 1CDEF
137 response.raise_for_status() 1CDEF
138 assert response.json() == [ 1CDEF
139 {"aliased_name": "foo"},
140 {"aliased_name": "bar", "price": 1.0},
141 {"aliased_name": "baz", "price": 2.0, "owner_ids": [1, 2, 3]},
142 ]
145def test_validdict_exclude_unset(): 1abcd
146 response = client.get("/items/validdict-exclude-unset") 1GHIJ
147 response.raise_for_status() 1GHIJ
148 assert response.json() == { 1GHIJ
149 "k1": {"aliased_name": "foo"},
150 "k2": {"aliased_name": "bar", "price": 1.0},
151 "k3": {"aliased_name": "baz", "price": 2.0, "owner_ids": [1, 2, 3]},
152 }