Skip to content

Commit fc184c7

Browse files
committed
Fix python-keycloak==7.1 tests compatibility
1 parent dca6c4b commit fc184c7

3 files changed

Lines changed: 42 additions & 1 deletion

File tree

tests/test_unit/test_auth/auth_fixtures/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from tests.test_unit.test_auth.auth_fixtures.keycloak_fixture import (
22
create_session_cookie,
33
mock_keycloak_api,
4+
mock_keycloak_certs,
45
mock_keycloak_introspect_token,
56
mock_keycloak_logout,
67
mock_keycloak_realm,
@@ -12,6 +13,7 @@
1213
__all__ = [
1314
"create_session_cookie",
1415
"mock_keycloak_api",
16+
"mock_keycloak_certs",
1517
"mock_keycloak_introspect_token",
1618
"mock_keycloak_logout",
1719
"mock_keycloak_realm",

tests/test_unit/test_auth/auth_fixtures/keycloak_fixture.py

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import base64
12
import json
3+
import secrets
24
import time
35
from base64 import b64encode
46

@@ -29,7 +31,6 @@ def rsa_keys():
2931
encryption_algorithm=NoEncryption(),
3032
)
3133
public_key = private_key.public_key()
32-
3334
return {
3435
"private_key": private_key,
3536
"private_pem": private_pem,
@@ -209,3 +210,37 @@ def _mock_keycloak_introspect_token(user):
209210
)
210211

211212
return _mock_keycloak_introspect_token
213+
214+
215+
@pytest.fixture
216+
def mock_keycloak_certs(settings, rsa_keys, mock_keycloak_api):
217+
keycloak_settings = settings.auth.model_dump()["keycloak"]
218+
api_url = keycloak_settings["api_url"]
219+
realm_name = keycloak_settings["client_id"]
220+
realm_url = f"{api_url}/realms/{realm_name}"
221+
certs_url = f"{realm_url}/protocol/openid-connect/certs"
222+
223+
def encode_number_base64(n: int):
224+
return base64.b64encode(n.to_bytes((n.bit_length() + 7) // 8, byteorder="big")).decode("utf-8")
225+
226+
# return public key in Keycloak JWK format
227+
# https://github.com/marcospereirampj/python-keycloak/pull/704/changes
228+
public_key = rsa_keys["public_key"]
229+
payload = {
230+
"keys": [
231+
{
232+
"kid": secrets.token_hex(16),
233+
"kty": "RSA",
234+
"alg": "RS256",
235+
"use": "sig",
236+
"n": encode_number_base64(public_key.public_numbers().n),
237+
"e": encode_number_base64(public_key.public_numbers().e),
238+
},
239+
]
240+
}
241+
242+
mock_keycloak_api.get(certs_url).respond(
243+
json=payload,
244+
status_code=200,
245+
content_type="application/json",
246+
)

tests/test_unit/test_auth/test_keycloak.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ async def test_keycloak_get_user_authorized(
5959
create_session_cookie,
6060
mock_keycloak_well_known,
6161
mock_keycloak_realm,
62+
mock_keycloak_certs,
6263
):
6364
client.cookies.clear()
6465
session_cookie = create_session_cookie(simple_user)
@@ -86,6 +87,7 @@ async def test_keycloak_get_user_expired_access_token(
8687
mock_keycloak_well_known,
8788
mock_keycloak_realm,
8889
mock_keycloak_token_refresh,
90+
mock_keycloak_certs,
8991
):
9092
session_cookie = create_session_cookie(simple_user, expire_in_msec=-100000000) # expired access token
9193
client.cookies = {"session": session_cookie}
@@ -113,6 +115,7 @@ async def test_keycloak_get_user_inactive(
113115
create_session_cookie,
114116
mock_keycloak_well_known,
115117
mock_keycloak_realm,
118+
mock_keycloak_certs,
116119
):
117120
client.cookies = {"session": create_session_cookie(inactive_user)}
118121
response = await client.get(f"/v1/users/{simple_user.id}")
@@ -156,6 +159,7 @@ async def test_keycloak_auth_logout(
156159
mock_keycloak_realm,
157160
mock_keycloak_token_refresh,
158161
mock_keycloak_logout,
162+
mock_keycloak_certs,
159163
):
160164
client.cookies = {"session": create_session_cookie(simple_user)}
161165
response = await client.get("/v1/auth/logout")

0 commit comments

Comments
 (0)