Coverage for tests / test_serialize_response_dataclass.py: 100%

62 statements  

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

1from dataclasses import dataclass 1abcd

2from datetime import datetime 1abcd

3from typing import Optional 1abcd

4 

5from fastapi import FastAPI 1abcd

6from fastapi.testclient import TestClient 1abcd

7 

8app = FastAPI() 1abcd

9 

10 

11@dataclass 1abcd

12class Item: 1abcd

13 name: str 1abcd

14 date: datetime 1abcd

15 price: Optional[float] = None 1abcd

16 owner_ids: Optional[list[int]] = None 1abcd

17 

18 

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

20def get_valid(): 1abcd

21 return {"name": "valid", "date": datetime(2021, 7, 26), "price": 1.0} 1efg

22 

23 

24@app.get("/items/object", response_model=Item) 1abcd

25def get_object(): 1abcd

26 return Item( 1hij

27 name="object", date=datetime(2021, 7, 26), price=1.0, owner_ids=[1, 2, 3] 

28 ) 

29 

30 

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

32def get_coerce(): 1abcd

33 return {"name": "coerce", "date": datetime(2021, 7, 26).isoformat(), "price": "1.0"} 1klm

34 

35 

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

37def get_validlist(): 1abcd

38 return [ 1nop

39 {"name": "foo", "date": datetime(2021, 7, 26)}, 

40 {"name": "bar", "date": datetime(2021, 7, 26), "price": 1.0}, 

41 { 

42 "name": "baz", 

43 "date": datetime(2021, 7, 26), 

44 "price": 2.0, 

45 "owner_ids": [1, 2, 3], 

46 }, 

47 ] 

48 

49 

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

51def get_objectlist(): 1abcd

52 return [ 1qrs

53 Item(name="foo", date=datetime(2021, 7, 26)), 

54 Item(name="bar", date=datetime(2021, 7, 26), price=1.0), 

55 Item(name="baz", date=datetime(2021, 7, 26), price=2.0, owner_ids=[1, 2, 3]), 

56 ] 

57 

58 

59@app.get("/items/no-response-model/object") 1abcd

60def get_no_response_model_object(): 1abcd

61 return Item( 1tuv

62 name="object", date=datetime(2021, 7, 26), price=1.0, owner_ids=[1, 2, 3] 

63 ) 

64 

65 

66@app.get("/items/no-response-model/objectlist") 1abcd

67def get_no_response_model_objectlist(): 1abcd

68 return [ 1wxy

69 Item(name="foo", date=datetime(2021, 7, 26)), 

70 Item(name="bar", date=datetime(2021, 7, 26), price=1.0), 

71 Item(name="baz", date=datetime(2021, 7, 26), price=2.0, owner_ids=[1, 2, 3]), 

72 ] 

73 

74 

75client = TestClient(app) 1abcd

76 

77 

78def test_valid(): 1abcd

79 response = client.get("/items/valid") 1efg

80 response.raise_for_status() 1efg

81 assert response.json() == { 1efg

82 "name": "valid", 

83 "date": datetime(2021, 7, 26).isoformat(), 

84 "price": 1.0, 

85 "owner_ids": None, 

86 } 

87 

88 

89def test_object(): 1abcd

90 response = client.get("/items/object") 1hij

91 response.raise_for_status() 1hij

92 assert response.json() == { 1hij

93 "name": "object", 

94 "date": datetime(2021, 7, 26).isoformat(), 

95 "price": 1.0, 

96 "owner_ids": [1, 2, 3], 

97 } 

98 

99 

100def test_coerce(): 1abcd

101 response = client.get("/items/coerce") 1klm

102 response.raise_for_status() 1klm

103 assert response.json() == { 1klm

104 "name": "coerce", 

105 "date": datetime(2021, 7, 26).isoformat(), 

106 "price": 1.0, 

107 "owner_ids": None, 

108 } 

109 

110 

111def test_validlist(): 1abcd

112 response = client.get("/items/validlist") 1nop

113 response.raise_for_status() 1nop

114 assert response.json() == [ 1nop

115 { 

116 "name": "foo", 

117 "date": datetime(2021, 7, 26).isoformat(), 

118 "price": None, 

119 "owner_ids": None, 

120 }, 

121 { 

122 "name": "bar", 

123 "date": datetime(2021, 7, 26).isoformat(), 

124 "price": 1.0, 

125 "owner_ids": None, 

126 }, 

127 { 

128 "name": "baz", 

129 "date": datetime(2021, 7, 26).isoformat(), 

130 "price": 2.0, 

131 "owner_ids": [1, 2, 3], 

132 }, 

133 ] 

134 

135 

136def test_objectlist(): 1abcd

137 response = client.get("/items/objectlist") 1qrs

138 response.raise_for_status() 1qrs

139 assert response.json() == [ 1qrs

140 { 

141 "name": "foo", 

142 "date": datetime(2021, 7, 26).isoformat(), 

143 "price": None, 

144 "owner_ids": None, 

145 }, 

146 { 

147 "name": "bar", 

148 "date": datetime(2021, 7, 26).isoformat(), 

149 "price": 1.0, 

150 "owner_ids": None, 

151 }, 

152 { 

153 "name": "baz", 

154 "date": datetime(2021, 7, 26).isoformat(), 

155 "price": 2.0, 

156 "owner_ids": [1, 2, 3], 

157 }, 

158 ] 

159 

160 

161def test_no_response_model_object(): 1abcd

162 response = client.get("/items/no-response-model/object") 1tuv

163 response.raise_for_status() 1tuv

164 assert response.json() == { 1tuv

165 "name": "object", 

166 "date": datetime(2021, 7, 26).isoformat(), 

167 "price": 1.0, 

168 "owner_ids": [1, 2, 3], 

169 } 

170 

171 

172def test_no_response_model_objectlist(): 1abcd

173 response = client.get("/items/no-response-model/objectlist") 1wxy

174 response.raise_for_status() 1wxy

175 assert response.json() == [ 1wxy

176 { 

177 "name": "foo", 

178 "date": datetime(2021, 7, 26).isoformat(), 

179 "price": None, 

180 "owner_ids": None, 

181 }, 

182 { 

183 "name": "bar", 

184 "date": datetime(2021, 7, 26).isoformat(), 

185 "price": 1.0, 

186 "owner_ids": None, 

187 }, 

188 { 

189 "name": "baz", 

190 "date": datetime(2021, 7, 26).isoformat(), 

191 "price": 2.0, 

192 "owner_ids": [1, 2, 3], 

193 }, 

194 ]