import pytest from app.core.rate_limit import limiter @pytest.mark.asyncio async def test_login_unbekannter_benutzer_ist_401(client): """jwt-expert-Review-Fund: konstante Antwortzeit auch ohne existierenden Login (verify_password_konstante_zeit) - hier nur der Statuscode, die Timing-Eigenschaft selbst ist nicht sinnvoll per Unit-Test prüfbar.""" response = await client.post( "/api/v1/auth/login", data={"username": "gibt-es-nicht", "password": "irgendwas"}, ) assert response.status_code == 401 @pytest.mark.asyncio async def test_login_rate_limit(client, mitarbeiter_user): """owasp-Review-Fund: App-seitiges Rate-Limit als Verteidigung in der Tiefe, unabhängig vom nginx-Limit. In conftest.py global deaktiviert (sonst würden andere Tests, die login() mehrfach aufrufen, selbst geblockt) - hier gezielt für diesen einen Test wieder aktiviert.""" limiter.enabled = True try: for _ in range(5): response = await client.post( "/api/v1/auth/login", data={"username": "mitarbeiter1", "password": "falsch"}, ) assert response.status_code == 401 blockiert = await client.post( "/api/v1/auth/login", data={"username": "mitarbeiter1", "password": "falsch"}, ) assert blockiert.status_code == 429 finally: limiter.enabled = False @pytest.mark.asyncio async def test_login_success(client, mitarbeiter_user): response = await client.post( "/api/v1/auth/login", data={"username": "mitarbeiter1", "password": "test-passwort-123"}, ) assert response.status_code == 200 body = response.json() assert body["token_type"] == "bearer" assert body["access_token"] @pytest.mark.asyncio async def test_login_wrong_password(client, mitarbeiter_user): response = await client.post( "/api/v1/auth/login", data={"username": "mitarbeiter1", "password": "falsch"}, ) assert response.status_code == 401 @pytest.mark.asyncio async def test_me_requires_token(client): response = await client.get("/api/v1/auth/me") assert response.status_code == 401 @pytest.mark.asyncio async def test_me_returns_current_user(client, mitarbeiter_user): login_response = await client.post( "/api/v1/auth/login", data={"username": "mitarbeiter1", "password": "test-passwort-123"}, ) token = login_response.json()["access_token"] response = await client.get( "/api/v1/auth/me", headers={"Authorization": f"Bearer {token}"} ) assert response.status_code == 200 body = response.json() assert body["login"] == "mitarbeiter1" assert body["rollen"] == ["mitarbeiter"]