Coverage for tests / test_serialize_response_model.py: 100%

65 statements  

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

1from fastapi import FastAPI 1abcd

2from pydantic import BaseModel, Field 1abcd

3from starlette.testclient import TestClient 1abcd

4 

5app = FastAPI() 1abcd

6 

7 

8class Item(BaseModel): 1abcd

9 name: str = Field(alias="aliased_name") 1abcd

10 price: float | None = None 1abcd

11 owner_ids: list[int] | None = None 1abcd

12 

13 

14@app.get("/items/valid", response_model=Item) 1abcd

15def get_valid(): 1abcd

16 return Item(aliased_name="valid", price=1.0) 1efgh

17 

18 

19@app.get("/items/coerce", response_model=Item) 1abcd

20def get_coerce(): 1abcd

21 return Item(aliased_name="coerce", price="1.0") 1ijkl

22 

23 

24@app.get("/items/validlist", response_model=list[Item]) 1abcd

25def get_validlist(): 1abcd

26 return [ 1mnop

27 Item(aliased_name="foo"), 

28 Item(aliased_name="bar", price=1.0), 

29 Item(aliased_name="baz", price=2.0, owner_ids=[1, 2, 3]), 

30 ] 

31 

32 

33@app.get("/items/validdict", response_model=dict[str, Item]) 1abcd

34def get_validdict(): 1abcd

35 return { 1qrst

36 "k1": Item(aliased_name="foo"), 

37 "k2": Item(aliased_name="bar", price=1.0), 

38 "k3": Item(aliased_name="baz", price=2.0, owner_ids=[1, 2, 3]), 

39 } 

40 

41 

42@app.get( 1abcd

43 "/items/valid-exclude-unset", response_model=Item, response_model_exclude_unset=True 

44) 

45def get_valid_exclude_unset(): 1abcd

46 return Item(aliased_name="valid", price=1.0) 1uvwx

47 

48 

49@app.get( 1abcd

50 "/items/coerce-exclude-unset", 

51 response_model=Item, 

52 response_model_exclude_unset=True, 

53) 

54def get_coerce_exclude_unset(): 1abcd

55 return Item(aliased_name="coerce", price="1.0") 1yzAB

56 

57 

58@app.get( 1abcd

59 "/items/validlist-exclude-unset", 

60 response_model=list[Item], 

61 response_model_exclude_unset=True, 

62) 

63def get_validlist_exclude_unset(): 1abcd

64 return [ 1CDEF

65 Item(aliased_name="foo"), 

66 Item(aliased_name="bar", price=1.0), 

67 Item(aliased_name="baz", price=2.0, owner_ids=[1, 2, 3]), 

68 ] 

69 

70 

71@app.get( 1abcd

72 "/items/validdict-exclude-unset", 

73 response_model=dict[str, Item], 

74 response_model_exclude_unset=True, 

75) 

76def get_validdict_exclude_unset(): 1abcd

77 return { 1GHIJ

78 "k1": Item(aliased_name="foo"), 

79 "k2": Item(aliased_name="bar", price=1.0), 

80 "k3": Item(aliased_name="baz", price=2.0, owner_ids=[1, 2, 3]), 

81 } 

82 

83 

84client = TestClient(app) 1abcd

85 

86 

87def test_valid(): 1abcd

88 response = client.get("/items/valid") 1efgh

89 response.raise_for_status() 1efgh

90 assert response.json() == {"aliased_name": "valid", "price": 1.0, "owner_ids": None} 1efgh

91 

92 

93def test_coerce(): 1abcd

94 response = client.get("/items/coerce") 1ijkl

95 response.raise_for_status() 1ijkl

96 assert response.json() == { 1ijkl

97 "aliased_name": "coerce", 

98 "price": 1.0, 

99 "owner_ids": None, 

100 } 

101 

102 

103def test_validlist(): 1abcd

104 response = client.get("/items/validlist") 1mnop

105 response.raise_for_status() 1mnop

106 assert response.json() == [ 1mnop

107 {"aliased_name": "foo", "price": None, "owner_ids": None}, 

108 {"aliased_name": "bar", "price": 1.0, "owner_ids": None}, 

109 {"aliased_name": "baz", "price": 2.0, "owner_ids": [1, 2, 3]}, 

110 ] 

111 

112 

113def test_validdict(): 1abcd

114 response = client.get("/items/validdict") 1qrst

115 response.raise_for_status() 1qrst

116 assert response.json() == { 1qrst

117 "k1": {"aliased_name": "foo", "price": None, "owner_ids": None}, 

118 "k2": {"aliased_name": "bar", "price": 1.0, "owner_ids": None}, 

119 "k3": {"aliased_name": "baz", "price": 2.0, "owner_ids": [1, 2, 3]}, 

120 } 

121 

122 

123def test_valid_exclude_unset(): 1abcd

124 response = client.get("/items/valid-exclude-unset") 1uvwx

125 response.raise_for_status() 1uvwx

126 assert response.json() == {"aliased_name": "valid", "price": 1.0} 1uvwx

127 

128 

129def test_coerce_exclude_unset(): 1abcd

130 response = client.get("/items/coerce-exclude-unset") 1yzAB

131 response.raise_for_status() 1yzAB

132 assert response.json() == {"aliased_name": "coerce", "price": 1.0} 1yzAB

133 

134 

135def test_validlist_exclude_unset(): 1abcd

136 response = client.get("/items/validlist-exclude-unset") 1CDEF

137 response.raise_for_status() 1CDEF

138 assert response.json() == [ 1CDEF

139 {"aliased_name": "foo"}, 

140 {"aliased_name": "bar", "price": 1.0}, 

141 {"aliased_name": "baz", "price": 2.0, "owner_ids": [1, 2, 3]}, 

142 ] 

143 

144 

145def test_validdict_exclude_unset(): 1abcd

146 response = client.get("/items/validdict-exclude-unset") 1GHIJ

147 response.raise_for_status() 1GHIJ

148 assert response.json() == { 1GHIJ

149 "k1": {"aliased_name": "foo"}, 

150 "k2": {"aliased_name": "bar", "price": 1.0}, 

151 "k3": {"aliased_name": "baz", "price": 2.0, "owner_ids": [1, 2, 3]}, 

152 }