Skip to content

Commit d9de702

Browse files
authored
feat: add get_composite_client_roles_of_role (#660)
* feat: add `get_composite_client_roles_of_role` * chore: formatting * chore: more formatting
1 parent db376fc commit d9de702

3 files changed

Lines changed: 72 additions & 3 deletions

File tree

src/keycloak/keycloak_admin.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3629,6 +3629,27 @@ def get_composite_realm_roles_of_role(self, role_name: str) -> list:
36293629
)
36303630
return raise_error_from_response(data_raw, KeycloakGetError)
36313631

3632+
def get_composite_client_roles_of_role(self, client_id: str, role_name: str) -> list:
3633+
"""
3634+
Get composite roles of the client role.
3635+
3636+
:param client_id: The id of the client
3637+
:type client_id: str
3638+
:param role_name: The name of the role
3639+
:type role_name: str
3640+
:return: Keycloak server response (array RoleRepresentation)
3641+
:rtype: list
3642+
"""
3643+
params_path = {
3644+
"realm-name": self.connection.realm_name,
3645+
"id": client_id,
3646+
"role-name": role_name,
3647+
}
3648+
data_raw = self.connection.raw_get(
3649+
urls_patterns.URL_ADMIN_CLIENT_ROLES_COMPOSITE_CLIENT_ROLE.format(**params_path),
3650+
)
3651+
return raise_error_from_response(data_raw, KeycloakGetError)
3652+
36323653
def assign_realm_roles_to_client_scope(self, client_id: str, roles: str | list) -> bytes:
36333654
"""
36343655
Assign realm roles to a client's scope.
@@ -8894,6 +8915,27 @@ async def a_get_composite_realm_roles_of_role(self, role_name: str) -> list:
88948915
)
88958916
return raise_error_from_response(data_raw, KeycloakGetError)
88968917

8918+
async def a_get_composite_client_roles_of_role(self, client_id: str, role_name: str) -> list:
8919+
"""
8920+
Get composite roles of the client role.
8921+
8922+
:param client_id: The id of the client
8923+
:type client_id: str
8924+
:param role_name: The name of the role
8925+
:type role_name: str
8926+
:return: Keycloak server response (array RoleRepresentation)
8927+
:rtype: list
8928+
"""
8929+
params_path = {
8930+
"realm-name": self.connection.realm_name,
8931+
"id": client_id,
8932+
"role-name": role_name,
8933+
}
8934+
data_raw = await self.connection.a_raw_get(
8935+
urls_patterns.URL_ADMIN_CLIENT_ROLES_COMPOSITE_CLIENT_ROLE.format(**params_path),
8936+
)
8937+
return raise_error_from_response(data_raw, KeycloakGetError)
8938+
88978939
async def a_assign_realm_roles_to_client_scope(
88988940
self,
88998941
client_id: str,

test_keycloak_init.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ function keycloak_start() {
2020
else
2121
KEYCLOAK_FEATURES="admin-fine-grained-authz:v1,token-exchange:v1"
2222
fi
23-
docker run -d --name unittest_keycloak -e KEYCLOAK_ADMIN="${KEYCLOAK_ADMIN}" -e KEYCLOAK_ADMIN_PASSWORD="${KEYCLOAK_ADMIN_PASSWORD}" -p "${KEYCLOAK_PORT}:8080" -v $PWD/tests/providers:/opt/keycloak/providers "${KEYCLOAK_DOCKER_IMAGE}" start-dev --features="${KEYCLOAK_FEATURES}"
23+
docker run --rm -d --name unittest_keycloak -e KEYCLOAK_ADMIN="${KEYCLOAK_ADMIN}" -e KEYCLOAK_ADMIN_PASSWORD="${KEYCLOAK_ADMIN_PASSWORD}" -p "${KEYCLOAK_PORT}:8080" -v $PWD/tests/providers:/opt/keycloak/providers "${KEYCLOAK_DOCKER_IMAGE}" start-dev --features="${KEYCLOAK_FEATURES}"
2424
SECONDS=0
2525
until curl --silent --output /dev/null localhost:$KEYCLOAK_PORT; do
2626
sleep 5;

tests/test_keycloak_admin.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2246,7 +2246,13 @@ def test_client_roles(admin: KeycloakAdmin, client: str) -> None:
22462246
)
22472247
assert res == {}
22482248

2249-
# Test composite client roles
2249+
# Test get composite client roles of role before adding
2250+
res = admin.get_composite_client_roles_of_role(
2251+
client_id=client, role_name="client-role-test-update"
2252+
)
2253+
assert len(res) == 0
2254+
2255+
# Test add composite client roles to role
22502256
with pytest.raises(KeycloakPostError) as err:
22512257
admin.add_composite_client_roles_to_role(
22522258
client_role_id=client,
@@ -2264,6 +2270,15 @@ def test_client_roles(admin: KeycloakAdmin, client: str) -> None:
22642270
"composite"
22652271
]
22662272

2273+
# Test get composite client roles of role after adding
2274+
res = admin.get_composite_client_roles_of_role(
2275+
client_id=client, role_name="client-role-test-update"
2276+
)
2277+
assert len(res) == 1
2278+
with pytest.raises(KeycloakGetError) as err:
2279+
admin.get_composite_client_roles_of_role(client_id=client, role_name="bad")
2280+
assert err.match(COULD_NOT_FIND_ROLE_REGEX)
2281+
22672282
# Test removal of composite client roles
22682283
with pytest.raises(KeycloakDeleteError) as err:
22692284
admin.remove_composite_client_roles_from_role(
@@ -5856,7 +5871,13 @@ async def test_a_client_roles(admin: KeycloakAdmin, client: str) -> None:
58565871
)
58575872
assert res == {}
58585873

5859-
# Test composite client roles
5874+
# Test get composite client roles of role before adding
5875+
res = await admin.a_get_composite_client_roles_of_role(
5876+
client_id=client, role_name="client-role-test-update"
5877+
)
5878+
assert len(res) == 0
5879+
5880+
# Test add composite client roles to role
58605881
with pytest.raises(KeycloakPostError) as err:
58615882
await admin.a_add_composite_client_roles_to_role(
58625883
client_role_id=client,
@@ -5874,6 +5895,12 @@ async def test_a_client_roles(admin: KeycloakAdmin, client: str) -> None:
58745895
"composite"
58755896
]
58765897

5898+
# Test get composite client roles of role after adding
5899+
res = await admin.a_get_composite_client_roles_of_role(
5900+
client_id=client, role_name="client-role-test-update"
5901+
)
5902+
assert len(res) == 1
5903+
58775904
# Test removal of composite client roles
58785905
with pytest.raises(KeycloakDeleteError) as err:
58795906
await admin.a_remove_composite_client_roles_from_role(

0 commit comments

Comments
 (0)