Coverage for tests / test_tutorial / test_body_multiple_params / test_tutorial005.py: 100%
34 statements
« prev ^ index » next coverage.py v7.13.3, created at 2026-04-06 01:24 +0000
« prev ^ index » next coverage.py v7.13.3, created at 2026-04-06 01:24 +0000
1import importlib 1abcd
3import pytest 1abcd
4from fastapi.testclient import TestClient 1abcd
5from inline_snapshot import snapshot 1abcd
7from ...utils import needs_py310 1abcd
10@pytest.fixture( 1abcd
11 name="client",
12 params=[
13 pytest.param("tutorial005_py310", marks=needs_py310),
14 pytest.param("tutorial005_an_py310", marks=needs_py310),
15 ],
16)
17def get_client(request: pytest.FixtureRequest): 1abcd
18 mod = importlib.import_module(f"docs_src.body_multiple_params.{request.param}") 1efghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP
20 client = TestClient(mod.app) 1efghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP
21 return client 1efghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP
24def test_post_all(client: TestClient): 1abcd
25 response = client.put( 1QRSTUVWX
26 "/items/5",
27 json={
28 "item": {
29 "name": "Foo",
30 "price": 50.5,
31 "description": "Some Foo",
32 "tax": 0.1,
33 },
34 },
35 )
36 assert response.status_code == 200 1QRSTUVWX
37 assert response.json() == { 1QRSTUVWX
38 "item_id": 5,
39 "item": {
40 "name": "Foo",
41 "price": 50.5,
42 "description": "Some Foo",
43 "tax": 0.1,
44 },
45 }
48def test_post_required(client: TestClient): 1abcd
49 response = client.put( 1YZ01234
50 "/items/5",
51 json={
52 "item": {"name": "Foo", "price": 50.5},
53 },
54 )
55 assert response.status_code == 200 1YZ01234
56 assert response.json() == { 1YZ01234
57 "item_id": 5,
58 "item": {
59 "name": "Foo",
60 "price": 50.5,
61 "description": None,
62 "tax": None,
63 },
64 }
67def test_post_no_body(client: TestClient): 1abcd
68 response = client.put("/items/5", json=None) 156789!#$
69 assert response.status_code == 422 156789!#$
70 assert response.json() == { 156789!#$
71 "detail": [
72 {
73 "input": None,
74 "loc": [
75 "body",
76 "item",
77 ],
78 "msg": "Field required",
79 "type": "missing",
80 },
81 ],
82 }
85def test_post_like_not_embeded(client: TestClient): 1abcd
86 response = client.put( 1%'()*+,-
87 "/items/5",
88 json={
89 "name": "Foo",
90 "price": 50.5,
91 },
92 )
93 assert response.status_code == 422 1%'()*+,-
94 assert response.json() == { 1%'()*+,-
95 "detail": [
96 {
97 "input": None,
98 "loc": [
99 "body",
100 "item",
101 ],
102 "msg": "Field required",
103 "type": "missing",
104 },
105 ],
106 }
109def test_post_missing_required_field_in_item(client: TestClient): 1abcd
110 response = client.put( 1./:;=?@[
111 "/items/5", json={"item": {"name": "Foo"}, "user": {"username": "johndoe"}}
112 )
113 assert response.status_code == 422 1./:;=?@[
114 assert response.json() == { 1./:;=?@[
115 "detail": [
116 {
117 "input": {"name": "Foo"},
118 "loc": [
119 "body",
120 "item",
121 "price",
122 ],
123 "msg": "Field required",
124 "type": "missing",
125 },
126 ],
127 }
130def test_openapi_schema(client: TestClient): 1abcd
131 response = client.get("/openapi.json") 1]^_`{|}~
132 assert response.status_code == 200, response.text 1]^_`{|}~
133 assert response.json() == snapshot( 1]^_`{|}~
134 {
135 "info": {
136 "title": "FastAPI",
137 "version": "0.1.0",
138 },
139 "openapi": "3.1.0",
140 "paths": {
141 "/items/{item_id}": {
142 "put": {
143 "operationId": "update_item_items__item_id__put",
144 "parameters": [
145 {
146 "in": "path",
147 "name": "item_id",
148 "required": True,
149 "schema": {
150 "title": "Item Id",
151 "type": "integer",
152 },
153 },
154 ],
155 "requestBody": {
156 "content": {
157 "application/json": {
158 "schema": {
159 "$ref": "#/components/schemas/Body_update_item_items__item_id__put",
160 },
161 },
162 },
163 "required": True,
164 },
165 "responses": {
166 "200": {
167 "content": {
168 "application/json": {
169 "schema": {},
170 },
171 },
172 "description": "Successful Response",
173 },
174 "422": {
175 "content": {
176 "application/json": {
177 "schema": {
178 "$ref": "#/components/schemas/HTTPValidationError",
179 },
180 },
181 },
182 "description": "Validation Error",
183 },
184 },
185 "summary": "Update Item",
186 },
187 },
188 },
189 "components": {
190 "schemas": {
191 "Body_update_item_items__item_id__put": {
192 "properties": {
193 "item": {
194 "$ref": "#/components/schemas/Item",
195 },
196 },
197 "required": ["item"],
198 "title": "Body_update_item_items__item_id__put",
199 "type": "object",
200 },
201 "HTTPValidationError": {
202 "properties": {
203 "detail": {
204 "items": {
205 "$ref": "#/components/schemas/ValidationError",
206 },
207 "title": "Detail",
208 "type": "array",
209 },
210 },
211 "title": "HTTPValidationError",
212 "type": "object",
213 },
214 "Item": {
215 "properties": {
216 "name": {
217 "title": "Name",
218 "type": "string",
219 },
220 "description": {
221 "title": "Description",
222 "anyOf": [{"type": "string"}, {"type": "null"}],
223 },
224 "price": {"title": "Price", "type": "number"},
225 "tax": {
226 "title": "Tax",
227 "anyOf": [{"type": "number"}, {"type": "null"}],
228 },
229 },
230 "required": [
231 "name",
232 "price",
233 ],
234 "title": "Item",
235 "type": "object",
236 },
237 "ValidationError": {
238 "properties": {
239 "ctx": {"title": "Context", "type": "object"},
240 "input": {"title": "Input"},
241 "loc": {
242 "items": {
243 "anyOf": [
244 {
245 "type": "string",
246 },
247 {
248 "type": "integer",
249 },
250 ],
251 },
252 "title": "Location",
253 "type": "array",
254 },
255 "msg": {
256 "title": "Message",
257 "type": "string",
258 },
259 "type": {
260 "title": "Error Type",
261 "type": "string",
262 },
263 },
264 "required": [
265 "loc",
266 "msg",
267 "type",
268 ],
269 "title": "ValidationError",
270 "type": "object",
271 },
272 },
273 },
274 }
275 )