aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/http/test_auth.py66
1 files changed, 66 insertions, 0 deletions
diff --git a/tests/http/test_auth.py b/tests/http/test_auth.py
new file mode 100644
index 0000000..8a625bf
--- /dev/null
+++ b/tests/http/test_auth.py
@@ -0,0 +1,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