]> git.ipfire.org Git - thirdparty/starlette.git/commitdiff
Create types module inside tests (#2502)
authorScirlat Danut <danut.scirlat@gmail.com>
Sat, 27 Jul 2024 09:31:16 +0000 (12:31 +0300)
committerGitHub <noreply@github.com>
Sat, 27 Jul 2024 09:31:16 +0000 (03:31 -0600)
* Create types module inside tests

* Apply suggestions from code review

* Apply suggestions from code review

* Fix check errors

* Change testclientfactory due to autotest

* No cover fix

* Apply suggestions from code review

* Skip code coverage for TestClientFactory protocol

* Apply suggestions from code review

* Small improvements

* Lint

* Fix everything

---------

Co-authored-by: Scirlat Danut <scirlatdanut@scirlats-mini.lan>
Co-authored-by: Marcelo Trylesinski <marcelotryle@gmail.com>
26 files changed:
tests/conftest.py
tests/middleware/test_base.py
tests/middleware/test_cors.py
tests/middleware/test_errors.py
tests/middleware/test_gzip.py
tests/middleware/test_https_redirect.py
tests/middleware/test_session.py
tests/middleware/test_trusted_host.py
tests/middleware/test_wsgi.py
tests/test_applications.py
tests/test_authentication.py
tests/test_background.py
tests/test_concurrency.py
tests/test_convertors.py
tests/test_endpoints.py
tests/test_exceptions.py
tests/test_formparsers.py
tests/test_requests.py
tests/test_responses.py
tests/test_routing.py
tests/test_schemas.py
tests/test_staticfiles.py
tests/test_templates.py
tests/test_testclient.py
tests/test_websockets.py
tests/types.py [new file with mode: 0644]

index 724ca65d3cda199de3d1f4dad8cc5d841b46a931..4db3ae0181dcffc8ffc19a12bff5c7577c64f464 100644 (file)
@@ -1,13 +1,12 @@
 from __future__ import annotations
 
 import functools
-from typing import Any, Callable, Literal
+from typing import Any, Literal
 
 import pytest
 
 from starlette.testclient import TestClient
-
-TestClientFactory = Callable[..., TestClient]
+from tests.types import TestClientFactory
 
 
 @pytest.fixture
index 2176404d825b9140c1a55d043737c3c31903755c..3ad1751a20a425abd07e2593a9dc12d4d6ebc65f 100644 (file)
@@ -5,7 +5,6 @@ from contextlib import AsyncExitStack
 from typing import (
     Any,
     AsyncGenerator,
-    Callable,
     Generator,
 )
 
@@ -23,8 +22,7 @@ from starlette.routing import Route, WebSocketRoute
 from starlette.testclient import TestClient
 from starlette.types import ASGIApp, Message, Receive, Scope, Send
 from starlette.websockets import WebSocket
-
-TestClientFactory = Callable[[ASGIApp], TestClient]
+from tests.types import TestClientFactory
 
 
 class CustomMiddleware(BaseHTTPMiddleware):
index 09ec9513f3d7f0a17336af522d64f71539b37482..6303612434361006e505cd016be7344942195316 100644 (file)
@@ -1,15 +1,10 @@
-from typing import Callable
-
 from starlette.applications import Starlette
 from starlette.middleware import Middleware
 from starlette.middleware.cors import CORSMiddleware
 from starlette.requests import Request
 from starlette.responses import PlainTextResponse
 from starlette.routing import Route
-from starlette.testclient import TestClient
-from starlette.types import ASGIApp
-
-TestClientFactory = Callable[[ASGIApp], TestClient]
+from tests.types import TestClientFactory
 
 
 def test_cors_allow_all(
index a2dbabd8a15ec5f984075728bab28f717141a48a..e32f406ae52d5e1cf85ce0171cac78d4815a5b34 100644 (file)
@@ -1,4 +1,4 @@
-from typing import Any, Callable
+from typing import Any
 
 import pytest
 
@@ -8,10 +8,8 @@ from starlette.middleware.errors import ServerErrorMiddleware
 from starlette.requests import Request
 from starlette.responses import JSONResponse, Response
 from starlette.routing import Route
-from starlette.testclient import TestClient
 from starlette.types import Receive, Scope, Send
-
-TestClientFactory = Callable[..., TestClient]
+from tests.types import TestClientFactory
 
 
 def test_handler(
index 5bfecadb72185b0d39edbcdd0bcd3323c8bc4dbf..b6f68296dc6da63cbbfad493d172cd4c9a6a1059 100644 (file)
@@ -1,15 +1,10 @@
-from typing import Callable
-
 from starlette.applications import Starlette
 from starlette.middleware import Middleware
 from starlette.middleware.gzip import GZipMiddleware
 from starlette.requests import Request
 from starlette.responses import ContentStream, PlainTextResponse, StreamingResponse
 from starlette.routing import Route
-from starlette.testclient import TestClient
-from starlette.types import ASGIApp
-
-TestClientFactory = Callable[[ASGIApp], TestClient]
+from tests.types import TestClientFactory
 
 
 def test_gzip_responses(test_client_factory: TestClientFactory) -> None:
index 9195694a34c7dc42ed716ed7349bd287436225c2..22dfc14b65bd5773aeb86e9254242c4c574e90ae 100644 (file)
@@ -1,14 +1,10 @@
-from typing import Callable
-
 from starlette.applications import Starlette
 from starlette.middleware import Middleware
 from starlette.middleware.httpsredirect import HTTPSRedirectMiddleware
 from starlette.requests import Request
 from starlette.responses import PlainTextResponse
 from starlette.routing import Route
-from starlette.testclient import TestClient
-
-TestClientFactory = Callable[..., TestClient]
+from tests.types import TestClientFactory
 
 
 def test_https_redirect_middleware(test_client_factory: TestClientFactory) -> None:
index 4fbeec88c5b265f15fcc97ebc00a54786e94f281..9a0d70a0d7c93f3849ad7fa6c5bcadcdc9b4ca78 100644 (file)
@@ -1,5 +1,4 @@
 import re
-from typing import Callable
 
 from starlette.applications import Starlette
 from starlette.middleware import Middleware
@@ -8,8 +7,7 @@ from starlette.requests import Request
 from starlette.responses import JSONResponse
 from starlette.routing import Mount, Route
 from starlette.testclient import TestClient
-
-TestClientFactory = Callable[..., TestClient]
+from tests.types import TestClientFactory
 
 
 def view_session(request: Request) -> JSONResponse:
index 466302210cc13dc9e0f3408751a683037e3b6b80..ddff46c48ca6bf63302f6d77a47a221eecb092e7 100644 (file)
@@ -1,14 +1,10 @@
-from typing import Callable
-
 from starlette.applications import Starlette
 from starlette.middleware import Middleware
 from starlette.middleware.trustedhost import TrustedHostMiddleware
 from starlette.requests import Request
 from starlette.responses import PlainTextResponse
 from starlette.routing import Route
-from starlette.testclient import TestClient
-
-TestClientFactory = Callable[..., TestClient]
+from tests.types import TestClientFactory
 
 
 def test_trusted_host_middleware(test_client_factory: TestClientFactory) -> None:
index 69842d3ad98f2f90c1c8f9a08ff1b86be5c93e17..58696bb65028b29494d86c2174660617a237c700 100644 (file)
@@ -5,10 +5,9 @@ import pytest
 
 from starlette._utils import collapse_excgroups
 from starlette.middleware.wsgi import WSGIMiddleware, build_environ
-from starlette.testclient import TestClient
+from tests.types import TestClientFactory
 
 WSGIResponse = Iterable[bytes]
-TestClientFactory = Callable[..., TestClient]
 StartResponse = Callable[..., Any]
 Environment = Dict[str, Any]
 
index af3cdda6cd579cb1e571aa4e13699329d3a2f60f..20da7ea8111b6031fcb595a5404132e025053cb0 100644 (file)
@@ -1,7 +1,7 @@
 import os
 from contextlib import asynccontextmanager
 from pathlib import Path
-from typing import AsyncGenerator, AsyncIterator, Callable, Generator
+from typing import AsyncGenerator, AsyncIterator, Generator
 
 import anyio
 import pytest
@@ -20,8 +20,7 @@ from starlette.staticfiles import StaticFiles
 from starlette.testclient import TestClient
 from starlette.types import ASGIApp, Receive, Scope, Send
 from starlette.websockets import WebSocket
-
-TestClientFactory = Callable[..., TestClient]
+from tests.types import TestClientFactory
 
 
 async def error_500(request: Request, exc: HTTPException) -> JSONResponse:
index ecddda75ed52a7523327b3add7b900a51d20033e..35c1110d14118bbb3438c8601fae7b81f339d031 100644 (file)
@@ -21,10 +21,9 @@ from starlette.middleware.authentication import AuthenticationMiddleware
 from starlette.requests import HTTPConnection, Request
 from starlette.responses import JSONResponse, Response
 from starlette.routing import Route, WebSocketRoute
-from starlette.testclient import TestClient
 from starlette.websockets import WebSocket, WebSocketDisconnect
+from tests.types import TestClientFactory
 
-TestClientFactory = Callable[..., TestClient]
 AsyncEndpoint = Callable[..., Awaitable[Response]]
 SyncEndpoint = Callable[..., Response]
 
index 846deecfd9a6a1fe760cb10053f46297f662205e..cbffcc06a34565e60a22dc71807cace7d9a48045 100644 (file)
@@ -1,13 +1,9 @@
-from typing import Callable
-
 import pytest
 
 from starlette.background import BackgroundTask, BackgroundTasks
 from starlette.responses import Response
-from starlette.testclient import TestClient
 from starlette.types import Receive, Scope, Send
-
-TestClientFactory = Callable[..., TestClient]
+from tests.types import TestClientFactory
 
 
 def test_async_task(test_client_factory: TestClientFactory) -> None:
index aba3ceb1ae0b49929b8fd616a22829583b7548f5..bac6814e42cc99327395426d71607a202156d877 100644 (file)
@@ -1,5 +1,5 @@
 from contextvars import ContextVar
-from typing import Callable, Iterator
+from typing import Iterator
 
 import anyio
 import pytest
@@ -9,9 +9,7 @@ from starlette.concurrency import iterate_in_threadpool, run_until_first_complet
 from starlette.requests import Request
 from starlette.responses import Response
 from starlette.routing import Route
-from starlette.testclient import TestClient
-
-TestClientFactory = Callable[..., TestClient]
+from tests.types import TestClientFactory
 
 
 @pytest.mark.anyio
index 72ee17a82267671e870c1cab14a405d6ba722b6c..520c987677fffa921a40a8bfdc936e1c7efbd8d2 100644 (file)
@@ -1,5 +1,5 @@
 from datetime import datetime
-from typing import Callable, Iterator
+from typing import Iterator
 
 import pytest
 
@@ -8,9 +8,7 @@ from starlette.convertors import Convertor, register_url_convertor
 from starlette.requests import Request
 from starlette.responses import JSONResponse
 from starlette.routing import Route, Router
-from starlette.testclient import TestClient
-
-TestClientFactory = Callable[..., TestClient]
+from tests.types import TestClientFactory
 
 
 @pytest.fixture(scope="module", autouse=True)
index eeb0f2322f86d7c2159161e1adc39accdda2c622..8f201e25be0407a3b19e14a8d5f2c26ede802077 100644 (file)
@@ -1,4 +1,4 @@
-from typing import Callable, Iterator
+from typing import Iterator
 
 import pytest
 
@@ -8,8 +8,7 @@ from starlette.responses import PlainTextResponse
 from starlette.routing import Route, Router
 from starlette.testclient import TestClient
 from starlette.websockets import WebSocket
-
-TestClientFactory = Callable[..., TestClient]
+from tests.types import TestClientFactory
 
 
 class Homepage(HTTPEndpoint):
index 401ad82126dc7b2ace18a4f67717b1ae536305aa..f4e91ad871bae26bc59ea19a55250f7fe292f3c9 100644 (file)
@@ -1,5 +1,5 @@
 import warnings
-from typing import Callable, Generator
+from typing import Generator
 
 import pytest
 
@@ -10,8 +10,7 @@ from starlette.responses import JSONResponse, PlainTextResponse
 from starlette.routing import Route, Router, WebSocketRoute
 from starlette.testclient import TestClient
 from starlette.types import Receive, Scope, Send
-
-TestClientFactory = Callable[..., TestClient]
+from tests.types import TestClientFactory
 
 
 def raise_runtime_error(request: Request) -> None:
index ed2226878bec5daaa175a941c615c7924986a4b8..8d97a0ba7b8faadb38d002f4e8c6cc381fbc0ba3 100644 (file)
@@ -13,10 +13,8 @@ from starlette.formparsers import MultiPartException, _user_safe_decode
 from starlette.requests import Request
 from starlette.responses import JSONResponse
 from starlette.routing import Mount
-from starlette.testclient import TestClient
 from starlette.types import ASGIApp, Receive, Scope, Send
-
-TestClientFactory = typing.Callable[..., TestClient]
+from tests.types import TestClientFactory
 
 
 class ForceMultipartDict(typing.Dict[typing.Any, typing.Any]):
index c52ebc141d55f2fbdb656e90b2b5cbca0badb190..02f29ee35f2a3a208c355d784bb0b48fbb4ea705 100644 (file)
@@ -1,7 +1,7 @@
 from __future__ import annotations
 
 import sys
-from typing import Any, Callable, Iterator
+from typing import Any, Iterator
 
 import anyio
 import pytest
@@ -9,10 +9,8 @@ import pytest
 from starlette.datastructures import Address, State
 from starlette.requests import ClientDisconnect, Request
 from starlette.responses import JSONResponse, PlainTextResponse, Response
-from starlette.testclient import TestClient
 from starlette.types import Message, Receive, Scope, Send
-
-TestClientFactory = Callable[..., TestClient]
+from tests.types import TestClientFactory
 
 
 def test_request_url(test_client_factory: TestClientFactory) -> None:
index f05529dd7dcc34fe4c92debe098e3bcfb47b1603..791e9b3ac3a1bb889112bbedf9ea9db9f809ee5f 100644 (file)
@@ -5,7 +5,7 @@ import os
 import time
 from http.cookies import SimpleCookie
 from pathlib import Path
-from typing import AsyncIterator, Callable, Iterator
+from typing import AsyncIterator, Iterator
 
 import anyio
 import pytest
@@ -23,8 +23,7 @@ from starlette.responses import (
 )
 from starlette.testclient import TestClient
 from starlette.types import Message, Receive, Scope, Send
-
-TestClientFactory = Callable[..., TestClient]
+from tests.types import TestClientFactory
 
 
 def test_text_response(test_client_factory: TestClientFactory) -> None:
index 03c31c67f4cddc0f127e7929357abca0a2b78ff4..1490723b4376993156b78ceb160f64f538b28a20 100644 (file)
@@ -17,8 +17,7 @@ from starlette.routing import Host, Mount, NoMatchFound, Route, Router, WebSocke
 from starlette.testclient import TestClient
 from starlette.types import ASGIApp, Message, Receive, Scope, Send
 from starlette.websockets import WebSocket, WebSocketDisconnect
-
-TestClientFactory = typing.Callable[..., TestClient]
+from tests.types import TestClientFactory
 
 
 def homepage(request: Request) -> Response:
index e00b2b8deb2390a5937d66dfbf3b0657f63b9cb2..f4a5b4ad9950b53dab5500cae94a4732da2a19e4 100644 (file)
@@ -1,20 +1,16 @@
-from typing import Callable
-
 from starlette.applications import Starlette
 from starlette.endpoints import HTTPEndpoint
 from starlette.requests import Request
 from starlette.responses import Response
 from starlette.routing import Host, Mount, Route, Router, WebSocketRoute
 from starlette.schemas import SchemaGenerator
-from starlette.testclient import TestClient
 from starlette.websockets import WebSocket
+from tests.types import TestClientFactory
 
 schemas = SchemaGenerator(
     {"openapi": "3.0.0", "info": {"title": "Example API", "version": "1.0"}}
 )
 
-TestClientFactory = Callable[..., TestClient]
-
 
 def ws(session: WebSocket) -> None:
     """ws"""
index 085301302e4033f761cd60568258115d419dea62..65d71b97b8984bd99f346bf7238b144353c3483f 100644 (file)
@@ -16,9 +16,7 @@ from starlette.requests import Request
 from starlette.responses import Response
 from starlette.routing import Mount
 from starlette.staticfiles import StaticFiles
-from starlette.testclient import TestClient
-
-TestClientFactory = typing.Callable[..., TestClient]
+from tests.types import TestClientFactory
 
 
 def test_staticfiles(tmpdir: Path, test_client_factory: TestClientFactory) -> None:
index 10a1366bc00184ca0ade9ced958501c1b0f1bd75..8e344f331f27b66df6d2854e24af21e1b5eb9643 100644 (file)
@@ -1,7 +1,6 @@
 from __future__ import annotations
 
 import os
-import typing
 from pathlib import Path
 from unittest import mock
 
@@ -16,9 +15,7 @@ from starlette.requests import Request
 from starlette.responses import Response
 from starlette.routing import Route
 from starlette.templating import Jinja2Templates
-from starlette.testclient import TestClient
-
-TestClientFactory = typing.Callable[..., TestClient]
+from tests.types import TestClientFactory
 
 
 def test_templates(tmpdir: Path, test_client_factory: TestClientFactory) -> None:
index 4ed1ced9a37c16c135e669a89efcfd01b3612cff..77de3d976fcddd9a947bf135c904cb0e2ae0dfe1 100644 (file)
@@ -4,7 +4,7 @@ import itertools
 import sys
 from asyncio import Task, current_task as asyncio_current_task
 from contextlib import asynccontextmanager
-from typing import Any, AsyncGenerator, Callable
+from typing import Any, AsyncGenerator
 
 import anyio
 import anyio.lowlevel
@@ -20,8 +20,7 @@ from starlette.routing import Route
 from starlette.testclient import ASGIInstance, TestClient
 from starlette.types import ASGIApp, Receive, Scope, Send
 from starlette.websockets import WebSocket, WebSocketDisconnect
-
-TestClientFactory = Callable[..., TestClient]
+from tests.types import TestClientFactory
 
 
 def mock_service_endpoint(request: Request) -> JSONResponse:
@@ -212,7 +211,7 @@ def test_testclient_asgi2(test_client_factory: TestClientFactory) -> None:
 
         return inner
 
-    client = test_client_factory(app)
+    client = test_client_factory(app)  # type: ignore
     response = client.get("/")
     assert response.text == "Hello, world!"
 
@@ -252,7 +251,7 @@ def test_websocket_blocking_receive(test_client_factory: TestClientFactory) -> N
 
         return asgi
 
-    client = test_client_factory(app)
+    client = test_client_factory(app)  # type: ignore
     with client.websocket_connect("/") as websocket:
         data = websocket.receive_json()
         assert data == {"message": "test"}
@@ -268,7 +267,7 @@ def test_websocket_not_block_on_close(test_client_factory: TestClientFactory) ->
 
         return asgi
 
-    client = test_client_factory(app)
+    client = test_client_factory(app)  # type: ignore
     with client.websocket_connect("/") as websocket:
         ...
     assert websocket.should_close.is_set()
index 95ffbdbe758be6d49a7ca278fb37bea1d0dc239e..16d2d0f1f884a748ad2f8a6b99aed579d53185ac 100644 (file)
@@ -1,5 +1,5 @@
 import sys
-from typing import Any, Callable, MutableMapping
+from typing import Any, MutableMapping
 
 import anyio
 import pytest
@@ -7,11 +7,10 @@ from anyio.abc import ObjectReceiveStream, ObjectSendStream
 
 from starlette import status
 from starlette.responses import Response
-from starlette.testclient import TestClient, WebSocketDenialResponse
+from starlette.testclient import WebSocketDenialResponse
 from starlette.types import Message, Receive, Scope, Send
 from starlette.websockets import WebSocket, WebSocketDisconnect, WebSocketState
-
-TestClientFactory = Callable[..., TestClient]
+from tests.types import TestClientFactory
 
 
 def test_websocket_url(test_client_factory: TestClientFactory) -> None:
diff --git a/tests/types.py b/tests/types.py
new file mode 100644 (file)
index 0000000..1cbacf1
--- /dev/null
@@ -0,0 +1,26 @@
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Protocol
+
+import httpx
+
+from starlette.testclient import TestClient
+from starlette.types import ASGIApp
+
+if TYPE_CHECKING:
+
+    class TestClientFactory(Protocol):  # pragma: no cover
+        def __call__(
+            self,
+            app: ASGIApp,
+            base_url: str = "http://testserver",
+            raise_server_exceptions: bool = True,
+            root_path: str = "",
+            cookies: httpx._types.CookieTypes | None = None,
+            headers: dict[str, str] | None = None,
+            follow_redirects: bool = True,
+        ) -> TestClient: ...
+else:  # pragma: no cover
+
+    class TestClientFactory:
+        __test__ = False