Coverage for tests/test_serialize_response_model.py: 100%
66 statements
« prev ^ index » next coverage.py v7.6.1, created at 2025-05-05 00:03 +0000
« prev ^ index » next coverage.py v7.6.1, created at 2025-05-05 00:03 +0000
1from typing import Dict, List, Optional 1abcdef
3from fastapi import FastAPI 1abcdef
4from pydantic import BaseModel, Field 1abcdef
5from starlette.testclient import TestClient 1abcdef
7app = FastAPI() 1abcdef
10class Item(BaseModel): 1abcdef
11 name: str = Field(alias="aliased_name") 1abcdef
12 price: Optional[float] = None 1abcdef
13 owner_ids: Optional[List[int]] = None 1abcdef
16@app.get("/items/valid", response_model=Item) 1abcdef
17def get_valid(): 1abcdef
18 return Item(aliased_name="valid", price=1.0) 1ghijkl
21@app.get("/items/coerce", response_model=Item) 1abcdef
22def get_coerce(): 1abcdef
23 return Item(aliased_name="coerce", price="1.0") 1mnopqr
26@app.get("/items/validlist", response_model=List[Item]) 1abcdef
27def get_validlist(): 1abcdef
28 return [ 1stuvwx
29 Item(aliased_name="foo"),
30 Item(aliased_name="bar", price=1.0),
31 Item(aliased_name="baz", price=2.0, owner_ids=[1, 2, 3]),
32 ]
35@app.get("/items/validdict", response_model=Dict[str, Item]) 1abcdef
36def get_validdict(): 1abcdef
37 return { 1yzABCD
38 "k1": Item(aliased_name="foo"),
39 "k2": Item(aliased_name="bar", price=1.0),
40 "k3": Item(aliased_name="baz", price=2.0, owner_ids=[1, 2, 3]),
41 }
44@app.get( 1abcdef
45 "/items/valid-exclude-unset", response_model=Item, response_model_exclude_unset=True
46)
47def get_valid_exclude_unset(): 1abcdef
48 return Item(aliased_name="valid", price=1.0) 1EFGHIJ
51@app.get( 1abcdef
52 "/items/coerce-exclude-unset",
53 response_model=Item,
54 response_model_exclude_unset=True,
55)
56def get_coerce_exclude_unset(): 1abcdef
57 return Item(aliased_name="coerce", price="1.0") 1KLMNOP
60@app.get( 1abcdef
61 "/items/validlist-exclude-unset",
62 response_model=List[Item],
63 response_model_exclude_unset=True,
64)
65def get_validlist_exclude_unset(): 1abcdef
66 return [ 1QRSTUV
67 Item(aliased_name="foo"),
68 Item(aliased_name="bar", price=1.0),
69 Item(aliased_name="baz", price=2.0, owner_ids=[1, 2, 3]),
70 ]
73@app.get( 1abcdef
74 "/items/validdict-exclude-unset",
75 response_model=Dict[str, Item],
76 response_model_exclude_unset=True,
77)
78def get_validdict_exclude_unset(): 1abcdef
79 return { 1WXYZ01
80 "k1": Item(aliased_name="foo"),
81 "k2": Item(aliased_name="bar", price=1.0),
82 "k3": Item(aliased_name="baz", price=2.0, owner_ids=[1, 2, 3]),
83 }
86client = TestClient(app) 1abcdef
89def test_valid(): 1abcdef
90 response = client.get("/items/valid") 1ghijkl
91 response.raise_for_status() 1ghijkl
92 assert response.json() == {"aliased_name": "valid", "price": 1.0, "owner_ids": None} 1ghijkl
95def test_coerce(): 1abcdef
96 response = client.get("/items/coerce") 1mnopqr
97 response.raise_for_status() 1mnopqr
98 assert response.json() == { 1mnopqr
99 "aliased_name": "coerce",
100 "price": 1.0,
101 "owner_ids": None,
102 }
105def test_validlist(): 1abcdef
106 response = client.get("/items/validlist") 1stuvwx
107 response.raise_for_status() 1stuvwx
108 assert response.json() == [ 1stuvwx
109 {"aliased_name": "foo", "price": None, "owner_ids": None},
110 {"aliased_name": "bar", "price": 1.0, "owner_ids": None},
111 {"aliased_name": "baz", "price": 2.0, "owner_ids": [1, 2, 3]},
112 ]
115def test_validdict(): 1abcdef
116 response = client.get("/items/validdict") 1yzABCD
117 response.raise_for_status() 1yzABCD
118 assert response.json() == { 1yzABCD
119 "k1": {"aliased_name": "foo", "price": None, "owner_ids": None},
120 "k2": {"aliased_name": "bar", "price": 1.0, "owner_ids": None},
121 "k3": {"aliased_name": "baz", "price": 2.0, "owner_ids": [1, 2, 3]},
122 }
125def test_valid_exclude_unset(): 1abcdef
126 response = client.get("/items/valid-exclude-unset") 1EFGHIJ
127 response.raise_for_status() 1EFGHIJ
128 assert response.json() == {"aliased_name": "valid", "price": 1.0} 1EFGHIJ
131def test_coerce_exclude_unset(): 1abcdef
132 response = client.get("/items/coerce-exclude-unset") 1KLMNOP
133 response.raise_for_status() 1KLMNOP
134 assert response.json() == {"aliased_name": "coerce", "price": 1.0} 1KLMNOP
137def test_validlist_exclude_unset(): 1abcdef
138 response = client.get("/items/validlist-exclude-unset") 1QRSTUV
139 response.raise_for_status() 1QRSTUV
140 assert response.json() == [ 1QRSTUV
141 {"aliased_name": "foo"},
142 {"aliased_name": "bar", "price": 1.0},
143 {"aliased_name": "baz", "price": 2.0, "owner_ids": [1, 2, 3]},
144 ]
147def test_validdict_exclude_unset(): 1abcdef
148 response = client.get("/items/validdict-exclude-unset") 1WXYZ01
149 response.raise_for_status() 1WXYZ01
150 assert response.json() == { 1WXYZ01
151 "k1": {"aliased_name": "foo"},
152 "k2": {"aliased_name": "bar", "price": 1.0},
153 "k3": {"aliased_name": "baz", "price": 2.0, "owner_ids": [1, 2, 3]},
154 }