Coverage for tests/test_skip_defaults.py: 100%

50 statements  

« prev     ^ index     » next       coverage.py v7.6.1, created at 2025-05-05 00:03 +0000

1from typing import Optional 1abcdef

2 

3from fastapi import FastAPI 1abcdef

4from fastapi.testclient import TestClient 1abcdef

5from pydantic import BaseModel 1abcdef

6 

7app = FastAPI() 1abcdef

8 

9 

10class SubModel(BaseModel): 1abcdef

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

12 

13 

14class Model(BaseModel): 1abcdef

15 x: Optional[int] = None 1abcdef

16 sub: SubModel 1abcdef

17 

18 

19class ModelSubclass(Model): 1abcdef

20 y: int 1abcdef

21 z: int = 0 1abcdef

22 w: Optional[int] = None 1abcdef

23 

24 

25class ModelDefaults(BaseModel): 1abcdef

26 w: Optional[str] = None 1abcdef

27 x: Optional[str] = None 1abcdef

28 y: str = "y" 1abcdef

29 z: str = "z" 1abcdef

30 

31 

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

33def get_root() -> ModelSubclass: 1abcdef

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

35 

36 

37@app.get( 1abcdef

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

39) 

40def get_exclude_unset() -> ModelDefaults: 1abcdef

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

42 

43 

44@app.get( 1abcdef

45 "/exclude_defaults", 

46 response_model=ModelDefaults, 

47 response_model_exclude_defaults=True, 

48) 

49def get_exclude_defaults() -> ModelDefaults: 1abcdef

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

51 

52 

53@app.get( 1abcdef

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

55) 

56def get_exclude_none() -> ModelDefaults: 1abcdef

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

58 

59 

60@app.get( 1abcdef

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

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

68 

69 

70client = TestClient(app) 1abcdef

71 

72 

73def test_return_defaults(): 1abcdef

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

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

76 

77 

78def test_return_exclude_unset(): 1abcdef

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

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

81 

82 

83def test_return_exclude_defaults(): 1abcdef

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

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

86 

87 

88def test_return_exclude_none(): 1abcdef

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

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

91 

92 

93def test_return_exclude_unset_none(): 1abcdef

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

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