Coverage for tests/test_tutorial/test_body_fields/test_tutorial001_an_py39.py: 100%
29 statements
« prev ^ index » next coverage.py v7.6.1, created at 2024-08-08 03:53 +0000
« prev ^ index » next coverage.py v7.6.1, created at 2024-08-08 03:53 +0000
1import pytest 1eabcd
2from dirty_equals import IsDict 1eabcd
3from fastapi.testclient import TestClient 1eabcd
5from ...utils import needs_py39 1eabcd
8@pytest.fixture(name="client") 1eabcd
9def get_client(): 1eabcd
10 from docs_src.body_fields.tutorial001_an_py39 import app 1abcd
12 client = TestClient(app) 1abcd
13 return client 1abcd
16@needs_py39 1eabcd
17def test_items_5(client: TestClient): 1eabcd
18 response = client.put("/items/5", json={"item": {"name": "Foo", "price": 3.0}}) 1abcd
19 assert response.status_code == 200 1abcd
20 assert response.json() == { 1abcd
21 "item_id": 5,
22 "item": {"name": "Foo", "price": 3.0, "description": None, "tax": None},
23 }
26@needs_py39 1eabcd
27def test_items_6(client: TestClient): 1eabcd
28 response = client.put( 1abcd
29 "/items/6",
30 json={
31 "item": {
32 "name": "Bar",
33 "price": 0.2,
34 "description": "Some bar",
35 "tax": "5.4",
36 }
37 },
38 )
39 assert response.status_code == 200 1abcd
40 assert response.json() == { 1abcd
41 "item_id": 6,
42 "item": {
43 "name": "Bar",
44 "price": 0.2,
45 "description": "Some bar",
46 "tax": 5.4,
47 },
48 }
51@needs_py39 1eabcd
52def test_invalid_price(client: TestClient): 1eabcd
53 response = client.put("/items/5", json={"item": {"name": "Foo", "price": -3.0}}) 1abcd
54 assert response.status_code == 422 1abcd
55 assert response.json() == IsDict( 1abcd
56 {
57 "detail": [
58 {
59 "type": "greater_than",
60 "loc": ["body", "item", "price"],
61 "msg": "Input should be greater than 0",
62 "input": -3.0,
63 "ctx": {"gt": 0.0},
64 }
65 ]
66 }
67 ) | IsDict(
68 # TODO: remove when deprecating Pydantic v1
69 {
70 "detail": [
71 {
72 "ctx": {"limit_value": 0},
73 "loc": ["body", "item", "price"],
74 "msg": "ensure this value is greater than 0",
75 "type": "value_error.number.not_gt",
76 }
77 ]
78 }
79 )
82@needs_py39 1eabcd
83def test_openapi_schema(client: TestClient): 1eabcd
84 response = client.get("/openapi.json") 1abcd
85 assert response.status_code == 200, response.text 1abcd
86 assert response.json() == { 1abcd
87 "openapi": "3.1.0",
88 "info": {"title": "FastAPI", "version": "0.1.0"},
89 "paths": {
90 "/items/{item_id}": {
91 "put": {
92 "responses": {
93 "200": {
94 "description": "Successful Response",
95 "content": {"application/json": {"schema": {}}},
96 },
97 "422": {
98 "description": "Validation Error",
99 "content": {
100 "application/json": {
101 "schema": {
102 "$ref": "#/components/schemas/HTTPValidationError"
103 }
104 }
105 },
106 },
107 },
108 "summary": "Update Item",
109 "operationId": "update_item_items__item_id__put",
110 "parameters": [
111 {
112 "required": True,
113 "schema": {"title": "Item Id", "type": "integer"},
114 "name": "item_id",
115 "in": "path",
116 }
117 ],
118 "requestBody": {
119 "content": {
120 "application/json": {
121 "schema": {
122 "$ref": "#/components/schemas/Body_update_item_items__item_id__put"
123 }
124 }
125 },
126 "required": True,
127 },
128 }
129 }
130 },
131 "components": {
132 "schemas": {
133 "Item": {
134 "title": "Item",
135 "required": ["name", "price"],
136 "type": "object",
137 "properties": {
138 "name": {"title": "Name", "type": "string"},
139 "description": IsDict(
140 {
141 "title": "The description of the item",
142 "anyOf": [
143 {"maxLength": 300, "type": "string"},
144 {"type": "null"},
145 ],
146 }
147 )
148 | IsDict(
149 # TODO: remove when deprecating Pydantic v1
150 {
151 "title": "The description of the item",
152 "maxLength": 300,
153 "type": "string",
154 }
155 ),
156 "price": {
157 "title": "Price",
158 "exclusiveMinimum": 0.0,
159 "type": "number",
160 "description": "The price must be greater than zero",
161 },
162 "tax": IsDict(
163 {
164 "title": "Tax",
165 "anyOf": [{"type": "number"}, {"type": "null"}],
166 }
167 )
168 | IsDict(
169 # TODO: remove when deprecating Pydantic v1
170 {"title": "Tax", "type": "number"}
171 ),
172 },
173 },
174 "Body_update_item_items__item_id__put": {
175 "title": "Body_update_item_items__item_id__put",
176 "required": ["item"],
177 "type": "object",
178 "properties": {"item": {"$ref": "#/components/schemas/Item"}},
179 },
180 "ValidationError": {
181 "title": "ValidationError",
182 "required": ["loc", "msg", "type"],
183 "type": "object",
184 "properties": {
185 "loc": {
186 "title": "Location",
187 "type": "array",
188 "items": {
189 "anyOf": [{"type": "string"}, {"type": "integer"}]
190 },
191 },
192 "msg": {"title": "Message", "type": "string"},
193 "type": {"title": "Error Type", "type": "string"},
194 },
195 },
196 "HTTPValidationError": {
197 "title": "HTTPValidationError",
198 "type": "object",
199 "properties": {
200 "detail": {
201 "title": "Detail",
202 "type": "array",
203 "items": {"$ref": "#/components/schemas/ValidationError"},
204 }
205 },
206 },
207 }
208 },
209 }