test_auth_identity_service.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. from pathlib import Path
  2. from tests.conftest import build_fastapi_test_client, prepare_known_service_import
  3. def test_identity_bootstraps_demo_user_for_frontend_login(
  4. tmp_path: Path,
  5. monkeypatch,
  6. ) -> None:
  7. prepare_known_service_import("auth-service")
  8. from app.bootstrap.app import create_app
  9. from app.db.models import Base
  10. from sqlalchemy import create_engine
  11. database_url = f"sqlite:///{tmp_path / 'demo-auth.db'}"
  12. monkeypatch.setenv("AGENT_PLATFORM_DATABASE_URL", database_url)
  13. engine = create_engine(database_url, connect_args={"check_same_thread": False})
  14. Base.metadata.create_all(engine)
  15. app = create_app()
  16. client = build_fastapi_test_client(app)
  17. response = client.post(
  18. "/identity/auth/login",
  19. json={"username": "demo-user", "password": "demo-password"},
  20. )
  21. assert response.status_code == 200
  22. payload = response.json()
  23. assert payload["data"]["accessToken"]
  24. assert payload["data"]["user"]["username"] == "demo-user"
  25. def test_identity_post_contract_supports_login_permissions_and_api_keys(
  26. tmp_path: Path,
  27. monkeypatch,
  28. ) -> None:
  29. prepare_known_service_import("auth-service")
  30. from app.bootstrap.app import create_app
  31. from app.db.models import Base
  32. from app.domain.repositories import RoleAssignmentRepository, RoleRepository, UserRepository
  33. from app.infrastructure.passwords import hash_password
  34. from core_db import create_session_factory
  35. from sqlalchemy import create_engine
  36. database_url = f"sqlite:///{tmp_path / 'auth.db'}"
  37. monkeypatch.setenv("AGENT_PLATFORM_DATABASE_URL", database_url)
  38. engine = create_engine(database_url, connect_args={"check_same_thread": False})
  39. Base.metadata.create_all(engine)
  40. app = create_app()
  41. app.state.session_factory = create_session_factory(engine)
  42. client = build_fastapi_test_client(app)
  43. session_factory = create_session_factory(engine)
  44. with session_factory() as db:
  45. user = UserRepository(db).create(
  46. username="demo",
  47. password_hash=hash_password("super-secret"),
  48. display_name="Demo User",
  49. email="demo@example.com",
  50. metadata_json={"source": "test"},
  51. )
  52. role = RoleRepository(db).create(
  53. code="admin",
  54. name="Admin",
  55. description="Platform admin",
  56. permissions_json=[],
  57. )
  58. RoleAssignmentRepository(db).create(
  59. user_id=user.id,
  60. role_id=role.id,
  61. scope_type=None,
  62. scope_id=None,
  63. expires_time=None,
  64. )
  65. user_id = user.id
  66. role_id = role.id
  67. binding_response = client.post(
  68. "/identity/rolePermissionBindings/add",
  69. json={
  70. "roleId": role_id,
  71. "permission": "agents:*",
  72. },
  73. )
  74. assert binding_response.status_code == 200
  75. binding_payload = binding_response.json()
  76. assert binding_payload["success"] is True
  77. assert binding_payload["data"]["roleId"] == role_id
  78. login_response = client.post(
  79. "/identity/auth/login",
  80. json={"username": "demo", "password": "super-secret"},
  81. )
  82. assert login_response.status_code == 200
  83. login_payload = login_response.json()
  84. assert login_payload["data"]["accessToken"]
  85. assert login_payload["data"]["user"]["displayName"] == "Demo User"
  86. assert "createdTime" in login_payload["data"]["user"]
  87. token = login_payload["data"]["accessToken"]
  88. me_response = client.post(
  89. "/identity/auth/me",
  90. headers={"Authorization": f"Bearer {token}"},
  91. json={},
  92. )
  93. assert me_response.status_code == 200
  94. me_payload = me_response.json()
  95. assert me_payload["data"]["user"]["id"] == user_id
  96. assert me_payload["data"]["permissions"] == ["agents:*"]
  97. permission_response = client.post(
  98. "/identity/permissions/check",
  99. json={
  100. "userId": user_id,
  101. "permission": "agents:create",
  102. },
  103. )
  104. assert permission_response.status_code == 200
  105. assert permission_response.json()["data"]["allowed"] is True
  106. api_key_response = client.post(
  107. "/identity/apiKeys/create",
  108. json={"name": "Gateway Test Key", "scopes": "agents:read"},
  109. )
  110. assert api_key_response.status_code == 200
  111. api_key_payload = api_key_response.json()["data"]
  112. assert api_key_payload["secret"].startswith("agp_")
  113. assert api_key_payload["apiKey"]["keyPrefix"]
  114. api_keys_response = client.post("/identity/apiKeys/list", json={"page": 1, "pageSize": 20})
  115. assert api_keys_response.status_code == 200
  116. assert api_keys_response.json()["data"]["total"] == 1