test_admin_auth.py 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. from fastapi.testclient import TestClient
  2. from app.core.config import Settings
  3. from app.core.passwords import PasswordService
  4. from app.domains.identity.models import AdminUser
  5. from app.domains.identity.repository import InMemoryIdentityRepository
  6. from app.main import create_app
  7. def test_admin_login_returns_roles_permissions_and_data_scope() -> None:
  8. settings = Settings(
  9. app_env="test",
  10. jwt_access_secret="a" * 32,
  11. jwt_refresh_secret="b" * 32,
  12. field_encryption_key="c" * 32,
  13. )
  14. repository = InMemoryIdentityRepository()
  15. repository.save_admin_user(
  16. AdminUser(
  17. id="01ADMIN0000000000000000001",
  18. username="admin",
  19. password_hash=PasswordService().hash("zaq1XSW@"),
  20. display_name="系统管理员",
  21. status="ACTIVE",
  22. roles=("super_admin",),
  23. permissions=("role:read", "role:write", "product:read"),
  24. data_scope="ALL",
  25. )
  26. )
  27. app = create_app(settings=settings, identity_repository=repository)
  28. with TestClient(app) as client:
  29. login = client.post(
  30. "/api/v1/admin/auth/login",
  31. json={"username": "admin", "password": "zaq1XSW@"},
  32. )
  33. assert login.status_code == 200
  34. token = login.json()["data"]["tokens"]["access_token"]
  35. profile = client.get(
  36. "/api/v1/admin/me",
  37. headers={"Authorization": f"Bearer {token}"},
  38. )
  39. assert profile.status_code == 200
  40. assert profile.json()["data"]["roles"] == ["super_admin"]
  41. assert profile.json()["data"]["permissions"] == [
  42. "product:read",
  43. "role:read",
  44. "role:write",
  45. ]
  46. assert profile.json()["data"]["data_scope"] == "ALL"
  47. def test_admin_refresh_cookie_restores_and_logout_revokes_session() -> None:
  48. settings = Settings(
  49. app_env="test",
  50. jwt_access_secret="a" * 32,
  51. jwt_refresh_secret="b" * 32,
  52. field_encryption_key="c" * 32,
  53. )
  54. repository = InMemoryIdentityRepository()
  55. repository.save_admin_user(
  56. AdminUser(
  57. id="01ADMIN0000000000000000001",
  58. username="admin",
  59. password_hash=PasswordService().hash("zaq1XSW@"),
  60. display_name="系统管理员",
  61. status="ACTIVE",
  62. roles=("SUPER_ADMIN",),
  63. permissions=("*",),
  64. data_scope="ALL",
  65. )
  66. )
  67. app = create_app(settings=settings, identity_repository=repository)
  68. with TestClient(app) as client:
  69. login = client.post(
  70. "/api/v1/admin/auth/login",
  71. json={"username": "admin", "password": "zaq1XSW@"},
  72. )
  73. assert "zbt_admin_refresh=" in login.headers["set-cookie"]
  74. assert "HttpOnly" in login.headers["set-cookie"]
  75. refreshed = client.post("/api/v1/admin/auth/refresh")
  76. assert refreshed.status_code == 200
  77. access_token = refreshed.json()["data"]["tokens"]["access_token"]
  78. logout = client.post(
  79. "/api/v1/admin/auth/logout",
  80. headers={"Authorization": f"Bearer {access_token}"},
  81. )
  82. assert logout.status_code == 200
  83. profile = client.get(
  84. "/api/v1/admin/me",
  85. headers={"Authorization": f"Bearer {access_token}"},
  86. )
  87. assert profile.status_code == 401