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.

199 lines
5.3 KiB

  1. """Fixtures for tests."""
  2. import os
  3. import uuid
  4. import pytest
  5. from keycloak import KeycloakAdmin, KeycloakOpenID
  6. class KeycloakTestEnv(object):
  7. """Wrapper for test Keycloak connection configuration.
  8. :param host: Hostname
  9. :type host: str
  10. :param port: Port
  11. :type port: str
  12. :param username: Admin username
  13. :type username: str
  14. :param password: Admin password
  15. :type password: str
  16. """
  17. def __init__(
  18. self,
  19. host: str = os.environ["KEYCLOAK_HOST"],
  20. port: str = os.environ["KEYCLOAK_PORT"],
  21. username: str = os.environ["KEYCLOAK_ADMIN"],
  22. password: str = os.environ["KEYCLOAK_ADMIN_PASSWORD"],
  23. ):
  24. """Init method."""
  25. self.KEYCLOAK_HOST = host
  26. self.KEYCLOAK_PORT = port
  27. self.KEYCLOAK_ADMIN = username
  28. self.KEYCLOAK_ADMIN_PASSWORD = password
  29. @property
  30. def KEYCLOAK_HOST(self):
  31. """Hostname getter."""
  32. return self._KEYCLOAK_HOST
  33. @KEYCLOAK_HOST.setter
  34. def KEYCLOAK_HOST(self, value: str):
  35. """Hostname setter."""
  36. self._KEYCLOAK_HOST = value
  37. @property
  38. def KEYCLOAK_PORT(self):
  39. """Port getter."""
  40. return self._KEYCLOAK_PORT
  41. @KEYCLOAK_PORT.setter
  42. def KEYCLOAK_PORT(self, value: str):
  43. """Port setter."""
  44. self._KEYCLOAK_PORT = value
  45. @property
  46. def KEYCLOAK_ADMIN(self):
  47. """Admin username getter."""
  48. return self._KEYCLOAK_ADMIN
  49. @KEYCLOAK_ADMIN.setter
  50. def KEYCLOAK_ADMIN(self, value: str):
  51. """Admin username setter."""
  52. self._KEYCLOAK_ADMIN = value
  53. @property
  54. def KEYCLOAK_ADMIN_PASSWORD(self):
  55. """Admin password getter."""
  56. return self._KEYCLOAK_ADMIN_PASSWORD
  57. @KEYCLOAK_ADMIN_PASSWORD.setter
  58. def KEYCLOAK_ADMIN_PASSWORD(self, value: str):
  59. """Admin password setter."""
  60. self._KEYCLOAK_ADMIN_PASSWORD = value
  61. @pytest.fixture
  62. def env():
  63. """Fixture for getting the test environment configuration object."""
  64. return KeycloakTestEnv()
  65. @pytest.fixture
  66. def admin(env: KeycloakTestEnv):
  67. """Fixture for initialized KeycloakAdmin class."""
  68. return KeycloakAdmin(
  69. server_url=f"http://{env.KEYCLOAK_HOST}:{env.KEYCLOAK_PORT}",
  70. username=env.KEYCLOAK_ADMIN,
  71. password=env.KEYCLOAK_ADMIN_PASSWORD,
  72. )
  73. @pytest.fixture
  74. def oid(env: KeycloakTestEnv, realm: str, admin: KeycloakAdmin):
  75. """Fixture for initialized KeycloakOpenID class."""
  76. # Set the realm
  77. admin.realm_name = realm
  78. # Create client
  79. client = str(uuid.uuid4())
  80. client_id = admin.create_client(
  81. payload={
  82. "name": client,
  83. "clientId": client,
  84. "enabled": True,
  85. "publicClient": True,
  86. "protocol": "openid-connect",
  87. }
  88. )
  89. # Return OID
  90. yield KeycloakOpenID(
  91. server_url=f"http://{env.KEYCLOAK_HOST}:{env.KEYCLOAK_PORT}",
  92. realm_name=realm,
  93. client_id=client,
  94. )
  95. # Cleanup
  96. admin.delete_client(client_id=client_id)
  97. @pytest.fixture
  98. def oid_with_credentials(env: KeycloakTestEnv, realm: str, admin: KeycloakAdmin):
  99. """Fixture for an initialized KeycloakOpenID class and a random user credentials."""
  100. # Set the realm
  101. admin.realm_name = realm
  102. # Create client
  103. client = str(uuid.uuid4())
  104. client_id = admin.create_client(
  105. payload={
  106. "name": client,
  107. "clientId": client,
  108. "enabled": True,
  109. "publicClient": True,
  110. "protocol": "openid-connect",
  111. }
  112. )
  113. # Create user
  114. username = str(uuid.uuid4())
  115. password = str(uuid.uuid4())
  116. user_id = admin.create_user(
  117. payload={
  118. "username": username,
  119. "email": f"{username}@test.test",
  120. "enabled": True,
  121. "credentials": [{"type": "password", "value": password}],
  122. }
  123. )
  124. yield (
  125. KeycloakOpenID(
  126. server_url=f"http://{env.KEYCLOAK_HOST}:{env.KEYCLOAK_PORT}",
  127. realm_name=realm,
  128. client_id=client,
  129. ),
  130. username,
  131. password,
  132. )
  133. # Cleanup
  134. admin.delete_client(client_id=client_id)
  135. admin.delete_user(user_id=user_id)
  136. @pytest.fixture
  137. def realm(admin: KeycloakAdmin) -> str:
  138. """Fixture for a new random realm."""
  139. realm_name = str(uuid.uuid4())
  140. admin.create_realm(payload={"realm": realm_name, "enabled": True})
  141. yield realm_name
  142. admin.delete_realm(realm_name=realm_name)
  143. @pytest.fixture
  144. def user(admin: KeycloakAdmin, realm: str) -> str:
  145. """Fixture for a new random user."""
  146. admin.realm_name = realm
  147. username = str(uuid.uuid4())
  148. user_id = admin.create_user(payload={"username": username, "email": f"{username}@test.test"})
  149. yield user_id
  150. admin.delete_user(user_id=user_id)
  151. @pytest.fixture
  152. def group(admin: KeycloakAdmin, realm: str) -> str:
  153. """Fixture for a new random group."""
  154. admin.realm_name = realm
  155. group_name = str(uuid.uuid4())
  156. group_id = admin.create_group(payload={"name": group_name})
  157. yield group_id
  158. admin.delete_group(group_id=group_id)
  159. @pytest.fixture
  160. def client(admin: KeycloakAdmin, realm: str) -> str:
  161. """Fixture for a new random client."""
  162. admin.realm_name = realm
  163. client = str(uuid.uuid4())
  164. client_id = admin.create_client(payload={"name": client, "clientId": client})
  165. yield client_id
  166. admin.delete_client(client_id=client_id)