From aab8acf2ea5075c349ec4e05b4ee95c29bfb5e81 Mon Sep 17 00:00:00 2001 From: proxy <51172302+3n-k1@users.noreply.github.com> Date: Sat, 7 Nov 2020 03:38:45 -0500 Subject: [PATCH] change get_user to use a protocol requiring a session (#522) * change get_user to use a protocol requiring a session define a "_HasSession" protocol, and update contrib.auth.get_user to use it get_user only requires a session field, and idiomatic django testing frequently calls get_user with a TestClient * run black * use union for get_user instead of a protocol * create tests for get_user typechecking * properly import test client --- django-stubs/contrib/auth/__init__.pyi | 11 +++++------ django-stubs/views/generic/edit.pyi | 2 +- tests/typecheck/contrib/auth/test_misc.yml | 15 +++++++++++++++ 3 files changed, 21 insertions(+), 7 deletions(-) create mode 100644 tests/typecheck/contrib/auth/test_misc.yml diff --git a/django-stubs/contrib/auth/__init__.pyi b/django-stubs/contrib/auth/__init__.pyi index 04e419f..72fb61b 100644 --- a/django-stubs/contrib/auth/__init__.pyi +++ b/django-stubs/contrib/auth/__init__.pyi @@ -7,12 +7,11 @@ from django.core.handlers.wsgi import WSGIRequest from django.db.models.base import Model from django.db.models.options import Options from django.http.request import HttpRequest +from django.test.client import Client -from .signals import ( - user_logged_in as user_logged_in, - user_logged_out as user_logged_out, - user_login_failed as user_login_failed, -) +from .signals import user_logged_in as user_logged_in +from .signals import user_logged_out as user_logged_out +from .signals import user_login_failed as user_login_failed SESSION_KEY: str BACKEND_SESSION_KEY: str @@ -27,7 +26,7 @@ def login( ) -> None: ... def logout(request: HttpRequest) -> None: ... def get_user_model() -> Type[Model]: ... -def get_user(request: HttpRequest) -> Union[AbstractBaseUser, AnonymousUser]: ... +def get_user(request: Union[HttpRequest, Client]) -> Union[AbstractBaseUser, AnonymousUser]: ... def get_permission_codename(action: str, opts: Options) -> str: ... def update_session_auth_hash(request: HttpRequest, user: AbstractBaseUser) -> None: ... diff --git a/django-stubs/views/generic/edit.pyi b/django-stubs/views/generic/edit.pyi index bd2baee..79e4149 100644 --- a/django-stubs/views/generic/edit.pyi +++ b/django-stubs/views/generic/edit.pyi @@ -8,7 +8,7 @@ from typing_extensions import Literal from django.http import HttpRequest, HttpResponse -_FormT = TypeVar('_FormT', bound=BaseForm) +_FormT = TypeVar("_FormT", bound=BaseForm) class AbstractFormMixin(ContextMixin): initial: Dict[str, Any] = ... diff --git a/tests/typecheck/contrib/auth/test_misc.yml b/tests/typecheck/contrib/auth/test_misc.yml new file mode 100644 index 0000000..b9207ce --- /dev/null +++ b/tests/typecheck/contrib/auth/test_misc.yml @@ -0,0 +1,15 @@ +- case: test_request_session + main: | + from django.contrib.auth import get_user + from django.contrib.sessions.middleware import SessionMiddleware + from django.http import HttpRequest + + request = HttpRequest() + SessionMiddleware().process_request(request) + get_user(request) +- case: test_client_session + main: | + from django.contrib.auth import get_user + from django.test import Client + + get_user(Client())