Coverage for tests / test_request_params / test_cookie / test_optional_str.py: 100%
131 statements
« prev ^ index » next coverage.py v7.13.3, created at 2026-02-12 18:15 +0000
« prev ^ index » next coverage.py v7.13.3, created at 2026-02-12 18:15 +0000
1from typing import Annotated, Optional 1abcd
3import pytest 1abcd
4from fastapi import Cookie, FastAPI 1abcd
5from fastapi.testclient import TestClient 1abcd
6from inline_snapshot import snapshot 1abcd
7from pydantic import BaseModel, Field 1abcd
9app = FastAPI() 1abcd
11# =====================================================================================
12# Without aliases
15@app.get("/optional-str") 1abcd
16async def read_optional_str(p: Annotated[Optional[str], Cookie()] = None): 1abcd
17 return {"p": p} 1eCfDgE
20class CookieModelOptionalStr(BaseModel): 1abcd
21 p: Optional[str] = None 1abcd
24@app.get("/model-optional-str") 1abcd
25async def read_model_optional_str(p: Annotated[CookieModelOptionalStr, Cookie()]): 1abcd
26 return {"p": p.p} 1eCfDgE
29@pytest.mark.parametrize( 1abcd
30 "path",
31 ["/optional-str", "/model-optional-str"],
32)
33def test_optional_str_schema(path: str): 1abcd
34 assert app.openapi()["paths"][path]["get"]["parameters"] == snapshot( 1OPQ
35 [
36 {
37 "required": False,
38 "schema": {
39 "anyOf": [{"type": "string"}, {"type": "null"}],
40 "title": "P",
41 },
42 "name": "p",
43 "in": "cookie",
44 }
45 ]
46 )
49@pytest.mark.parametrize( 1abcd
50 "path",
51 ["/optional-str", "/model-optional-str"],
52)
53def test_optional_str_missing(path: str): 1abcd
54 client = TestClient(app) 1CDE
55 response = client.get(path) 1CDE
56 assert response.status_code == 200 1CDE
57 assert response.json() == {"p": None} 1CDE
60@pytest.mark.parametrize( 1abcd
61 "path",
62 ["/optional-str", "/model-optional-str"],
63)
64def test_optional_str(path: str): 1abcd
65 client = TestClient(app) 1efg
66 client.cookies.set("p", "hello") 1efg
67 response = client.get(path) 1efg
68 assert response.status_code == 200 1efg
69 assert response.json() == {"p": "hello"} 1efg
72# =====================================================================================
73# Alias
76@app.get("/optional-alias") 1abcd
77async def read_optional_alias( 1abcd
78 p: Annotated[Optional[str], Cookie(alias="p_alias")] = None,
79):
80 return {"p": p} 1hiFjkGlmH
83class CookieModelOptionalAlias(BaseModel): 1abcd
84 p: Optional[str] = Field(None, alias="p_alias") 1abcd
87@app.get("/model-optional-alias") 1abcd
88async def read_model_optional_alias(p: Annotated[CookieModelOptionalAlias, Cookie()]): 1abcd
89 return {"p": p.p} 1hiFjkGlmH
92@pytest.mark.parametrize( 1abcd
93 "path",
94 ["/optional-alias", "/model-optional-alias"],
95)
96def test_optional_str_alias_schema(path: str): 1abcd
97 assert app.openapi()["paths"][path]["get"]["parameters"] == snapshot( 1RST
98 [
99 {
100 "required": False,
101 "schema": {
102 "anyOf": [{"type": "string"}, {"type": "null"}],
103 "title": "P Alias",
104 },
105 "name": "p_alias",
106 "in": "cookie",
107 }
108 ]
109 )
112@pytest.mark.parametrize( 1abcd
113 "path",
114 ["/optional-alias", "/model-optional-alias"],
115)
116def test_optional_alias_missing(path: str): 1abcd
117 client = TestClient(app) 1FGH
118 response = client.get(path) 1FGH
119 assert response.status_code == 200 1FGH
120 assert response.json() == {"p": None} 1FGH
123@pytest.mark.parametrize( 1abcd
124 "path",
125 ["/optional-alias", "/model-optional-alias"],
126)
127def test_optional_alias_by_name(path: str): 1abcd
128 client = TestClient(app) 1ikm
129 client.cookies.set("p", "hello") 1ikm
130 response = client.get(path) 1ikm
131 assert response.status_code == 200 1ikm
132 assert response.json() == {"p": None} 1ikm
135@pytest.mark.parametrize( 1abcd
136 "path",
137 [
138 "/optional-alias",
139 "/model-optional-alias",
140 ],
141)
142def test_optional_alias_by_alias(path: str): 1abcd
143 client = TestClient(app) 1hjl
144 client.cookies.set("p_alias", "hello") 1hjl
145 response = client.get(path) 1hjl
146 assert response.status_code == 200 1hjl
147 assert response.json() == {"p": "hello"} 1hjl
150# =====================================================================================
151# Validation alias
154@app.get("/optional-validation-alias") 1abcd
155def read_optional_validation_alias( 1abcd
156 p: Annotated[Optional[str], Cookie(validation_alias="p_val_alias")] = None,
157):
158 return {"p": p} 1noIpqJrsK
161class CookieModelOptionalValidationAlias(BaseModel): 1abcd
162 p: Optional[str] = Field(None, validation_alias="p_val_alias") 1abcd
165@app.get("/model-optional-validation-alias") 1abcd
166def read_model_optional_validation_alias( 1abcd
167 p: Annotated[CookieModelOptionalValidationAlias, Cookie()],
168):
169 return {"p": p.p} 1noIpqJrsK
172@pytest.mark.parametrize( 1abcd
173 "path",
174 ["/optional-validation-alias", "/model-optional-validation-alias"],
175)
176def test_optional_validation_alias_schema(path: str): 1abcd
177 assert app.openapi()["paths"][path]["get"]["parameters"] == snapshot( 1UVW
178 [
179 {
180 "required": False,
181 "schema": {
182 "anyOf": [{"type": "string"}, {"type": "null"}],
183 "title": "P Val Alias",
184 },
185 "name": "p_val_alias",
186 "in": "cookie",
187 }
188 ]
189 )
192@pytest.mark.parametrize( 1abcd
193 "path",
194 ["/optional-validation-alias", "/model-optional-validation-alias"],
195)
196def test_optional_validation_alias_missing(path: str): 1abcd
197 client = TestClient(app) 1IJK
198 response = client.get(path) 1IJK
199 assert response.status_code == 200 1IJK
200 assert response.json() == {"p": None} 1IJK
203@pytest.mark.parametrize( 1abcd
204 "path",
205 [
206 "/optional-validation-alias",
207 "/model-optional-validation-alias",
208 ],
209)
210def test_optional_validation_alias_by_name(path: str): 1abcd
211 client = TestClient(app) 1npr
212 client.cookies.set("p", "hello") 1npr
213 response = client.get(path) 1npr
214 assert response.status_code == 200 1npr
215 assert response.json() == {"p": None} 1npr
218@pytest.mark.parametrize( 1abcd
219 "path",
220 [
221 "/optional-validation-alias",
222 "/model-optional-validation-alias",
223 ],
224)
225def test_optional_validation_alias_by_validation_alias(path: str): 1abcd
226 client = TestClient(app) 1oqs
227 client.cookies.set("p_val_alias", "hello") 1oqs
228 response = client.get(path) 1oqs
229 assert response.status_code == 200 1oqs
230 assert response.json() == {"p": "hello"} 1oqs
233# =====================================================================================
234# Alias and validation alias
237@app.get("/optional-alias-and-validation-alias") 1abcd
238def read_optional_alias_and_validation_alias( 1abcd
239 p: Annotated[
240 Optional[str], Cookie(alias="p_alias", validation_alias="p_val_alias")
241 ] = None,
242):
243 return {"p": p} 1tuvLwxyMzABN
246class CookieModelOptionalAliasAndValidationAlias(BaseModel): 1abcd
247 p: Optional[str] = Field(None, alias="p_alias", validation_alias="p_val_alias") 1abcd
250@app.get("/model-optional-alias-and-validation-alias") 1abcd
251def read_model_optional_alias_and_validation_alias( 1abcd
252 p: Annotated[CookieModelOptionalAliasAndValidationAlias, Cookie()],
253):
254 return {"p": p.p} 1tuvLwxyMzABN
257@pytest.mark.parametrize( 1abcd
258 "path",
259 [
260 "/optional-alias-and-validation-alias",
261 "/model-optional-alias-and-validation-alias",
262 ],
263)
264def test_optional_alias_and_validation_alias_schema(path: str): 1abcd
265 assert app.openapi()["paths"][path]["get"]["parameters"] == snapshot( 1XYZ
266 [
267 {
268 "required": False,
269 "schema": {
270 "anyOf": [{"type": "string"}, {"type": "null"}],
271 "title": "P Val Alias",
272 },
273 "name": "p_val_alias",
274 "in": "cookie",
275 }
276 ]
277 )
280@pytest.mark.parametrize( 1abcd
281 "path",
282 [
283 "/optional-alias-and-validation-alias",
284 "/model-optional-alias-and-validation-alias",
285 ],
286)
287def test_optional_alias_and_validation_alias_missing(path: str): 1abcd
288 client = TestClient(app) 1LMN
289 response = client.get(path) 1LMN
290 assert response.status_code == 200 1LMN
291 assert response.json() == {"p": None} 1LMN
294@pytest.mark.parametrize( 1abcd
295 "path",
296 [
297 "/optional-alias-and-validation-alias",
298 "/model-optional-alias-and-validation-alias",
299 ],
300)
301def test_optional_alias_and_validation_alias_by_name(path: str): 1abcd
302 client = TestClient(app) 1uxA
303 client.cookies.set("p", "hello") 1uxA
304 response = client.get(path) 1uxA
305 assert response.status_code == 200 1uxA
306 assert response.json() == {"p": None} 1uxA
309@pytest.mark.parametrize( 1abcd
310 "path",
311 [
312 "/optional-alias-and-validation-alias",
313 "/model-optional-alias-and-validation-alias",
314 ],
315)
316def test_optional_alias_and_validation_alias_by_alias(path: str): 1abcd
317 client = TestClient(app) 1twz
318 client.cookies.set("p_alias", "hello") 1twz
319 response = client.get(path) 1twz
320 assert response.status_code == 200 1twz
321 assert response.json() == {"p": None} 1twz
324@pytest.mark.parametrize( 1abcd
325 "path",
326 [
327 "/optional-alias-and-validation-alias",
328 "/model-optional-alias-and-validation-alias",
329 ],
330)
331def test_optional_alias_and_validation_alias_by_validation_alias(path: str): 1abcd
332 client = TestClient(app) 1vyB
333 client.cookies.set("p_val_alias", "hello") 1vyB
334 response = client.get(path) 1vyB
335 assert response.status_code == 200 1vyB
336 assert response.json() == {"p": "hello"} 1vyB