Coverage for tests / test_validate_response.py: 100%
50 statements
« prev ^ index » next coverage.py v7.13.3, created at 2026-02-21 17:29 +0000
« prev ^ index » next coverage.py v7.13.3, created at 2026-02-21 17:29 +0000
1import pytest 1abcd
2from fastapi import FastAPI 1abcd
3from fastapi.exceptions import ResponseValidationError 1abcd
4from fastapi.testclient import TestClient 1abcd
5from pydantic import BaseModel 1abcd
7app = FastAPI() 1abcd
10class Item(BaseModel): 1abcd
11 name: str 1abcd
12 price: float | None = None 1abcd
13 owner_ids: list[int] | None = None 1abcd
16@app.get("/items/invalid", response_model=Item) 1abcd
17def get_invalid(): 1abcd
18 return {"name": "invalid", "price": "foo"} 1klm
21@app.get("/items/invalidnone", response_model=Item) 1abcd
22def get_invalid_none(): 1abcd
23 return None 1nop
26@app.get("/items/validnone", response_model=Item | None) 1abcd
27def get_valid_none(send_none: bool = False): 1abcd
28 if send_none: 1efghij
29 return None 1fhj
30 else:
31 return {"name": "invalid", "price": 3.2} 1egi
34@app.get("/items/innerinvalid", response_model=Item) 1abcd
35def get_innerinvalid(): 1abcd
36 return {"name": "double invalid", "price": "foo", "owner_ids": ["foo", "bar"]} 1qrs
39@app.get("/items/invalidlist", response_model=list[Item]) 1abcd
40def get_invalidlist(): 1abcd
41 return [ 1tuv
42 {"name": "foo"},
43 {"name": "bar", "price": "bar"},
44 {"name": "baz", "price": "baz"},
45 ]
48client = TestClient(app) 1abcd
51def test_invalid(): 1abcd
52 with pytest.raises(ResponseValidationError): 1klm
53 client.get("/items/invalid") 1klm
56def test_invalid_none(): 1abcd
57 with pytest.raises(ResponseValidationError): 1nop
58 client.get("/items/invalidnone") 1nop
61def test_valid_none_data(): 1abcd
62 response = client.get("/items/validnone") 1egi
63 data = response.json() 1egi
64 assert response.status_code == 200 1egi
65 assert data == {"name": "invalid", "price": 3.2, "owner_ids": None} 1egi
68def test_valid_none_none(): 1abcd
69 response = client.get("/items/validnone", params={"send_none": "true"}) 1fhj
70 data = response.json() 1fhj
71 assert response.status_code == 200 1fhj
72 assert data is None 1fhj
75def test_double_invalid(): 1abcd
76 with pytest.raises(ResponseValidationError): 1qrs
77 client.get("/items/innerinvalid") 1qrs
80def test_invalid_list(): 1abcd
81 with pytest.raises(ResponseValidationError): 1tuv
82 client.get("/items/invalidlist") 1tuv