test_admin_auth.py 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. from fastapi.testclient import TestClient
  2. from zbt.core.config import Settings
  3. from zbt.core.passwords import PasswordService
  4. from zbt.domains.identity.models import AdminUser
  5. from zbt.domains.identity.repository import InMemoryIdentityRepository
  6. from zbt.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