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()