1
from typing import List, Optional, Union
4
from fastapi import FastAPI
5
from fastapi.exceptions import ResponseValidationError
6
from fastapi.testclient import TestClient
7
from pydantic import BaseModel
14
price: Optional[float] = None
15
owner_ids: Optional[List[int]] = None
18
@app.get("/items/invalid", response_model=Item)
20
return {"name": "invalid", "price": "foo"}
23
@app.get("/items/invalidnone", response_model=Item)
24
def get_invalid_none():
28
@app.get("/items/validnone", response_model=Union[Item, None])
29
def get_valid_none(send_none: bool = False):
33
return {"name": "invalid", "price": 3.2}
36
@app.get("/items/innerinvalid", response_model=Item)
37
def get_innerinvalid():
38
return {"name": "double invalid", "price": "foo", "owner_ids": ["foo", "bar"]}
41
@app.get("/items/invalidlist", response_model=List[Item])
45
{"name": "bar", "price": "bar"},
46
{"name": "baz", "price": "baz"},
50
client = TestClient(app)
54
with pytest.raises(ResponseValidationError):
55
client.get("/items/invalid")
58
def test_invalid_none():
59
with pytest.raises(ResponseValidationError):
60
client.get("/items/invalidnone")
63
def test_valid_none_data():
64
response = client.get("/items/validnone")
65
data = response.json()
66
assert response.status_code == 200
67
assert data == {"name": "invalid", "price": 3.2, "owner_ids": None}
70
def test_valid_none_none():
71
response = client.get("/items/validnone", params={"send_none": "true"})
72
data = response.json()
73
assert response.status_code == 200
77
def test_double_invalid():
78
with pytest.raises(ResponseValidationError):
79
client.get("/items/innerinvalid")
82
def test_invalid_list():
83
with pytest.raises(ResponseValidationError):
84
client.get("/items/invalidlist")