Coverage for tests / test_serialize_response_dataclass.py: 100%

61 statements  

« prev     ^ index     » next       coverage.py v7.13.3, created at 2026-02-21 17:29 +0000

1from dataclasses import dataclass 1abcd

2from datetime import datetime 1abcd

3 

4from fastapi import FastAPI 1abcd

5from fastapi.testclient import TestClient 1abcd

6 

7app = FastAPI() 1abcd

8 

9 

10@dataclass 1abcd

11class Item: 1abcd

12 name: str 1abcd

13 date: datetime 1abcd

14 price: float | None = None 1abcd

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

16 

17 

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

19def get_valid(): 1abcd

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

21 

22 

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

24def get_object(): 1abcd

25 return Item( 1hij

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

27 ) 

28 

29 

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

31def get_coerce(): 1abcd

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

33 

34 

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

36def get_validlist(): 1abcd

37 return [ 1nop

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

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

40 { 

41 "name": "baz", 

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

43 "price": 2.0, 

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

45 }, 

46 ] 

47 

48 

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

50def get_objectlist(): 1abcd

51 return [ 1qrs

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

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

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

55 ] 

56 

57 

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

59def get_no_response_model_object(): 1abcd

60 return Item( 1tuv

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

62 ) 

63 

64 

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

66def get_no_response_model_objectlist(): 1abcd

67 return [ 1wxy

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

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

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

71 ] 

72 

73 

74client = TestClient(app) 1abcd

75 

76 

77def test_valid(): 1abcd

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

79 response.raise_for_status() 1efg

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

81 "name": "valid", 

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

83 "price": 1.0, 

84 "owner_ids": None, 

85 } 

86 

87 

88def test_object(): 1abcd

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

90 response.raise_for_status() 1hij

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

92 "name": "object", 

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

94 "price": 1.0, 

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

96 } 

97 

98 

99def test_coerce(): 1abcd

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

101 response.raise_for_status() 1klm

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

103 "name": "coerce", 

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

105 "price": 1.0, 

106 "owner_ids": None, 

107 } 

108 

109 

110def test_validlist(): 1abcd

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

112 response.raise_for_status() 1nop

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

114 { 

115 "name": "foo", 

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

117 "price": None, 

118 "owner_ids": None, 

119 }, 

120 { 

121 "name": "bar", 

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

123 "price": 1.0, 

124 "owner_ids": None, 

125 }, 

126 { 

127 "name": "baz", 

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

129 "price": 2.0, 

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

131 }, 

132 ] 

133 

134 

135def test_objectlist(): 1abcd

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

137 response.raise_for_status() 1qrs

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

139 { 

140 "name": "foo", 

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

142 "price": None, 

143 "owner_ids": None, 

144 }, 

145 { 

146 "name": "bar", 

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

148 "price": 1.0, 

149 "owner_ids": None, 

150 }, 

151 { 

152 "name": "baz", 

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

154 "price": 2.0, 

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

156 }, 

157 ] 

158 

159 

160def test_no_response_model_object(): 1abcd

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

162 response.raise_for_status() 1tuv

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

164 "name": "object", 

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

166 "price": 1.0, 

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

168 } 

169 

170 

171def test_no_response_model_objectlist(): 1abcd

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

173 response.raise_for_status() 1wxy

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

175 { 

176 "name": "foo", 

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

178 "price": None, 

179 "owner_ids": None, 

180 }, 

181 { 

182 "name": "bar", 

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

184 "price": 1.0, 

185 "owner_ids": None, 

186 }, 

187 { 

188 "name": "baz", 

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

190 "price": 2.0, 

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

192 }, 

193 ]