Coverage for tests/test_serialize_response_dataclass.py: 100%

62 statements  

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

1from dataclasses import dataclass 1abcdef

2from datetime import datetime 1abcdef

3from typing import List, Optional 1abcdef

4 

5from fastapi import FastAPI 1abcdef

6from fastapi.testclient import TestClient 1abcdef

7 

8app = FastAPI() 1abcdef

9 

10 

11@dataclass 1abcdef

12class Item: 1abcdef

13 name: str 1abcdef

14 date: datetime 1abcdef

15 price: Optional[float] = None 1abcdef

16 owner_ids: Optional[List[int]] = None 1abcdef

17 

18 

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

20def get_valid(): 1abcdef

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

22 

23 

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

25def get_object(): 1abcdef

26 return Item( 1mnopqr

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

32def get_coerce(): 1abcdef

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

34 

35 

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

37def get_validlist(): 1abcdef

38 return [ 1yzABCD

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]) 1abcdef

51def get_objectlist(): 1abcdef

52 return [ 1EFGHIJ

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") 1abcdef

60def get_no_response_model_object(): 1abcdef

61 return Item( 1KLMNOP

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") 1abcdef

67def get_no_response_model_objectlist(): 1abcdef

68 return [ 1QRSTUV

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

76 

77 

78def test_valid(): 1abcdef

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

80 response.raise_for_status() 1ghijkl

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

82 "name": "valid", 

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

84 "price": 1.0, 

85 "owner_ids": None, 

86 } 

87 

88 

89def test_object(): 1abcdef

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

91 response.raise_for_status() 1mnopqr

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

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

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

102 response.raise_for_status() 1stuvwx

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

104 "name": "coerce", 

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

106 "price": 1.0, 

107 "owner_ids": None, 

108 } 

109 

110 

111def test_validlist(): 1abcdef

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

113 response.raise_for_status() 1yzABCD

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

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

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

138 response.raise_for_status() 1EFGHIJ

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

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

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

163 response.raise_for_status() 1KLMNOP

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

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

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

174 response.raise_for_status() 1QRSTUV

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

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 ]