"""Tests for admin authentication (T04).""" import pytest from app.auth import create_access_token, verify_token, get_password_hash, verify_password def test_password_hash_and_verify(): plain = "mysecret" hashed = get_password_hash(plain) assert hashed != plain assert verify_password(plain, hashed) is True assert verify_password("wrong", hashed) is False def test_create_and_verify_token(): token = create_access_token({"sub": "admin"}) assert token is not None payload = verify_token(token) assert payload is not None assert payload["sub"] == "admin" def test_verify_invalid_token(): payload = verify_token("invalid.token.here") assert payload is None def test_verify_expired_token(): from datetime import timedelta token = create_access_token({"sub": "admin"}, expires_delta=timedelta(seconds=-1)) payload = verify_token(token) assert payload is None @pytest.mark.asyncio async def test_login_success(client, seeded_admin): """POST /api/admin/login with valid credentials returns 200 with token.""" resp = await client.post("/api/admin/login", json={ "username": "admin", "password": "testpassword", }) assert resp.status_code == 200 data = resp.json() assert "access_token" in data assert data["token_type"] == "bearer" assert "hms_admin_token" in resp.cookies @pytest.mark.asyncio async def test_login_failure_wrong_password(client, seeded_admin): """POST /api/admin/login with wrong password returns 401.""" resp = await client.post("/api/admin/login", json={ "username": "admin", "password": "wrongpassword", }) assert resp.status_code == 401 @pytest.mark.asyncio async def test_login_failure_unknown_user(client, seeded_admin): """POST /api/admin/login with unknown user returns 401.""" resp = await client.post("/api/admin/login", json={ "username": "unknown", "password": "testpassword", }) assert resp.status_code == 401 @pytest.mark.asyncio async def test_me_without_token(client): """GET /api/admin/me without token returns 401.""" resp = await client.get("/api/admin/me") assert resp.status_code == 401 @pytest.mark.asyncio async def test_me_with_valid_token(client, seeded_admin): """GET /api/admin/me with valid token returns 200 with username.""" # Login first login_resp = await client.post("/api/admin/login", json={ "username": "admin", "password": "testpassword", }) token = login_resp.json()["access_token"] resp = await client.get("/api/admin/me", cookies={"hms_admin_token": token}) assert resp.status_code == 200 assert resp.json()["username"] == "admin"