test: add integration tests for auth and account routes
This commit is contained in:
parent
396ed3d029
commit
1b43dc04c6
132
tests/integration/test_auth.py
Normal file
132
tests/integration/test_auth.py
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
import pytest
|
||||||
|
from httpx import ASGITransport, AsyncClient
|
||||||
|
|
||||||
|
from proxy_pool.app import create_app
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
async def client():
|
||||||
|
app = create_app()
|
||||||
|
async with app.router.lifespan_context(app):
|
||||||
|
transport = ASGITransport(app=app)
|
||||||
|
async with AsyncClient(transport=transport, base_url="http://test") as client:
|
||||||
|
yield client
|
||||||
|
|
||||||
|
|
||||||
|
async def register_user(client, email=None):
|
||||||
|
"""Helper to register and return (user_data, raw_api_key)."""
|
||||||
|
import uuid
|
||||||
|
email = email or f"test-{uuid.uuid4().hex[:8]}@example.com"
|
||||||
|
resp = await client.post(
|
||||||
|
"/auth/register",
|
||||||
|
json={"email": email, "display_name": "Test User"},
|
||||||
|
)
|
||||||
|
data = resp.json()
|
||||||
|
return data, data["api_key"]["key"]
|
||||||
|
|
||||||
|
|
||||||
|
def auth_header(api_key: str) -> dict:
|
||||||
|
return {"Authorization": f"Bearer {api_key}"}
|
||||||
|
|
||||||
|
|
||||||
|
class TestRegistration:
|
||||||
|
async def test_register_returns_user_and_key(self, client):
|
||||||
|
data, raw_key = await register_user(client)
|
||||||
|
|
||||||
|
assert data["user"]["email"].endswith("@example.com")
|
||||||
|
assert data["user"]["is_active"] is True
|
||||||
|
assert raw_key.startswith("pp_")
|
||||||
|
assert data["api_key"]["label"] == "default"
|
||||||
|
|
||||||
|
async def test_register_duplicate_email(self, client):
|
||||||
|
email = "dupe@example.com"
|
||||||
|
await register_user(client, email=email)
|
||||||
|
|
||||||
|
resp = await client.post(
|
||||||
|
"/auth/register",
|
||||||
|
json={"email": email},
|
||||||
|
)
|
||||||
|
assert resp.status_code == 409
|
||||||
|
|
||||||
|
|
||||||
|
class TestAuthentication:
|
||||||
|
async def test_authenticated_request(self, client):
|
||||||
|
_, api_key = await register_user(client)
|
||||||
|
|
||||||
|
resp = await client.get("/account", headers=auth_header(api_key))
|
||||||
|
|
||||||
|
assert resp.status_code == 200
|
||||||
|
assert resp.json()["is_active"] is True
|
||||||
|
|
||||||
|
async def test_invalid_key_rejected(self, client):
|
||||||
|
resp = await client.get(
|
||||||
|
"/account",
|
||||||
|
headers=auth_header("pp_bogus_key_that_does_not_exist"),
|
||||||
|
)
|
||||||
|
|
||||||
|
assert resp.status_code == 401
|
||||||
|
|
||||||
|
async def test_missing_key_rejected(self, client):
|
||||||
|
resp = await client.get("/account")
|
||||||
|
|
||||||
|
assert resp.status_code == 401
|
||||||
|
|
||||||
|
|
||||||
|
class TestCredits:
|
||||||
|
async def test_initial_credits(self, client):
|
||||||
|
_, api_key = await register_user(client)
|
||||||
|
|
||||||
|
resp = await client.get(
|
||||||
|
"/account/credits",
|
||||||
|
headers=auth_header(api_key),
|
||||||
|
)
|
||||||
|
|
||||||
|
assert resp.status_code == 200
|
||||||
|
data = resp.json()
|
||||||
|
assert data["balance"] == 100
|
||||||
|
assert len(data["recent_transactions"]) == 1
|
||||||
|
assert data["recent_transactions"][0]["tx_type"] == "purchase"
|
||||||
|
|
||||||
|
|
||||||
|
class TestApiKeyManagement:
|
||||||
|
async def test_create_additional_key(self, client):
|
||||||
|
_, api_key = await register_user(client)
|
||||||
|
|
||||||
|
resp = await client.post(
|
||||||
|
"/auth/keys",
|
||||||
|
headers=auth_header(api_key),
|
||||||
|
json={"label": "ci-server"},
|
||||||
|
)
|
||||||
|
|
||||||
|
assert resp.status_code == 201
|
||||||
|
assert resp.json()["label"] == "ci-server"
|
||||||
|
assert resp.json()["key"].startswith("pp_")
|
||||||
|
|
||||||
|
async def test_list_keys(self, client):
|
||||||
|
_, api_key = await register_user(client)
|
||||||
|
|
||||||
|
resp = await client.get(
|
||||||
|
"/auth/keys",
|
||||||
|
headers=auth_header(api_key),
|
||||||
|
)
|
||||||
|
|
||||||
|
assert resp.status_code == 200
|
||||||
|
assert len(resp.json()) >= 1
|
||||||
|
|
||||||
|
async def test_revoke_key(self, client):
|
||||||
|
_, api_key = await register_user(client)
|
||||||
|
|
||||||
|
# Create a second key so we can revoke it
|
||||||
|
create_resp = await client.post(
|
||||||
|
"/auth/keys",
|
||||||
|
headers=auth_header(api_key),
|
||||||
|
json={"label": "throwaway"},
|
||||||
|
)
|
||||||
|
key_id = create_resp.json()["id"]
|
||||||
|
|
||||||
|
# Revoke it
|
||||||
|
del_resp = await client.delete(
|
||||||
|
f"/auth/keys/{key_id}",
|
||||||
|
headers=auth_header(api_key),
|
||||||
|
)
|
||||||
|
assert del_resp.status_code == 204
|
||||||
Loading…
x
Reference in New Issue
Block a user