Coverage for tests / test_validate_response.py: 100%

50 statements  

« prev     ^ index     » next       coverage.py v7.13.3, created at 2026-04-06 01:24 +0000

1import pytest 1adbc

2from fastapi import FastAPI 1adbc

3from fastapi.exceptions import ResponseValidationError 1adbc

4from fastapi.testclient import TestClient 1adbc

5from pydantic import BaseModel 1adbc

6 

7app = FastAPI() 1adbc

8 

9 

10class Item(BaseModel): 1adbc

11 name: str 1abc

12 price: float | None = None 1adbc

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

14 

15 

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

17def get_invalid(): 1adbc

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

19 

20 

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

22def get_invalid_none(): 1adbc

23 return None 1qrst

24 

25 

26@app.get("/items/validnone", response_model=Item | None) 1adbc

27def get_valid_none(send_none: bool = False): 1adbc

28 if send_none: 1efghijk

29 return None 1flik

30 else: 

31 return {"name": "invalid", "price": 3.2} 1eghj

32 

33 

34@app.get("/items/innerinvalid", response_model=Item) 1adbc

35def get_innerinvalid(): 1adbc

36 return {"name": "double invalid", "price": "foo", "owner_ids": ["foo", "bar"]} 1uvwx

37 

38 

39@app.get("/items/invalidlist", response_model=list[Item]) 1adbc

40def get_invalidlist(): 1adbc

41 return [ 1yzAB

42 {"name": "foo"}, 

43 {"name": "bar", "price": "bar"}, 

44 {"name": "baz", "price": "baz"}, 

45 ] 

46 

47 

48client = TestClient(app) 1adbc

49 

50 

51def test_invalid(): 1adbc

52 with pytest.raises(ResponseValidationError): 1mnop

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

54 

55 

56def test_invalid_none(): 1adbc

57 with pytest.raises(ResponseValidationError): 1qrst

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

59 

60 

61def test_valid_none_data(): 1adbc

62 response = client.get("/items/validnone") 1eghj

63 data = response.json() 1eghj

64 assert response.status_code == 200 1eghj

65 assert data == {"name": "invalid", "price": 3.2, "owner_ids": None} 1eghj

66 

67 

68def test_valid_none_none(): 1adbc

69 response = client.get("/items/validnone", params={"send_none": "true"}) 1flik

70 data = response.json() 1flik

71 assert response.status_code == 200 1flik

72 assert data is None 1flik

73 

74 

75def test_double_invalid(): 1adbc

76 with pytest.raises(ResponseValidationError): 1uvwx

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

78 

79 

80def test_invalid_list(): 1adbc

81 with pytest.raises(ResponseValidationError): 1yzAB

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