Coverage for tests/test_validate_response.py: 100%
51 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 List, Optional, Union 1abcdef
3import pytest 1abcdef
4from fastapi import FastAPI 1abcdef
5from fastapi.exceptions import ResponseValidationError 1abcdef
6from fastapi.testclient import TestClient 1abcdef
7from pydantic import BaseModel 1abcdef
9app = FastAPI() 1abcdef
12class Item(BaseModel): 1abcdef
13 name: str 1abcdef
14 price: Optional[float] = None 1abcdef
15 owner_ids: Optional[List[int]] = None 1abcdef
18@app.get("/items/invalid", response_model=Item) 1abcdef
19def get_invalid(): 1abcdef
20 return {"name": "invalid", "price": "foo"} 1stuvwx
23@app.get("/items/invalidnone", response_model=Item) 1abcdef
24def get_invalid_none(): 1abcdef
25 return None 1yzABCD
28@app.get("/items/validnone", response_model=Union[Item, None]) 1abcdef
29def get_valid_none(send_none: bool = False): 1abcdef
30 if send_none: 1ghijklmnopqr
31 return None 1hjlnpr
32 else:
33 return {"name": "invalid", "price": 3.2} 1gikmoq
36@app.get("/items/innerinvalid", response_model=Item) 1abcdef
37def get_innerinvalid(): 1abcdef
38 return {"name": "double invalid", "price": "foo", "owner_ids": ["foo", "bar"]} 1EFGHIJ
41@app.get("/items/invalidlist", response_model=List[Item]) 1abcdef
42def get_invalidlist(): 1abcdef
43 return [ 1KLMNOP
44 {"name": "foo"},
45 {"name": "bar", "price": "bar"},
46 {"name": "baz", "price": "baz"},
47 ]
50client = TestClient(app) 1abcdef
53def test_invalid(): 1abcdef
54 with pytest.raises(ResponseValidationError): 1stuvwx
55 client.get("/items/invalid") 1stuvwx
58def test_invalid_none(): 1abcdef
59 with pytest.raises(ResponseValidationError): 1yzABCD
60 client.get("/items/invalidnone") 1yzABCD
63def test_valid_none_data(): 1abcdef
64 response = client.get("/items/validnone") 1gikmoq
65 data = response.json() 1gikmoq
66 assert response.status_code == 200 1gikmoq
67 assert data == {"name": "invalid", "price": 3.2, "owner_ids": None} 1gikmoq
70def test_valid_none_none(): 1abcdef
71 response = client.get("/items/validnone", params={"send_none": "true"}) 1hjlnpr
72 data = response.json() 1hjlnpr
73 assert response.status_code == 200 1hjlnpr
74 assert data is None 1hjlnpr
77def test_double_invalid(): 1abcdef
78 with pytest.raises(ResponseValidationError): 1EFGHIJ
79 client.get("/items/innerinvalid") 1EFGHIJ
82def test_invalid_list(): 1abcdef
83 with pytest.raises(ResponseValidationError): 1KLMNOP
84 client.get("/items/invalidlist") 1KLMNOP