Coverage for tests/test_skip_defaults.py: 100%

50 statements  

« prev     ^ index     » next       coverage.py v7.6.1, created at 2025-12-04 08:29 +0000

1from typing import Optional 1abcdefg

2 

3from fastapi import FastAPI 1abcdefg

4from fastapi.testclient import TestClient 1abcdefg

5from pydantic import BaseModel 1abcdefg

6 

7app = FastAPI() 1abcdefg

8 

9 

10class SubModel(BaseModel): 1abcdefg

11 a: Optional[str] = "foo" 1abcdefg

12 

13 

14class Model(BaseModel): 1abcdefg

15 x: Optional[int] = None 1abcdefg

16 sub: SubModel 1abcdefg

17 

18 

19class ModelSubclass(Model): 1abcdefg

20 y: int 1abcdefg

21 z: int = 0 1abcdefg

22 w: Optional[int] = None 1abcdefg

23 

24 

25class ModelDefaults(BaseModel): 1abcdefg

26 w: Optional[str] = None 1abcdefg

27 x: Optional[str] = None 1abcdefg

28 y: str = "y" 1abcdefg

29 z: str = "z" 1abcdefg

30 

31 

32@app.get("/", response_model=Model, response_model_exclude_unset=True) 1abcdefg

33def get_root() -> ModelSubclass: 1abcdefg

34 return ModelSubclass(sub={}, y=1, z=0) 1hijklmn

35 

36 

37@app.get( 1abcdefg

38 "/exclude_unset", response_model=ModelDefaults, response_model_exclude_unset=True 

39) 

40def get_exclude_unset() -> ModelDefaults: 1abcdefg

41 return ModelDefaults(x=None, y="y") 1opqrstu

42 

43 

44@app.get( 1abcdefg

45 "/exclude_defaults", 

46 response_model=ModelDefaults, 

47 response_model_exclude_defaults=True, 

48) 

49def get_exclude_defaults() -> ModelDefaults: 1abcdefg

50 return ModelDefaults(x=None, y="y") 1vwxyzAB

51 

52 

53@app.get( 1abcdefg

54 "/exclude_none", response_model=ModelDefaults, response_model_exclude_none=True 

55) 

56def get_exclude_none() -> ModelDefaults: 1abcdefg

57 return ModelDefaults(x=None, y="y") 1CDEFGHI

58 

59 

60@app.get( 1abcdefg

61 "/exclude_unset_none", 

62 response_model=ModelDefaults, 

63 response_model_exclude_unset=True, 

64 response_model_exclude_none=True, 

65) 

66def get_exclude_unset_none() -> ModelDefaults: 1abcdefg

67 return ModelDefaults(x=None, y="y") 1JKLMNOP

68 

69 

70client = TestClient(app) 1abcdefg

71 

72 

73def test_return_defaults(): 1abcdefg

74 response = client.get("/") 1hijklmn

75 assert response.json() == {"sub": {}} 1hijklmn

76 

77 

78def test_return_exclude_unset(): 1abcdefg

79 response = client.get("/exclude_unset") 1opqrstu

80 assert response.json() == {"x": None, "y": "y"} 1opqrstu

81 

82 

83def test_return_exclude_defaults(): 1abcdefg

84 response = client.get("/exclude_defaults") 1vwxyzAB

85 assert response.json() == {} 1vwxyzAB

86 

87 

88def test_return_exclude_none(): 1abcdefg

89 response = client.get("/exclude_none") 1CDEFGHI

90 assert response.json() == {"y": "y", "z": "z"} 1CDEFGHI

91 

92 

93def test_return_exclude_unset_none(): 1abcdefg

94 response = client.get("/exclude_unset_none") 1JKLMNOP

95 assert response.json() == {"y": "y"} 1JKLMNOP