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.

137 lines
4.8 KiB

  1. """Test module for KeycloakOpenID."""
  2. from unittest import mock
  3. from keycloak.authorization import Authorization
  4. from keycloak.connection import ConnectionManager
  5. from keycloak.keycloak_openid import KeycloakOpenID
  6. def test_keycloak_openid_init(env):
  7. """Test KeycloakOpenId's init method."""
  8. oid = KeycloakOpenID(
  9. server_url=f"http://{env.KEYCLOAK_HOST}:{env.KEYCLOAK_PORT}",
  10. realm_name="master",
  11. client_id="admin-cli",
  12. )
  13. assert oid.client_id == "admin-cli"
  14. assert oid.client_secret_key is None
  15. assert oid.realm_name == "master"
  16. assert isinstance(oid.connection, ConnectionManager)
  17. assert isinstance(oid.authorization, Authorization)
  18. def test_well_known(oid: KeycloakOpenID):
  19. """Test the well_known method."""
  20. res = oid.well_known()
  21. assert res is not None
  22. assert res != dict()
  23. for key in [
  24. "acr_values_supported",
  25. "authorization_encryption_alg_values_supported",
  26. "authorization_encryption_enc_values_supported",
  27. "authorization_endpoint",
  28. "authorization_signing_alg_values_supported",
  29. "backchannel_authentication_endpoint",
  30. "backchannel_authentication_request_signing_alg_values_supported",
  31. "backchannel_logout_session_supported",
  32. "backchannel_logout_supported",
  33. "backchannel_token_delivery_modes_supported",
  34. "check_session_iframe",
  35. "claim_types_supported",
  36. "claims_parameter_supported",
  37. "claims_supported",
  38. "code_challenge_methods_supported",
  39. "device_authorization_endpoint",
  40. "end_session_endpoint",
  41. "frontchannel_logout_session_supported",
  42. "frontchannel_logout_supported",
  43. "grant_types_supported",
  44. "id_token_encryption_alg_values_supported",
  45. "id_token_encryption_enc_values_supported",
  46. "id_token_signing_alg_values_supported",
  47. "introspection_endpoint",
  48. "introspection_endpoint_auth_methods_supported",
  49. "introspection_endpoint_auth_signing_alg_values_supported",
  50. "issuer",
  51. "jwks_uri",
  52. "mtls_endpoint_aliases",
  53. "pushed_authorization_request_endpoint",
  54. "registration_endpoint",
  55. "request_object_encryption_alg_values_supported",
  56. "request_object_encryption_enc_values_supported",
  57. "request_object_signing_alg_values_supported",
  58. "request_parameter_supported",
  59. "request_uri_parameter_supported",
  60. "require_pushed_authorization_requests",
  61. "require_request_uri_registration",
  62. "response_modes_supported",
  63. "response_types_supported",
  64. "revocation_endpoint",
  65. "revocation_endpoint_auth_methods_supported",
  66. "revocation_endpoint_auth_signing_alg_values_supported",
  67. "scopes_supported",
  68. "subject_types_supported",
  69. "tls_client_certificate_bound_access_tokens",
  70. "token_endpoint",
  71. "token_endpoint_auth_methods_supported",
  72. "token_endpoint_auth_signing_alg_values_supported",
  73. "userinfo_encryption_alg_values_supported",
  74. "userinfo_encryption_enc_values_supported",
  75. "userinfo_endpoint",
  76. "userinfo_signing_alg_values_supported",
  77. ]:
  78. assert key in res
  79. def test_auth_url(env, oid: KeycloakOpenID):
  80. """Test the auth_url method."""
  81. res = oid.auth_url(redirect_uri="http://test.test/*")
  82. assert (
  83. res
  84. == f"http://{env.KEYCLOAK_HOST}:{env.KEYCLOAK_PORT}/realms/{oid.realm_name}"
  85. + f"/protocol/openid-connect/auth?client_id={oid.client_id}&response_type=code"
  86. + "&redirect_uri=http://test.test/*"
  87. )
  88. def test_token(oid_with_credentials: tuple[KeycloakOpenID, str, str]):
  89. """Test the token method."""
  90. oid, username, password = oid_with_credentials
  91. token = oid.token(username=username, password=password)
  92. assert token == {
  93. "access_token": mock.ANY,
  94. "expires_in": 300,
  95. "not-before-policy": 0,
  96. "refresh_expires_in": 1800,
  97. "refresh_token": mock.ANY,
  98. "scope": "profile email",
  99. "session_state": mock.ANY,
  100. "token_type": "Bearer",
  101. }
  102. # Test with dummy totp
  103. token = oid.token(username=username, password=password, totp="123456")
  104. assert token == {
  105. "access_token": mock.ANY,
  106. "expires_in": 300,
  107. "not-before-policy": 0,
  108. "refresh_expires_in": 1800,
  109. "refresh_token": mock.ANY,
  110. "scope": "profile email",
  111. "session_state": mock.ANY,
  112. "token_type": "Bearer",
  113. }
  114. # Test with extra param
  115. token = oid.token(username=username, password=password, extra_param="foo")
  116. assert token == {
  117. "access_token": mock.ANY,
  118. "expires_in": 300,
  119. "not-before-policy": 0,
  120. "refresh_expires_in": 1800,
  121. "refresh_token": mock.ANY,
  122. "scope": "profile email",
  123. "session_state": mock.ANY,
  124. "token_type": "Bearer",
  125. }