Coverage for tests / test_serialize_response_dataclass.py: 100%

61 statements  

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

1from dataclasses import dataclass 1adbc

2from datetime import datetime 1adbc

3 

4from fastapi import FastAPI 1adbc

5from fastapi.testclient import TestClient 1adbc

6 

7app = FastAPI() 1adbc

8 

9 

10@dataclass 1adbc

11class Item: 1adbc

12 name: str 1abc

13 date: datetime 1abc

14 price: float | None = None 1adbc

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

16 

17 

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

19def get_valid(): 1adbc

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

21 

22 

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

24def get_object(): 1adbc

25 return Item( 1ijkl

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

31def get_coerce(): 1adbc

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

33 

34 

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

36def get_validlist(): 1adbc

37 return [ 1qrst

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

50def get_objectlist(): 1adbc

51 return [ 1uvwx

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

59def get_no_response_model_object(): 1adbc

60 return Item( 1yzAB

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

66def get_no_response_model_objectlist(): 1adbc

67 return [ 1CDEF

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

75 

76 

77def test_valid(): 1adbc

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

79 response.raise_for_status() 1efgh

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

81 "name": "valid", 

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

83 "price": 1.0, 

84 "owner_ids": None, 

85 } 

86 

87 

88def test_object(): 1adbc

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

90 response.raise_for_status() 1ijkl

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

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

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

101 response.raise_for_status() 1mnop

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

103 "name": "coerce", 

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

105 "price": 1.0, 

106 "owner_ids": None, 

107 } 

108 

109 

110def test_validlist(): 1adbc

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

112 response.raise_for_status() 1qrst

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

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

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

137 response.raise_for_status() 1uvwx

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

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

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

162 response.raise_for_status() 1yzAB

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

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

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

173 response.raise_for_status() 1CDEF

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

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 ]