| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- from fastapi.testclient import TestClient
- from app.core.config import Settings
- from app.core.passwords import PasswordService
- from app.domains.identity.models import AdminUser
- from app.domains.identity.repository import InMemoryIdentityRepository
- from app.main import create_app
- def test_admin_login_returns_roles_permissions_and_data_scope() -> None:
- settings = Settings(
- app_env="test",
- jwt_access_secret="a" * 32,
- jwt_refresh_secret="b" * 32,
- field_encryption_key="c" * 32,
- )
- repository = InMemoryIdentityRepository()
- repository.save_admin_user(
- AdminUser(
- id="01ADMIN0000000000000000001",
- username="admin",
- password_hash=PasswordService().hash("zaq1XSW@"),
- display_name="系统管理员",
- status="ACTIVE",
- roles=("super_admin",),
- permissions=("role:read", "role:write", "product:read"),
- data_scope="ALL",
- )
- )
- app = create_app(settings=settings, identity_repository=repository)
- with TestClient(app) as client:
- login = client.post(
- "/api/v1/admin/auth/login",
- json={"username": "admin", "password": "zaq1XSW@"},
- )
- assert login.status_code == 200
- token = login.json()["data"]["tokens"]["access_token"]
- profile = client.get(
- "/api/v1/admin/me",
- headers={"Authorization": f"Bearer {token}"},
- )
- assert profile.status_code == 200
- assert profile.json()["data"]["roles"] == ["super_admin"]
- assert profile.json()["data"]["permissions"] == [
- "product:read",
- "role:read",
- "role:write",
- ]
- assert profile.json()["data"]["data_scope"] == "ALL"
- def test_admin_refresh_cookie_restores_and_logout_revokes_session() -> None:
- settings = Settings(
- app_env="test",
- jwt_access_secret="a" * 32,
- jwt_refresh_secret="b" * 32,
- field_encryption_key="c" * 32,
- )
- repository = InMemoryIdentityRepository()
- repository.save_admin_user(
- AdminUser(
- id="01ADMIN0000000000000000001",
- username="admin",
- password_hash=PasswordService().hash("zaq1XSW@"),
- display_name="系统管理员",
- status="ACTIVE",
- roles=("SUPER_ADMIN",),
- permissions=("*",),
- data_scope="ALL",
- )
- )
- app = create_app(settings=settings, identity_repository=repository)
- with TestClient(app) as client:
- login = client.post(
- "/api/v1/admin/auth/login",
- json={"username": "admin", "password": "zaq1XSW@"},
- )
- assert "zbt_admin_refresh=" in login.headers["set-cookie"]
- assert "HttpOnly" in login.headers["set-cookie"]
- refreshed = client.post("/api/v1/admin/auth/refresh")
- assert refreshed.status_code == 200
- access_token = refreshed.json()["data"]["tokens"]["access_token"]
- logout = client.post(
- "/api/v1/admin/auth/logout",
- headers={"Authorization": f"Bearer {access_token}"},
- )
- assert logout.status_code == 200
- profile = client.get(
- "/api/v1/admin/me",
- headers={"Authorization": f"Bearer {access_token}"},
- )
- assert profile.status_code == 401
|