Coverage for tests / test_tutorial / test_path_operation_configurations / test_tutorial002.py: 100%
26 statements
« prev ^ index » next coverage.py v7.13.3, created at 2026-02-12 18:15 +0000
« prev ^ index » next coverage.py v7.13.3, created at 2026-02-12 18:15 +0000
1import importlib 1abdc
3import pytest 1abdc
4from dirty_equals import IsList 1abdc
5from fastapi.testclient import TestClient 1abdc
6from inline_snapshot import snapshot 1abdc
8from ...utils import needs_py310 1abdc
11@pytest.fixture( 1abdc
12 name="client",
13 params=[
14 pytest.param("tutorial002_py310", marks=needs_py310),
15 ],
16)
17def get_client(request: pytest.FixtureRequest) -> TestClient: 1abdc
18 mod = importlib.import_module( 1abc
19 f"docs_src.path_operation_configuration.{request.param}"
20 )
21 return TestClient(mod.app) 1abc
24def test_post_items(client: TestClient): 1abdc
25 response = client.post( 1efg
26 "/items/",
27 json={
28 "name": "Foo",
29 "description": "Item description",
30 "price": 42.0,
31 "tax": 3.2,
32 "tags": ["bar", "baz"],
33 },
34 )
35 assert response.status_code == 200, response.text 1efg
36 assert response.json() == { 1efg
37 "name": "Foo",
38 "description": "Item description",
39 "price": 42.0,
40 "tax": 3.2,
41 "tags": IsList("bar", "baz", check_order=False),
42 }
45def test_get_items(client: TestClient): 1abdc
46 response = client.get("/items/") 1hij
47 assert response.status_code == 200, response.text 1hij
48 assert response.json() == [{"name": "Foo", "price": 42}] 1hij
51def test_get_users(client: TestClient): 1abdc
52 response = client.get("/users/") 1klm
53 assert response.status_code == 200, response.text 1klm
54 assert response.json() == [{"username": "johndoe"}] 1klm
57def test_openapi_schema(client: TestClient): 1abdc
58 response = client.get("/openapi.json") 1nop
59 assert response.status_code == 200, response.text 1nop
60 assert response.json() == snapshot( 1nop
61 {
62 "openapi": "3.1.0",
63 "info": {"title": "FastAPI", "version": "0.1.0"},
64 "paths": {
65 "/items/": {
66 "get": {
67 "tags": ["items"],
68 "summary": "Read Items",
69 "operationId": "read_items_items__get",
70 "responses": {
71 "200": {
72 "description": "Successful Response",
73 "content": {"application/json": {"schema": {}}},
74 }
75 },
76 },
77 "post": {
78 "tags": ["items"],
79 "summary": "Create Item",
80 "operationId": "create_item_items__post",
81 "requestBody": {
82 "content": {
83 "application/json": {
84 "schema": {"$ref": "#/components/schemas/Item"}
85 }
86 },
87 "required": True,
88 },
89 "responses": {
90 "200": {
91 "description": "Successful Response",
92 "content": {
93 "application/json": {
94 "schema": {"$ref": "#/components/schemas/Item"}
95 }
96 },
97 },
98 "422": {
99 "description": "Validation Error",
100 "content": {
101 "application/json": {
102 "schema": {
103 "$ref": "#/components/schemas/HTTPValidationError"
104 }
105 }
106 },
107 },
108 },
109 },
110 },
111 "/users/": {
112 "get": {
113 "tags": ["users"],
114 "summary": "Read Users",
115 "operationId": "read_users_users__get",
116 "responses": {
117 "200": {
118 "description": "Successful Response",
119 "content": {"application/json": {"schema": {}}},
120 }
121 },
122 }
123 },
124 },
125 "components": {
126 "schemas": {
127 "HTTPValidationError": {
128 "properties": {
129 "detail": {
130 "items": {
131 "$ref": "#/components/schemas/ValidationError",
132 },
133 "title": "Detail",
134 "type": "array",
135 },
136 },
137 "title": "HTTPValidationError",
138 "type": "object",
139 },
140 "Item": {
141 "properties": {
142 "description": {
143 "anyOf": [
144 {
145 "type": "string",
146 },
147 {
148 "type": "null",
149 },
150 ],
151 "title": "Description",
152 },
153 "name": {
154 "title": "Name",
155 "type": "string",
156 },
157 "price": {
158 "title": "Price",
159 "type": "number",
160 },
161 "tags": {
162 "default": [],
163 "items": {
164 "type": "string",
165 },
166 "title": "Tags",
167 "type": "array",
168 "uniqueItems": True,
169 },
170 "tax": {
171 "anyOf": [
172 {
173 "type": "number",
174 },
175 {
176 "type": "null",
177 },
178 ],
179 "title": "Tax",
180 },
181 },
182 "required": [
183 "name",
184 "price",
185 ],
186 "title": "Item",
187 "type": "object",
188 },
189 "ValidationError": {
190 "properties": {
191 "ctx": {"title": "Context", "type": "object"},
192 "input": {"title": "Input"},
193 "loc": {
194 "items": {
195 "anyOf": [
196 {
197 "type": "string",
198 },
199 {
200 "type": "integer",
201 },
202 ],
203 },
204 "title": "Location",
205 "type": "array",
206 },
207 "msg": {
208 "title": "Message",
209 "type": "string",
210 },
211 "type": {
212 "title": "Error Type",
213 "type": "string",
214 },
215 },
216 "required": [
217 "loc",
218 "msg",
219 "type",
220 ],
221 "title": "ValidationError",
222 "type": "object",
223 },
224 },
225 },
226 }
227 )