aboutsummaryrefslogtreecommitdiff
path: root/tests/http/test_auth.py
blob: 8a625bf76fd4d3958652895c510b1377a938c6cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import secrets
from urllib.parse import parse_qs, urlparse

import pytest
from httpx import AsyncClient

from jb.api.auth import SESSION_COOKIE_NAME
from jb.dependencies import get_gr_api_manager
from jb.main import app
from jb.models.auth import User


class FakeGRApiManager:
    def __init__(self):
        self.users: dict[str, User] = {}

    def ensure_user_exists(self, user: User) -> User:
        self.users.setdefault(user.product_user_id, user)
        return self.users[user.product_user_id]

    def get_user(self, product_user_id: str) -> User:
        return self.users[product_user_id]


@pytest.fixture
def email() -> str:
    email = secrets.token_urlsafe(16) + "@gmail.com"
    return email.lower()


@pytest.fixture
def fake_gr_api_manager():
    manager = FakeGRApiManager()
    app.dependency_overrides[get_gr_api_manager] = lambda: manager
    yield manager
    app.dependency_overrides.pop(get_gr_api_manager, None)


class TestAuth:
    @pytest.mark.anyio
    async def test_magic_link(
        self,
        httpxclient: AsyncClient,
        fake_gr_api_manager: FakeGRApiManager,
        email: str,
    ):
        client = httpxclient

        res = await client.post(
            "/auth/magic-link/request", json={"email": email}
        )
        d = res.json()
        assert res.status_code == 200
        assert d["magic_link"]

        token = parse_qs(urlparse(d["magic_link"]).query)["token"][0]

        url = "/auth/magic-link/exchange"
        body = {"token": token}
        res = await client.post(url, json=body)
        assert res.status_code == 204
        assert client.cookies.get(SESSION_COOKIE_NAME)

        res = await client.get("/auth/session")
        assert res.status_code == 200
        assert res.json()["email"] == email