You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

118 lines
3.1 KiB

  1. import os
  2. import uuid
  3. import pytest
  4. from keycloak import KeycloakAdmin, KeycloakOpenID
  5. class KeycloakTestEnv(object):
  6. def __init__(
  7. self,
  8. host: str = os.environ["KEYCLOAK_HOST"],
  9. port: str = os.environ["KEYCLOAK_PORT"],
  10. username: str = os.environ["KEYCLOAK_ADMIN"],
  11. password: str = os.environ["KEYCLOAK_ADMIN_PASSWORD"],
  12. ):
  13. self.KEYCLOAK_HOST = host
  14. self.KEYCLOAK_PORT = port
  15. self.KEYCLOAK_ADMIN = username
  16. self.KEYCLOAK_ADMIN_PASSWORD = password
  17. @property
  18. def KEYCLOAK_HOST(self):
  19. return self._KEYCLOAK_HOST
  20. @KEYCLOAK_HOST.setter
  21. def KEYCLOAK_HOST(self, value: str):
  22. self._KEYCLOAK_HOST = value
  23. @property
  24. def KEYCLOAK_PORT(self):
  25. return self._KEYCLOAK_PORT
  26. @KEYCLOAK_PORT.setter
  27. def KEYCLOAK_PORT(self, value: str):
  28. self._KEYCLOAK_PORT = value
  29. @property
  30. def KEYCLOAK_ADMIN(self):
  31. return self._KEYCLOAK_ADMIN
  32. @KEYCLOAK_ADMIN.setter
  33. def KEYCLOAK_ADMIN(self, value: str):
  34. self._KEYCLOAK_ADMIN = value
  35. @property
  36. def KEYCLOAK_ADMIN_PASSWORD(self):
  37. return self._KEYCLOAK_ADMIN_PASSWORD
  38. @KEYCLOAK_ADMIN_PASSWORD.setter
  39. def KEYCLOAK_ADMIN_PASSWORD(self, value: str):
  40. self._KEYCLOAK_ADMIN_PASSWORD = value
  41. @pytest.fixture
  42. def env():
  43. return KeycloakTestEnv()
  44. @pytest.fixture
  45. def admin(env: KeycloakTestEnv):
  46. return KeycloakAdmin(
  47. server_url=f"http://{env.KEYCLOAK_HOST}:{env.KEYCLOAK_PORT}",
  48. username=env.KEYCLOAK_ADMIN,
  49. password=env.KEYCLOAK_ADMIN_PASSWORD,
  50. )
  51. @pytest.fixture
  52. def oid(env: KeycloakTestEnv, realm: str, admin: KeycloakAdmin):
  53. # Set the realm
  54. admin.realm_name = realm
  55. # Create client
  56. client = str(uuid.uuid4())
  57. client_id = admin.create_client(payload={"name": client, "clientId": client})
  58. # Return OID
  59. yield KeycloakOpenID(
  60. server_url=f"http://{env.KEYCLOAK_HOST}:{env.KEYCLOAK_PORT}",
  61. realm_name=realm,
  62. client_id=client,
  63. )
  64. # Cleanup
  65. admin.delete_client(client_id=client_id)
  66. @pytest.fixture
  67. def realm(admin: KeycloakAdmin) -> str:
  68. realm_name = str(uuid.uuid4())
  69. admin.create_realm(payload={"realm": realm_name})
  70. yield realm_name
  71. admin.delete_realm(realm_name=realm_name)
  72. @pytest.fixture
  73. def user(admin: KeycloakAdmin, realm: str) -> str:
  74. admin.realm_name = realm
  75. username = str(uuid.uuid4())
  76. user_id = admin.create_user(payload={"username": username, "email": f"{username}@test.test"})
  77. yield user_id
  78. admin.delete_user(user_id=user_id)
  79. @pytest.fixture
  80. def group(admin: KeycloakAdmin, realm: str) -> str:
  81. admin.realm_name = realm
  82. group_name = str(uuid.uuid4())
  83. group_id = admin.create_group(payload={"name": group_name})
  84. yield group_id
  85. admin.delete_group(group_id=group_id)
  86. @pytest.fixture
  87. def client(admin: KeycloakAdmin, realm: str) -> str:
  88. admin.realm_name = realm
  89. client = str(uuid.uuid4())
  90. client_id = admin.create_client(payload={"name": client, "clientId": client})
  91. yield client_id
  92. admin.delete_client(client_id=client_id)