Spaces:
Sleeping
Sleeping
File size: 4,387 Bytes
f559cc0 | 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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | from __future__ import annotations
import asyncio
import os
import sys
import tempfile
from pathlib import Path
import pytest
from fastapi.testclient import TestClient
ROOT = Path(__file__).resolve().parents[2]
sys.path.insert(0, str(ROOT / "backend"))
def _build_client() -> TestClient:
tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".db")
tmp.close()
os.environ["DATABASE_URL"] = f"sqlite+aiosqlite:///{tmp.name}"
os.environ["JWT_SECRET_KEY"] = "test-secret-key-for-auth-api"
from app.database import create_tables
from app.main import app
asyncio.run(create_tables())
return TestClient(app)
def test_register_and_login_accept_passwords_longer_than_72_bytes() -> None:
client = _build_client()
password = "A" * 100
register = client.post(
"/api/auth/register",
json={
"email": "auth-long@example.com",
"password": password,
"full_name": "Auth Long",
},
)
assert register.status_code == 201, register.text
tokens = register.json()
assert tokens["access_token"]
assert tokens["refresh_token"]
login = client.post(
"/api/auth/login",
json={
"email": "auth-long@example.com",
"password": password,
},
)
assert login.status_code == 200, login.text
logged_in = login.json()
assert logged_in["access_token"]
assert logged_in["refresh_token"]
def test_refresh_returns_new_access_token_for_registered_user() -> None:
client = _build_client()
register = client.post(
"/api/auth/register",
json={
"email": "refresh-user@example.com",
"password": "refresh-password-123",
"full_name": "Refresh User",
},
)
assert register.status_code == 201, register.text
refresh_token = register.json()["refresh_token"]
refreshed = client.post(
"/api/auth/refresh",
json={"refresh_token": refresh_token},
)
assert refreshed.status_code == 200, refreshed.text
payload = refreshed.json()
assert payload["access_token"]
assert payload["refresh_token"]
def test_google_login_creates_new_user_and_returns_tokens(monkeypatch: pytest.MonkeyPatch) -> None:
client = _build_client()
from app.api import auth as auth_api
monkeypatch.setattr(
auth_api,
"_verify_google_id_token",
lambda credential: auth_api.GoogleIdentity(
email="google-user@example.com",
email_verified=True,
full_name="Google User",
),
)
response = client.post(
"/api/auth/google",
json={"credential": "fake-google-token-value-that-is-long-enough"},
)
assert response.status_code == 200, response.text
payload = response.json()
assert payload["access_token"]
assert payload["refresh_token"]
me = client.get(
"/api/auth/me",
headers={"Authorization": f"Bearer {payload['access_token']}"},
)
assert me.status_code == 200, me.text
profile = me.json()
assert profile["email"] == "google-user@example.com"
assert profile["full_name"] == "Google User"
def test_google_login_reuses_existing_user_record(monkeypatch: pytest.MonkeyPatch) -> None:
client = _build_client()
register = client.post(
"/api/auth/register",
json={
"email": "reuse-google@example.com",
"password": "reuse-password-123",
"full_name": "",
},
)
assert register.status_code == 201, register.text
from app.api import auth as auth_api
monkeypatch.setattr(
auth_api,
"_verify_google_id_token",
lambda credential: auth_api.GoogleIdentity(
email="reuse-google@example.com",
email_verified=True,
full_name="Linked Google User",
),
)
response = client.post(
"/api/auth/google",
json={"credential": "another-fake-google-token-value"},
)
assert response.status_code == 200, response.text
me = client.get(
"/api/auth/me",
headers={"Authorization": f"Bearer {response.json()['access_token']}"},
)
assert me.status_code == 200, me.text
profile = me.json()
assert profile["email"] == "reuse-google@example.com"
assert profile["full_name"] == "Linked Google User"
|