Coverage for tests / test_skip_defaults.py: 100%

50 statements  

« prev     ^ index     » next       coverage.py v7.13.3, created at 2026-02-12 18:15 +0000

1from typing import Optional 1abcd

2 

3from fastapi import FastAPI 1abcd

4from fastapi.testclient import TestClient 1abcd

5from pydantic import BaseModel 1abcd

6 

7app = FastAPI() 1abcd

8 

9 

10class SubModel(BaseModel): 1abcd

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

12 

13 

14class Model(BaseModel): 1abcd

15 x: Optional[int] = None 1abcd

16 sub: SubModel 1abcd

17 

18 

19class ModelSubclass(Model): 1abcd

20 y: int 1abcd

21 z: int = 0 1abcd

22 w: Optional[int] = None 1abcd

23 

24 

25class ModelDefaults(BaseModel): 1abcd

26 w: Optional[str] = None 1abcd

27 x: Optional[str] = None 1abcd

28 y: str = "y" 1abcd

29 z: str = "z" 1abcd

30 

31 

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

33def get_root() -> ModelSubclass: 1abcd

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

35 

36 

37@app.get( 1abcd

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

39) 

40def get_exclude_unset() -> ModelDefaults: 1abcd

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

42 

43 

44@app.get( 1abcd

45 "/exclude_defaults", 

46 response_model=ModelDefaults, 

47 response_model_exclude_defaults=True, 

48) 

49def get_exclude_defaults() -> ModelDefaults: 1abcd

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

51 

52 

53@app.get( 1abcd

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

55) 

56def get_exclude_none() -> ModelDefaults: 1abcd

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

58 

59 

60@app.get( 1abcd

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: 1abcd

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

68 

69 

70client = TestClient(app) 1abcd

71 

72 

73def test_return_defaults(): 1abcd

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

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

76 

77 

78def test_return_exclude_unset(): 1abcd

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

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

81 

82 

83def test_return_exclude_defaults(): 1abcd

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

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

86 

87 

88def test_return_exclude_none(): 1abcd

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

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

91 

92 

93def test_return_exclude_unset_none(): 1abcd

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

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