]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
⬆ Upgrade Starlette to `0.21.0`, including the new [`TestClient` based on HTTPX]...
authorPaweł Rubin <pawelrubin19@gmail.com>
Sun, 13 Nov 2022 14:26:09 +0000 (15:26 +0100)
committerGitHub <noreply@github.com>
Sun, 13 Nov 2022 14:26:09 +0000 (15:26 +0100)
Co-authored-by: Paweł Rubin <pawel.rubin@ocado.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
26 files changed:
fastapi/security/api_key.py
fastapi/security/http.py
fastapi/security/oauth2.py
fastapi/security/open_id_connect_url.py
fastapi/security/utils.py
pyproject.toml
tests/test_enforce_once_required_parameter.py
tests/test_extra_routes.py
tests/test_get_request_body.py
tests/test_param_include_in_schema.py
tests/test_security_api_key_cookie.py
tests/test_security_api_key_cookie_description.py
tests/test_security_api_key_cookie_optional.py
tests/test_tuples.py
tests/test_tutorial/test_advanced_middleware/test_tutorial001.py
tests/test_tutorial/test_body/test_tutorial001.py
tests/test_tutorial/test_body/test_tutorial001_py310.py
tests/test_tutorial/test_cookie_params/test_tutorial001.py
tests/test_tutorial/test_cookie_params/test_tutorial001_py310.py
tests/test_tutorial/test_custom_request_and_route/test_tutorial001.py
tests/test_tutorial/test_custom_response/test_tutorial006.py
tests/test_tutorial/test_custom_response/test_tutorial006b.py
tests/test_tutorial/test_custom_response/test_tutorial006c.py
tests/test_tutorial/test_path_operation_advanced_configurations/test_tutorial006.py
tests/test_tutorial/test_path_operation_advanced_configurations/test_tutorial007.py
tests/test_tutorial/test_websockets/test_tutorial002.py

index bca5c721a69967ccb257f2a13c5cb5ca8c8bd245..24ddbf4825907591ae432a9864ca8fdc82ebd41c 100644 (file)
@@ -54,7 +54,7 @@ class APIKeyHeader(APIKeyBase):
         self.auto_error = auto_error
 
     async def __call__(self, request: Request) -> Optional[str]:
-        api_key: str = request.headers.get(self.model.name)
+        api_key = request.headers.get(self.model.name)
         if not api_key:
             if self.auto_error:
                 raise HTTPException(
index 1b473c69e7cc31519cdab3ee1dd7e12e2ead29f9..8b677299dde420023e28b57109368f4b857ebb24 100644 (file)
@@ -38,7 +38,7 @@ class HTTPBase(SecurityBase):
     async def __call__(
         self, request: Request
     ) -> Optional[HTTPAuthorizationCredentials]:
-        authorization: str = request.headers.get("Authorization")
+        authorization = request.headers.get("Authorization")
         scheme, credentials = get_authorization_scheme_param(authorization)
         if not (authorization and scheme and credentials):
             if self.auto_error:
@@ -67,7 +67,7 @@ class HTTPBasic(HTTPBase):
     async def __call__(  # type: ignore
         self, request: Request
     ) -> Optional[HTTPBasicCredentials]:
-        authorization: str = request.headers.get("Authorization")
+        authorization = request.headers.get("Authorization")
         scheme, param = get_authorization_scheme_param(authorization)
         if self.realm:
             unauthorized_headers = {"WWW-Authenticate": f'Basic realm="{self.realm}"'}
@@ -113,7 +113,7 @@ class HTTPBearer(HTTPBase):
     async def __call__(
         self, request: Request
     ) -> Optional[HTTPAuthorizationCredentials]:
-        authorization: str = request.headers.get("Authorization")
+        authorization = request.headers.get("Authorization")
         scheme, credentials = get_authorization_scheme_param(authorization)
         if not (authorization and scheme and credentials):
             if self.auto_error:
@@ -148,7 +148,7 @@ class HTTPDigest(HTTPBase):
     async def __call__(
         self, request: Request
     ) -> Optional[HTTPAuthorizationCredentials]:
-        authorization: str = request.headers.get("Authorization")
+        authorization = request.headers.get("Authorization")
         scheme, credentials = get_authorization_scheme_param(authorization)
         if not (authorization and scheme and credentials):
             if self.auto_error:
index 653c3010e58a3e4c39a7b8a97dcdc05d4cf1c67a..eb6b4277cf8e3bbeeca3f636d1622d30fbfc2648 100644 (file)
@@ -126,7 +126,7 @@ class OAuth2(SecurityBase):
         self.auto_error = auto_error
 
     async def __call__(self, request: Request) -> Optional[str]:
-        authorization: str = request.headers.get("Authorization")
+        authorization = request.headers.get("Authorization")
         if not authorization:
             if self.auto_error:
                 raise HTTPException(
@@ -157,7 +157,7 @@ class OAuth2PasswordBearer(OAuth2):
         )
 
     async def __call__(self, request: Request) -> Optional[str]:
-        authorization: str = request.headers.get("Authorization")
+        authorization = request.headers.get("Authorization")
         scheme, param = get_authorization_scheme_param(authorization)
         if not authorization or scheme.lower() != "bearer":
             if self.auto_error:
@@ -200,7 +200,7 @@ class OAuth2AuthorizationCodeBearer(OAuth2):
         )
 
     async def __call__(self, request: Request) -> Optional[str]:
-        authorization: str = request.headers.get("Authorization")
+        authorization = request.headers.get("Authorization")
         scheme, param = get_authorization_scheme_param(authorization)
         if not authorization or scheme.lower() != "bearer":
             if self.auto_error:
index dfe9f7b255e6ecccd561bd36c1ae6f6ba1ebbaa1..393614f7cbc3b9bfd51fce7ca23415eca6e83cae 100644 (file)
@@ -23,7 +23,7 @@ class OpenIdConnect(SecurityBase):
         self.auto_error = auto_error
 
     async def __call__(self, request: Request) -> Optional[str]:
-        authorization: str = request.headers.get("Authorization")
+        authorization = request.headers.get("Authorization")
         if not authorization:
             if self.auto_error:
                 raise HTTPException(
index 2da0dd20f30a6efe30c1e44b65e690577ee45acb..fa7a450b74e813e66fd6e9a140d48c29215503bb 100644 (file)
@@ -1,7 +1,9 @@
-from typing import Tuple
+from typing import Optional, Tuple
 
 
-def get_authorization_scheme_param(authorization_header_value: str) -> Tuple[str, str]:
+def get_authorization_scheme_param(
+    authorization_header_value: Optional[str],
+) -> Tuple[str, str]:
     if not authorization_header_value:
         return "", ""
     scheme, _, param = authorization_header_value.partition(" ")
index a23289fb1ed1b2a856b834dbaf92728ee40e142c..fc4602ea8e6cc18cc73e7730aa9a337a340a4ea3 100644 (file)
@@ -39,7 +39,7 @@ classifiers = [
     "Topic :: Internet :: WWW/HTTP",
 ]
 dependencies = [
-    "starlette==0.20.4",
+    "starlette==0.21.0",
     "pydantic >=1.6.2,!=1.7,!=1.7.1,!=1.7.2,!=1.7.3,!=1.8,!=1.8.1,<2.0.0",
 ]
 dynamic = ["version"]
index ba8c7353fa97f8fcab9ce3adebbc2eee75a56b3f..bf05aa5852ac99fac49574bb2b87b0e25102ba4a 100644 (file)
@@ -101,7 +101,7 @@ def test_schema():
 
 
 def test_get_invalid():
-    response = client.get("/foo", params={"client_id": None})
+    response = client.get("/foo")
     assert response.status_code == status.HTTP_422_UNPROCESSABLE_ENTITY
 
 
index 491ba61c68040ad3b37eb9baa35a550747326630..e979628a5cc5e0d3fd47ffacb930a5ea2e7ae640 100644 (file)
@@ -333,7 +333,7 @@ def test_get_api_route_not_decorated():
 
 
 def test_delete():
-    response = client.delete("/items/foo", json={"name": "Foo"})
+    response = client.request("DELETE", "/items/foo", json={"name": "Foo"})
     assert response.status_code == 200, response.text
     assert response.json() == {"item_id": "foo", "item": {"name": "Foo", "price": None}}
 
index 88b9d839f5a6b4ab53c888ab96042845908fd062..52a052faab1b2c2616288aba47c6764000e93174 100644 (file)
@@ -104,5 +104,5 @@ def test_openapi_schema():
 
 def test_get_with_body():
     body = {"name": "Foo", "description": "Some description", "price": 5.5}
-    response = client.get("/product", json=body)
+    response = client.request("GET", "/product", json=body)
     assert response.json() == body
index 214f039b67d3ea4390b508f89c720fb050eae78e..cb182a1cd4bf32ffe7f7c14526c7c1caf9e29a85 100644 (file)
@@ -33,8 +33,6 @@ async def hidden_query(
     return {"hidden_query": hidden_query}
 
 
-client = TestClient(app)
-
 openapi_shema = {
     "openapi": "3.0.2",
     "info": {"title": "FastAPI", "version": "0.1.0"},
@@ -161,6 +159,7 @@ openapi_shema = {
 
 
 def test_openapi_schema():
+    client = TestClient(app)
     response = client.get("/openapi.json")
     assert response.status_code == 200
     assert response.json() == openapi_shema
@@ -184,7 +183,8 @@ def test_openapi_schema():
     ],
 )
 def test_hidden_cookie(path, cookies, expected_status, expected_response):
-    response = client.get(path, cookies=cookies)
+    client = TestClient(app, cookies=cookies)
+    response = client.get(path)
     assert response.status_code == expected_status
     assert response.json() == expected_response
 
@@ -207,12 +207,14 @@ def test_hidden_cookie(path, cookies, expected_status, expected_response):
     ],
 )
 def test_hidden_header(path, headers, expected_status, expected_response):
+    client = TestClient(app)
     response = client.get(path, headers=headers)
     assert response.status_code == expected_status
     assert response.json() == expected_response
 
 
 def test_hidden_path():
+    client = TestClient(app)
     response = client.get("/hidden_path/hidden_path")
     assert response.status_code == 200
     assert response.json() == {"hidden_path": "hidden_path"}
@@ -234,6 +236,7 @@ def test_hidden_path():
     ],
 )
 def test_hidden_query(path, expected_status, expected_response):
+    client = TestClient(app)
     response = client.get(path)
     assert response.status_code == expected_status
     assert response.json() == expected_response
index a5b2e44f0ce50ebd65466949e797e32240e19066..0bf4e9bb3ad25db88c2a23a3cdaa9b8f43fb2302 100644 (file)
@@ -22,8 +22,6 @@ def read_current_user(current_user: User = Depends(get_current_user)):
     return current_user
 
 
-client = TestClient(app)
-
 openapi_schema = {
     "openapi": "3.0.2",
     "info": {"title": "FastAPI", "version": "0.1.0"},
@@ -51,18 +49,21 @@ openapi_schema = {
 
 
 def test_openapi_schema():
+    client = TestClient(app)
     response = client.get("/openapi.json")
     assert response.status_code == 200, response.text
     assert response.json() == openapi_schema
 
 
 def test_security_api_key():
-    response = client.get("/users/me", cookies={"key": "secret"})
+    client = TestClient(app, cookies={"key": "secret"})
+    response = client.get("/users/me")
     assert response.status_code == 200, response.text
     assert response.json() == {"username": "secret"}
 
 
 def test_security_api_key_no_key():
+    client = TestClient(app)
     response = client.get("/users/me")
     assert response.status_code == 403, response.text
     assert response.json() == {"detail": "Not authenticated"}
index 2cd3565b43ad688307d6f27ce8b4edd84d58cb60..ed4e6523944827c7e68b0b33591b0f2ad8010b4b 100644 (file)
@@ -22,8 +22,6 @@ def read_current_user(current_user: User = Depends(get_current_user)):
     return current_user
 
 
-client = TestClient(app)
-
 openapi_schema = {
     "openapi": "3.0.2",
     "info": {"title": "FastAPI", "version": "0.1.0"},
@@ -56,18 +54,21 @@ openapi_schema = {
 
 
 def test_openapi_schema():
+    client = TestClient(app)
     response = client.get("/openapi.json")
     assert response.status_code == 200, response.text
     assert response.json() == openapi_schema
 
 
 def test_security_api_key():
-    response = client.get("/users/me", cookies={"key": "secret"})
+    client = TestClient(app, cookies={"key": "secret"})
+    response = client.get("/users/me")
     assert response.status_code == 200, response.text
     assert response.json() == {"username": "secret"}
 
 
 def test_security_api_key_no_key():
+    client = TestClient(app)
     response = client.get("/users/me")
     assert response.status_code == 403, response.text
     assert response.json() == {"detail": "Not authenticated"}
index 96a64f09a6e7d74e5cf7c5651b6c7afa169836e8..3e7aa81c07a5ab5b64db4abac1f6d85a3fb7f977 100644 (file)
@@ -29,8 +29,6 @@ def read_current_user(current_user: User = Depends(get_current_user)):
         return current_user
 
 
-client = TestClient(app)
-
 openapi_schema = {
     "openapi": "3.0.2",
     "info": {"title": "FastAPI", "version": "0.1.0"},
@@ -58,18 +56,21 @@ openapi_schema = {
 
 
 def test_openapi_schema():
+    client = TestClient(app)
     response = client.get("/openapi.json")
     assert response.status_code == 200, response.text
     assert response.json() == openapi_schema
 
 
 def test_security_api_key():
-    response = client.get("/users/me", cookies={"key": "secret"})
+    client = TestClient(app, cookies={"key": "secret"})
+    response = client.get("/users/me")
     assert response.status_code == 200, response.text
     assert response.json() == {"username": "secret"}
 
 
 def test_security_api_key_no_key():
+    client = TestClient(app)
     response = client.get("/users/me")
     assert response.status_code == 200, response.text
     assert response.json() == {"msg": "Create an account first"}
index 18ec2d04899121b9089c91201f0a16bbaa9d05e0..6e2cc0db676fa8830451b1abedb36e866a43ccbc 100644 (file)
@@ -252,16 +252,14 @@ def test_tuple_with_model_invalid():
 
 
 def test_tuple_form_valid():
-    response = client.post("/tuple-form/", data=[("values", "1"), ("values", "2")])
+    response = client.post("/tuple-form/", data={"values": ("1", "2")})
     assert response.status_code == 200, response.text
     assert response.json() == [1, 2]
 
 
 def test_tuple_form_invalid():
-    response = client.post(
-        "/tuple-form/", data=[("values", "1"), ("values", "2"), ("values", "3")]
-    )
+    response = client.post("/tuple-form/", data={"values": ("1", "2", "3")})
     assert response.status_code == 422, response.text
 
-    response = client.post("/tuple-form/", data=[("values", "1")])
+    response = client.post("/tuple-form/", data={"values": ("1")})
     assert response.status_code == 422, response.text
index 17165c0fc61a36b3541ddc0a7fa567bd650b1858..157fa5caf1a033b570a8f0de4d943ce3031aa2b5 100644 (file)
@@ -9,6 +9,6 @@ def test_middleware():
     assert response.status_code == 200, response.text
 
     client = TestClient(app)
-    response = client.get("/", allow_redirects=False)
+    response = client.get("/", follow_redirects=False)
     assert response.status_code == 307, response.text
     assert response.headers["location"] == "https://testserver/"
index 8dbaf15dbef06a2cc99e7faeb503003884104e3a..65cdc758adc0052cc0957ada290053211bff81f9 100644 (file)
@@ -176,7 +176,7 @@ def test_post_broken_body():
     response = client.post(
         "/items/",
         headers={"content-type": "application/json"},
-        data="{some broken json}",
+        content="{some broken json}",
     )
     assert response.status_code == 422, response.text
     assert response.json() == {
@@ -214,7 +214,7 @@ def test_post_form_for_json():
 def test_explicit_content_type():
     response = client.post(
         "/items/",
-        data='{"name": "Foo", "price": 50.5}',
+        content='{"name": "Foo", "price": 50.5}',
         headers={"Content-Type": "application/json"},
     )
     assert response.status_code == 200, response.text
@@ -223,7 +223,7 @@ def test_explicit_content_type():
 def test_geo_json():
     response = client.post(
         "/items/",
-        data='{"name": "Foo", "price": 50.5}',
+        content='{"name": "Foo", "price": 50.5}',
         headers={"Content-Type": "application/geo+json"},
     )
     assert response.status_code == 200, response.text
@@ -232,7 +232,7 @@ def test_geo_json():
 def test_no_content_type_is_json():
     response = client.post(
         "/items/",
-        data='{"name": "Foo", "price": 50.5}',
+        content='{"name": "Foo", "price": 50.5}',
     )
     assert response.status_code == 200, response.text
     assert response.json() == {
@@ -255,17 +255,19 @@ def test_wrong_headers():
         ]
     }
 
-    response = client.post("/items/", data=data, headers={"Content-Type": "text/plain"})
+    response = client.post(
+        "/items/", content=data, headers={"Content-Type": "text/plain"}
+    )
     assert response.status_code == 422, response.text
     assert response.json() == invalid_dict
 
     response = client.post(
-        "/items/", data=data, headers={"Content-Type": "application/geo+json-seq"}
+        "/items/", content=data, headers={"Content-Type": "application/geo+json-seq"}
     )
     assert response.status_code == 422, response.text
     assert response.json() == invalid_dict
     response = client.post(
-        "/items/", data=data, headers={"Content-Type": "application/not-really-json"}
+        "/items/", content=data, headers={"Content-Type": "application/not-really-json"}
     )
     assert response.status_code == 422, response.text
     assert response.json() == invalid_dict
index dd9d9911e402c3fa4745d66113777f86af91ff7d..83bcb68f30d85161128945cbd8ebe5b963217e8a 100644 (file)
@@ -185,7 +185,7 @@ def test_post_broken_body(client: TestClient):
     response = client.post(
         "/items/",
         headers={"content-type": "application/json"},
-        data="{some broken json}",
+        content="{some broken json}",
     )
     assert response.status_code == 422, response.text
     assert response.json() == {
@@ -225,7 +225,7 @@ def test_post_form_for_json(client: TestClient):
 def test_explicit_content_type(client: TestClient):
     response = client.post(
         "/items/",
-        data='{"name": "Foo", "price": 50.5}',
+        content='{"name": "Foo", "price": 50.5}',
         headers={"Content-Type": "application/json"},
     )
     assert response.status_code == 200, response.text
@@ -235,7 +235,7 @@ def test_explicit_content_type(client: TestClient):
 def test_geo_json(client: TestClient):
     response = client.post(
         "/items/",
-        data='{"name": "Foo", "price": 50.5}',
+        content='{"name": "Foo", "price": 50.5}',
         headers={"Content-Type": "application/geo+json"},
     )
     assert response.status_code == 200, response.text
@@ -245,7 +245,7 @@ def test_geo_json(client: TestClient):
 def test_no_content_type_is_json(client: TestClient):
     response = client.post(
         "/items/",
-        data='{"name": "Foo", "price": 50.5}',
+        content='{"name": "Foo", "price": 50.5}',
     )
     assert response.status_code == 200, response.text
     assert response.json() == {
@@ -269,17 +269,19 @@ def test_wrong_headers(client: TestClient):
         ]
     }
 
-    response = client.post("/items/", data=data, headers={"Content-Type": "text/plain"})
+    response = client.post(
+        "/items/", content=data, headers={"Content-Type": "text/plain"}
+    )
     assert response.status_code == 422, response.text
     assert response.json() == invalid_dict
 
     response = client.post(
-        "/items/", data=data, headers={"Content-Type": "application/geo+json-seq"}
+        "/items/", content=data, headers={"Content-Type": "application/geo+json-seq"}
     )
     assert response.status_code == 422, response.text
     assert response.json() == invalid_dict
     response = client.post(
-        "/items/", data=data, headers={"Content-Type": "application/not-really-json"}
+        "/items/", content=data, headers={"Content-Type": "application/not-really-json"}
     )
     assert response.status_code == 422, response.text
     assert response.json() == invalid_dict
index edccffec1e87eabc4fd6bdcbd2f3d17e2c00d7c6..38ae211db361d4d3df47d1821a0a69a02bd5444f 100644 (file)
@@ -3,8 +3,6 @@ from fastapi.testclient import TestClient
 
 from docs_src.cookie_params.tutorial001 import app
 
-client = TestClient(app)
-
 openapi_schema = {
     "openapi": "3.0.2",
     "info": {"title": "FastAPI", "version": "0.1.0"},
@@ -88,6 +86,7 @@ openapi_schema = {
     ],
 )
 def test(path, cookies, expected_status, expected_response):
-    response = client.get(path, cookies=cookies)
+    client = TestClient(app, cookies=cookies)
+    response = client.get(path)
     assert response.status_code == expected_status
     assert response.json() == expected_response
index 5caa5c440039eeea7973e909c68c66d8f4bbdb08..5ad52fb5e125844fe21ce5bb906e82d96cd2a388 100644 (file)
@@ -70,14 +70,6 @@ openapi_schema = {
 }
 
 
-@pytest.fixture(name="client")
-def get_client():
-    from docs_src.cookie_params.tutorial001_py310 import app
-
-    client = TestClient(app)
-    return client
-
-
 @needs_py310
 @pytest.mark.parametrize(
     "path,cookies,expected_status,expected_response",
@@ -94,7 +86,10 @@ def get_client():
         ("/items", {"session": "cookiesession"}, 200, {"ads_id": None}),
     ],
 )
-def test(path, cookies, expected_status, expected_response, client: TestClient):
-    response = client.get(path, cookies=cookies)
+def test(path, cookies, expected_status, expected_response):
+    from docs_src.cookie_params.tutorial001_py310 import app
+
+    client = TestClient(app, cookies=cookies)
+    response = client.get(path)
     assert response.status_code == expected_status
     assert response.json() == expected_response
index 3eb5822e288168bb7b3a88c42f0f9481a0daa25b..e6da630e8813a210bdddf4570d9ae211c11c52e7 100644 (file)
@@ -26,7 +26,7 @@ def test_gzip_request(compress):
         data = gzip.compress(data)
         headers["Content-Encoding"] = "gzip"
     headers["Content-Type"] = "application/json"
-    response = client.post("/sum", data=data, headers=headers)
+    response = client.post("/sum", content=data, headers=headers)
     assert response.json() == {"sum": n}
 
 
index 72bbfd277720921255f56f27ee3c423604e4cb52..9b10916e588a3aaf2dd28424c3526614ab0283bf 100644 (file)
@@ -32,6 +32,6 @@ def test_openapi_schema():
 
 
 def test_get():
-    response = client.get("/typer", allow_redirects=False)
+    response = client.get("/typer", follow_redirects=False)
     assert response.status_code == 307, response.text
     assert response.headers["location"] == "https://typer.tiangolo.com"
index ac5a76d34d061f39b0a98efe5041248f7ab8330c..b3e60e86a38b97aac5cfe4f1ad723751d60cffc7 100644 (file)
@@ -27,6 +27,6 @@ def test_openapi_schema():
 
 
 def test_redirect_response_class():
-    response = client.get("/fastapi", allow_redirects=False)
+    response = client.get("/fastapi", follow_redirects=False)
     assert response.status_code == 307
     assert response.headers["location"] == "https://fastapi.tiangolo.com"
index 009225e8c58c77e066f6f3e2d371e22e13cfc008..0cb6ddaa330ebad37aa6026c2085e2fff55216b3 100644 (file)
@@ -27,6 +27,6 @@ def test_openapi_schema():
 
 
 def test_redirect_status_code():
-    response = client.get("/pydantic", allow_redirects=False)
+    response = client.get("/pydantic", follow_redirects=False)
     assert response.status_code == 302
     assert response.headers["location"] == "https://pydantic-docs.helpmanual.io/"
index 5533b295714333086281fdbcf28e48aebe879990..330b4e2c791babcb4545afcd78a8014c15662ebf 100644 (file)
@@ -47,7 +47,7 @@ def test_openapi_schema():
 
 
 def test_post():
-    response = client.post("/items/", data=b"this is actually not validated")
+    response = client.post("/items/", content=b"this is actually not validated")
     assert response.status_code == 200, response.text
     assert response.json() == {
         "size": 30,
index cb5dbc8eb010de7634ffacc7b78790657f27a499..076f60b2f079d441b90e5bc363d150262f6ccedf 100644 (file)
@@ -58,7 +58,7 @@ def test_post():
         - x-men
         - x-avengers
         """
-    response = client.post("/items/", data=yaml_data)
+    response = client.post("/items/", content=yaml_data)
     assert response.status_code == 200, response.text
     assert response.json() == {
         "name": "Deadpoolio",
@@ -74,7 +74,7 @@ def test_post_broken_yaml():
         x - x-men
         x - x-avengers
         """
-    response = client.post("/items/", data=yaml_data)
+    response = client.post("/items/", content=yaml_data)
     assert response.status_code == 422, response.text
     assert response.json() == {"detail": "Invalid YAML"}
 
@@ -88,7 +88,7 @@ def test_post_invalid():
         - x-avengers
         - sneaky: object
         """
-    response = client.post("/items/", data=yaml_data)
+    response = client.post("/items/", content=yaml_data)
     assert response.status_code == 422, response.text
     assert response.json() == {
         "detail": [
index a8523c9c4fcfa24a011e93c43b2755cfaa888126..bb5ccbf8ef61ea9a5ed24366f1d9665abde1e9c7 100644 (file)
@@ -4,20 +4,18 @@ from fastapi.websockets import WebSocketDisconnect
 
 from docs_src.websockets.tutorial002 import app
 
-client = TestClient(app)
-
 
 def test_main():
+    client = TestClient(app)
     response = client.get("/")
     assert response.status_code == 200, response.text
     assert b"<!DOCTYPE html>" in response.content
 
 
 def test_websocket_with_cookie():
+    client = TestClient(app, cookies={"session": "fakesession"})
     with pytest.raises(WebSocketDisconnect):
-        with client.websocket_connect(
-            "/items/foo/ws", cookies={"session": "fakesession"}
-        ) as websocket:
+        with client.websocket_connect("/items/foo/ws") as websocket:
             message = "Message one"
             websocket.send_text(message)
             data = websocket.receive_text()
@@ -33,6 +31,7 @@ def test_websocket_with_cookie():
 
 
 def test_websocket_with_header():
+    client = TestClient(app)
     with pytest.raises(WebSocketDisconnect):
         with client.websocket_connect("/items/bar/ws?token=some-token") as websocket:
             message = "Message one"
@@ -50,6 +49,7 @@ def test_websocket_with_header():
 
 
 def test_websocket_with_header_and_query():
+    client = TestClient(app)
     with pytest.raises(WebSocketDisconnect):
         with client.websocket_connect("/items/2/ws?q=3&token=some-token") as websocket:
             message = "Message one"
@@ -71,6 +71,7 @@ def test_websocket_with_header_and_query():
 
 
 def test_websocket_no_credentials():
+    client = TestClient(app)
     with pytest.raises(WebSocketDisconnect):
         with client.websocket_connect("/items/foo/ws"):
             pytest.fail(
@@ -79,6 +80,7 @@ def test_websocket_no_credentials():
 
 
 def test_websocket_invalid_data():
+    client = TestClient(app)
     with pytest.raises(WebSocketDisconnect):
         with client.websocket_connect("/items/foo/ws?q=bar&token=some-token"):
             pytest.fail(