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

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

6 

7app = FastAPI() 1abcd

8 

9 

10class Item(BaseModel): 1abcd

11 name: str 1abcd

12 price: float | None = None 1abcd

13 owner_ids: list[int] | None = None 1abcd

14 

15 

16@app.get("/items/invalid", response_model=Item) 1abcd

17def get_invalid(): 1abcd

18 return {"name": "invalid", "price": "foo"} 1klm

19 

20 

21@app.get("/items/invalidnone", response_model=Item) 1abcd

22def get_invalid_none(): 1abcd

23 return None 1nop

24 

25 

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

32 

33 

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

37 

38 

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 ] 

46 

47 

48client = TestClient(app) 1abcd

49 

50 

51def test_invalid(): 1abcd

52 with pytest.raises(ResponseValidationError): 1klm

53 client.get("/items/invalid") 1klm

54 

55 

56def test_invalid_none(): 1abcd

57 with pytest.raises(ResponseValidationError): 1nop

58 client.get("/items/invalidnone") 1nop

59 

60 

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

66 

67 

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

73 

74 

75def test_double_invalid(): 1abcd

76 with pytest.raises(ResponseValidationError): 1qrs

77 client.get("/items/innerinvalid") 1qrs

78 

79 

80def test_invalid_list(): 1abcd

81 with pytest.raises(ResponseValidationError): 1tuv

82 client.get("/items/invalidlist") 1tuv