1from __future__ import annotations
2
3from http.cookies import SimpleCookie
4from typing import TYPE_CHECKING, Any
5
6from plain.http.request import Request
7from plain.runtime import settings
8from plain.sessions import SessionStore
9from plain.sessions.requests import get_request_session, set_request_session
10
11from .requests import set_request_user
12from .sessions import get_user, login, logout
13
14if TYPE_CHECKING:
15 from plain.test.client import Client
16
17
18def login_client(client: Client, user: Any) -> None:
19 """Log a user into a test client."""
20 request = Request(method="GET", path="/")
21 if client.session:
22 session = client.session
23 else:
24 session = SessionStore()
25 set_request_session(request, session)
26 login(request, user)
27 session = get_request_session(request)
28 session.save()
29 session_cookie = settings.SESSION_COOKIE_NAME
30 client.cookies[session_cookie] = session.session_key
31 cookie_data = {
32 "max-age": None,
33 "path": "/",
34 "domain": settings.SESSION_COOKIE_DOMAIN,
35 "secure": settings.SESSION_COOKIE_SECURE or None,
36 "expires": None,
37 }
38 client.cookies[session_cookie].update(cookie_data)
39
40
41def logout_client(client: Client) -> None:
42 """Log out a user from a test client."""
43 request = Request(method="GET", path="/")
44 if client.session:
45 session = client.session
46 set_request_session(request, session)
47 user = get_user(request)
48 set_request_user(request, user)
49 else:
50 session = SessionStore()
51 set_request_session(request, session)
52 logout(request)
53 client.cookies = SimpleCookie()