Coverage for tests / test_skip_defaults.py: 100%

49 statements  

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

1from fastapi import FastAPI 1adbc

2from fastapi.testclient import TestClient 1adbc

3from pydantic import BaseModel 1adbc

4 

5app = FastAPI() 1adbc

6 

7 

8class SubModel(BaseModel): 1adbc

9 a: str | None = "foo" 1adbc

10 

11 

12class Model(BaseModel): 1adbc

13 x: int | None = None 1adbc

14 sub: SubModel 1abc

15 

16 

17class ModelSubclass(Model): 1adbc

18 y: int 1abc

19 z: int = 0 1adbc

20 w: int | None = None 1adbc

21 

22 

23class ModelDefaults(BaseModel): 1adbc

24 w: str | None = None 1adbc

25 x: str | None = None 1adbc

26 y: str = "y" 1adbc

27 z: str = "z" 1adbc

28 

29 

30@app.get("/", response_model=Model, response_model_exclude_unset=True) 1adbc

31def get_root() -> ModelSubclass: 1adbc

32 return ModelSubclass(sub={}, y=1, z=0) 1efgh

33 

34 

35@app.get( 1adbc

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

37) 

38def get_exclude_unset() -> ModelDefaults: 1adbc

39 return ModelDefaults(x=None, y="y") 1ijkl

40 

41 

42@app.get( 1adbc

43 "/exclude_defaults", 

44 response_model=ModelDefaults, 

45 response_model_exclude_defaults=True, 

46) 

47def get_exclude_defaults() -> ModelDefaults: 1adbc

48 return ModelDefaults(x=None, y="y") 1mnop

49 

50 

51@app.get( 1adbc

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

53) 

54def get_exclude_none() -> ModelDefaults: 1adbc

55 return ModelDefaults(x=None, y="y") 1qrst

56 

57 

58@app.get( 1adbc

59 "/exclude_unset_none", 

60 response_model=ModelDefaults, 

61 response_model_exclude_unset=True, 

62 response_model_exclude_none=True, 

63) 

64def get_exclude_unset_none() -> ModelDefaults: 1adbc

65 return ModelDefaults(x=None, y="y") 1uvwx

66 

67 

68client = TestClient(app) 1adbc

69 

70 

71def test_return_defaults(): 1adbc

72 response = client.get("/") 1efgh

73 assert response.json() == {"sub": {}} 1efgh

74 

75 

76def test_return_exclude_unset(): 1adbc

77 response = client.get("/exclude_unset") 1ijkl

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

79 

80 

81def test_return_exclude_defaults(): 1adbc

82 response = client.get("/exclude_defaults") 1mnop

83 assert response.json() == {} 1mnop

84 

85 

86def test_return_exclude_none(): 1adbc

87 response = client.get("/exclude_none") 1qrst

88 assert response.json() == {"y": "y", "z": "z"} 1qrst

89 

90 

91def test_return_exclude_unset_none(): 1adbc

92 response = client.get("/exclude_unset_none") 1uvwx

93 assert response.json() == {"y": "y"} 1uvwx