Coverage for tests/test_tutorial/test_body_multiple_params/test_tutorial001_py310.py: 100%

34 statements  

« prev     ^ index     » next       coverage.py v7.6.1, created at 2024-08-08 03:53 +0000

1import pytest 1deabc

2from dirty_equals import IsDict 1deabc

3from fastapi.testclient import TestClient 1deabc

4 

5from ...utils import needs_py310 1deabc

6 

7 

8@pytest.fixture(name="client") 1deabc

9def get_client(): 1deabc

10 from docs_src.body_multiple_params.tutorial001_py310 import app 1abc

11 

12 client = TestClient(app) 1abc

13 return client 1abc

14 

15 

16@needs_py310 1deabc

17def test_post_body_q_bar_content(client: TestClient): 1deabc

18 response = client.put("/items/5?q=bar", json={"name": "Foo", "price": 50.5}) 1abc

19 assert response.status_code == 200 1abc

20 assert response.json() == { 1abc

21 "item_id": 5, 

22 "item": { 

23 "name": "Foo", 

24 "price": 50.5, 

25 "description": None, 

26 "tax": None, 

27 }, 

28 "q": "bar", 

29 } 

30 

31 

32@needs_py310 1deabc

33def test_post_no_body_q_bar(client: TestClient): 1deabc

34 response = client.put("/items/5?q=bar", json=None) 1abc

35 assert response.status_code == 200 1abc

36 assert response.json() == {"item_id": 5, "q": "bar"} 1abc

37 

38 

39@needs_py310 1deabc

40def test_post_no_body(client: TestClient): 1deabc

41 response = client.put("/items/5", json=None) 1abc

42 assert response.status_code == 200 1abc

43 assert response.json() == {"item_id": 5} 1abc

44 

45 

46@needs_py310 1deabc

47def test_post_id_foo(client: TestClient): 1deabc

48 response = client.put("/items/foo", json=None) 1abc

49 assert response.status_code == 422 1abc

50 assert response.json() == IsDict( 1abc

51 { 

52 "detail": [ 

53 { 

54 "type": "int_parsing", 

55 "loc": ["path", "item_id"], 

56 "msg": "Input should be a valid integer, unable to parse string as an integer", 

57 "input": "foo", 

58 } 

59 ] 

60 } 

61 ) | IsDict( 

62 # TODO: remove when deprecating Pydantic v1 

63 { 

64 "detail": [ 

65 { 

66 "loc": ["path", "item_id"], 

67 "msg": "value is not a valid integer", 

68 "type": "type_error.integer", 

69 } 

70 ] 

71 } 

72 ) 

73 

74 

75@needs_py310 1deabc

76def test_openapi_schema(client: TestClient): 1deabc

77 response = client.get("/openapi.json") 1abc

78 assert response.status_code == 200, response.text 1abc

79 assert response.json() == { 1abc

80 "openapi": "3.1.0", 

81 "info": {"title": "FastAPI", "version": "0.1.0"}, 

82 "paths": { 

83 "/items/{item_id}": { 

84 "put": { 

85 "responses": { 

86 "200": { 

87 "description": "Successful Response", 

88 "content": {"application/json": {"schema": {}}}, 

89 }, 

90 "422": { 

91 "description": "Validation Error", 

92 "content": { 

93 "application/json": { 

94 "schema": { 

95 "$ref": "#/components/schemas/HTTPValidationError" 

96 } 

97 } 

98 }, 

99 }, 

100 }, 

101 "summary": "Update Item", 

102 "operationId": "update_item_items__item_id__put", 

103 "parameters": [ 

104 { 

105 "required": True, 

106 "schema": { 

107 "title": "The ID of the item to get", 

108 "maximum": 1000.0, 

109 "minimum": 0.0, 

110 "type": "integer", 

111 }, 

112 "name": "item_id", 

113 "in": "path", 

114 }, 

115 { 

116 "required": False, 

117 "schema": IsDict( 

118 { 

119 "anyOf": [{"type": "string"}, {"type": "null"}], 

120 "title": "Q", 

121 } 

122 ) 

123 | IsDict( 

124 # TODO: remove when deprecating Pydantic v1 

125 {"title": "Q", "type": "string"} 

126 ), 

127 "name": "q", 

128 "in": "query", 

129 }, 

130 ], 

131 "requestBody": { 

132 "content": { 

133 "application/json": { 

134 "schema": IsDict( 

135 { 

136 "anyOf": [ 

137 {"$ref": "#/components/schemas/Item"}, 

138 {"type": "null"}, 

139 ], 

140 "title": "Item", 

141 } 

142 ) 

143 | IsDict( 

144 # TODO: remove when deprecating Pydantic v1 

145 {"$ref": "#/components/schemas/Item"} 

146 ) 

147 } 

148 } 

149 }, 

150 } 

151 } 

152 }, 

153 "components": { 

154 "schemas": { 

155 "Item": { 

156 "title": "Item", 

157 "required": ["name", "price"], 

158 "type": "object", 

159 "properties": { 

160 "name": {"title": "Name", "type": "string"}, 

161 "description": IsDict( 

162 { 

163 "title": "Description", 

164 "anyOf": [{"type": "string"}, {"type": "null"}], 

165 } 

166 ) 

167 | IsDict( 

168 # TODO: remove when deprecating Pydantic v1 

169 {"title": "Description", "type": "string"} 

170 ), 

171 "price": {"title": "Price", "type": "number"}, 

172 "tax": IsDict( 

173 { 

174 "title": "Tax", 

175 "anyOf": [{"type": "number"}, {"type": "null"}], 

176 } 

177 ) 

178 | IsDict( 

179 # TODO: remove when deprecating Pydantic v1 

180 {"title": "Tax", "type": "number"} 

181 ), 

182 }, 

183 }, 

184 "ValidationError": { 

185 "title": "ValidationError", 

186 "required": ["loc", "msg", "type"], 

187 "type": "object", 

188 "properties": { 

189 "loc": { 

190 "title": "Location", 

191 "type": "array", 

192 "items": { 

193 "anyOf": [{"type": "string"}, {"type": "integer"}] 

194 }, 

195 }, 

196 "msg": {"title": "Message", "type": "string"}, 

197 "type": {"title": "Error Type", "type": "string"}, 

198 }, 

199 }, 

200 "HTTPValidationError": { 

201 "title": "HTTPValidationError", 

202 "type": "object", 

203 "properties": { 

204 "detail": { 

205 "title": "Detail", 

206 "type": "array", 

207 "items": {"$ref": "#/components/schemas/ValidationError"}, 

208 } 

209 }, 

210 }, 

211 } 

212 }, 

213 }