From 3aded03b5372b8d185d5e2759996484aaf394563 Mon Sep 17 00:00:00 2001 From: David Date: Thu, 23 May 2024 18:29:03 -0500 Subject: [PATCH] fix pytests to work with async functions --- pyproject.toml | 1 + src/keycloak/connection.py | 4 +- src/keycloak/keycloak_admin.py | 4 +- src/keycloak/keycloak_openid.py | 2 +- src/keycloak/openid_connection.py | 2 +- tests/test_connection.py | 4 +- tests/test_keycloak_admin.py | 72 +++++++++++++++---------------- tests/test_keycloak_openid.py | 4 +- tests/test_keycloak_uma.py | 2 +- 9 files changed, 48 insertions(+), 47 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 783d404..f14a2c6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,6 +49,7 @@ sphinx-autoapi = ">=3.0.0" tox = ">=4.0.0" pytest = ">=7.1.2" pytest-cov = ">=3.0.0" +pytest-asyncio = ">=0.23.7" wheel = ">=0.38.4" pre-commit = ">=2.19.0" isort = ">=5.10.1" diff --git a/src/keycloak/connection.py b/src/keycloak/connection.py index 9a116c3..9f1f010 100644 --- a/src/keycloak/connection.py +++ b/src/keycloak/connection.py @@ -280,7 +280,7 @@ class ConnectionManager(object): :raises KeycloakConnectionError: HttpError Can't connect to server. """ try: - return self._s.delete( + r = self._s.delete( urljoin(self.base_url, path), params=kwargs, data=data or dict(), @@ -288,6 +288,7 @@ class ConnectionManager(object): timeout=self.timeout, verify=self.verify, ) + return r except Exception as e: raise KeycloakConnectionError("Can't connect to server (%s)" % e) @@ -377,7 +378,6 @@ class ConnectionManager(object): return await self.async_s.delete( urljoin(self.base_url, path), params=kwargs, - data=data or dict(), headers=self.headers, timeout=self.timeout, ) diff --git a/src/keycloak/keycloak_admin.py b/src/keycloak/keycloak_admin.py index 43f16c4..6103aa2 100644 --- a/src/keycloak/keycloak_admin.py +++ b/src/keycloak/keycloak_admin.py @@ -7563,7 +7563,7 @@ class KeycloakAdmin: :rtype: list """ params_path = {"realm-name": self.connection.realm_name, "id": scope_id} - data_raw = self.connection.a_raw_delete( + data_raw = await self.connection.a_raw_delete( urls_patterns.URL_ADMIN_DEFAULT_DEFAULT_CLIENT_SCOPE.format(**params_path) ) return raise_error_from_response(data_raw, KeycloakDeleteError, expected_codes=[204]) @@ -7829,7 +7829,7 @@ class KeycloakAdmin: :rtype: bytes """ params_path = {"realm-name": self.connection.realm_name, "component-id": component_id} - data_raw = self.connection.raw_delete( + data_raw = await self.connection.a_raw_delete( urls_patterns.URL_ADMIN_COMPONENT.format(**params_path) ) return raise_error_from_response(data_raw, KeycloakDeleteError, expected_codes=[204]) diff --git a/src/keycloak/keycloak_openid.py b/src/keycloak/keycloak_openid.py index c09bb60..733265f 100644 --- a/src/keycloak/keycloak_openid.py +++ b/src/keycloak/keycloak_openid.py @@ -811,7 +811,7 @@ class KeycloakOpenID: :rtype: str """ params_path = { - "authorization-endpoint": await self.a_well_known()["authorization_endpoint"], + "authorization-endpoint": (await self.a_well_known())["authorization_endpoint"], "client-id": self.client_id, "redirect-uri": redirect_uri, "scope": scope, diff --git a/src/keycloak/openid_connection.py b/src/keycloak/openid_connection.py index a54d9d3..635586f 100644 --- a/src/keycloak/openid_connection.py +++ b/src/keycloak/openid_connection.py @@ -471,7 +471,7 @@ class KeycloakOpenIDConnection(ConnectionManager): r = await super().a_raw_put(*args, **kwargs) return r - async def raw_delete(self, *args, **kwargs): + async def a_raw_delete(self, *args, **kwargs): """Call connection.raw_delete. If auto_refresh is set for *delete* and *access_token* is expired, diff --git a/tests/test_connection.py b/tests/test_connection.py index 85730cd..6b1f8ff 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -9,9 +9,9 @@ from keycloak.exceptions import KeycloakConnectionError def test_connection_proxy(): """Test proxies of connection manager.""" cm = ConnectionManager( - base_url="http://test.test", proxies={"http://test.test": "localhost:8080"} + base_url="http://test.test", proxies={"http://test.test": "http://localhost:8080"} ) - assert cm._s.proxies == {"http://test.test": "localhost:8080"} + assert cm._s.proxies == {"http://test.test": "http://localhost:8080"} def test_headers(): diff --git a/tests/test_keycloak_admin.py b/tests/test_keycloak_admin.py index f694db8..f56e7f0 100644 --- a/tests/test_keycloak_admin.py +++ b/tests/test_keycloak_admin.py @@ -3270,12 +3270,12 @@ async def test_a_users(admin: KeycloakAdmin, realm: str): # Test disable user res = await admin.a_disable_user(user_id=user_id) assert res == {}, res - assert not await admin.a_get_user(user_id=user_id)["enabled"] + assert not (await admin.a_get_user(user_id=user_id))["enabled"] # Test enable user res = await admin.a_enable_user(user_id=user_id) assert res == {}, res - assert await admin.a_get_user(user_id=user_id)["enabled"] + assert (await admin.a_get_user(user_id=user_id))["enabled"] # Test get users again users = await admin.a_get_users() @@ -3350,21 +3350,21 @@ async def test_a_enable_disable_all_users(admin: KeycloakAdmin, realm: str): payload={"username": "test3", "email": "test3@test.test", "enabled": True} ) - assert await admin.a_get_user(user_id_1)["enabled"] - assert await admin.a_get_user(user_id_2)["enabled"] - assert await admin.a_get_user(user_id_3)["enabled"] + assert (await admin.a_get_user(user_id_1))["enabled"] + assert (await admin.a_get_user(user_id_2))["enabled"] + assert (await admin.a_get_user(user_id_3))["enabled"] - admin.a_disable_all_users() + await admin.a_disable_all_users() - assert not await admin.a_get_user(user_id_1)["enabled"] - assert not await admin.a_get_user(user_id_2)["enabled"] - assert not await admin.a_get_user(user_id_3)["enabled"] + assert not (await admin.a_get_user(user_id_1))["enabled"] + assert not (await admin.a_get_user(user_id_2))["enabled"] + assert not (await admin.a_get_user(user_id_3))["enabled"] - admin.a_enable_all_users() + await admin.a_enable_all_users() - assert await admin.a_get_user(user_id_1)["enabled"] - assert await admin.a_get_user(user_id_2)["enabled"] - assert await admin.a_get_user(user_id_3)["enabled"] + assert (await admin.a_get_user(user_id_1))["enabled"] + assert (await admin.a_get_user(user_id_2))["enabled"] + assert (await admin.a_get_user(user_id_3))["enabled"] @pytest.mark.asyncio async def test_a_users_roles(admin: KeycloakAdmin, realm: str): @@ -3593,7 +3593,7 @@ async def test_a_social_logins(admin: KeycloakAdmin, user: str): user_id=user, provider_id="github", provider_userid="test", provider_username="test" ) assert res == dict(), res - + # Test add social login fail with pytest.raises(KeycloakPostError) as err: await admin.a_add_user_social_login( @@ -3629,7 +3629,7 @@ async def test_a_server_info(admin: KeycloakAdmin): :param admin: Keycloak Admin client :type admin: KeycloakAdmin """ - info = admin.a_get_server_info() + info = await admin.a_get_server_info() assert set(info.keys()).issubset( { "systemInfo", @@ -3894,7 +3894,7 @@ async def test_a_clients(admin: KeycloakAdmin, realm: str): assert res == dict(), res with pytest.raises(KeycloakPutError) as err: - admin.update_client(client_id="does-not-exist", payload={"name": "test-client-change"}) + await admin.a_update_client(client_id="does-not-exist", payload={"name": "test-client-change"}) assert err.match('404: b\'{"error":"Could not find client".*}\'') # Test client mappers @@ -3916,7 +3916,7 @@ async def test_a_clients(admin: KeycloakAdmin, realm: str): assert res == b"" assert len(await admin.a_get_mappers_from_client(client_id=client_id)) == 1 - mapper = await admin.a_get_mappers_from_client(client_id=client_id)[0] + mapper = (await admin.a_get_mappers_from_client(client_id=client_id))[0] with pytest.raises(KeycloakPutError) as err: await admin.a_update_client_mapper(client_id=client_id, mapper_id="does-not-exist", payload=dict()) assert err.match('404: b\'{"error":"Model not found".*}\'') @@ -3939,7 +3939,7 @@ async def test_a_clients(admin: KeycloakAdmin, realm: str): assert await admin.a_get_client_sessions_stats() == list() # Test authz - auth_client_id = admin.a_create_client( + auth_client_id = await admin.a_create_client( payload={ "name": "authz-client", "clientId": "authz-client", @@ -3953,7 +3953,7 @@ async def test_a_clients(admin: KeycloakAdmin, realm: str): assert len(res["policies"]) >= 0 with pytest.raises(KeycloakGetError) as err: - aawait admin.a_get_client_authz_settings(client_id=client_id) + await admin.a_get_client_authz_settings(client_id=client_id) assert err.match(HTTP_404_REGEX) # Authz resources @@ -4022,7 +4022,7 @@ async def test_a_clients(admin: KeycloakAdmin, realm: str): await admin.a_get_client_authz_policies(client_id="does-not-exist") assert err.match('404: b\'{"error":"Could not find client".*}\'') - role_id = await admin.a_get_realm_role(role_name="offline_access")["id"] + role_id = (await admin.a_get_realm_role(role_name="offline_access"))["id"] res = await admin.a_create_client_authz_role_based_policy( client_id=auth_client_id, payload={"name": "test-authz-rb-policy", "roles": [{"id": role_id}]}, @@ -4232,7 +4232,7 @@ async def test_a_realm_roles(admin: KeycloakAdmin, realm: str): assert role_id == role_id_2 # Test get realm role by its id - role_id = await admin.a_get_realm_role(role_name="test-realm-role")["id"] + role_id = (await admin.a_get_realm_role(role_name="test-realm-role"))["id"] res = await admin.a_get_realm_role_by_id(role_id) assert res["name"] == "test-realm-role" @@ -4702,7 +4702,7 @@ async def test_a_client_roles(admin: KeycloakAdmin, client: str): await admin.a_get_client_role(client_id=client, role_name="bad") assert err.match(COULD_NOT_FIND_ROLE_REGEX) - res_ = admin.a_get_client_role_id(client_id=client, role_name="client-role-test") + res_ = await admin.a_get_client_role_id(client_id=client, role_name="client-role-test") assert res_ == res["id"] with pytest.raises(KeycloakGetError) as err: await admin.a_get_client_role_id(client_id=client, role_name="bad") @@ -4736,11 +4736,11 @@ async def test_a_client_roles(admin: KeycloakAdmin, client: str): res = await admin.a_assign_client_role( user_id=user_id, client_id=client, - roles=[admin.get_client_role(client_id=client, role_name="client-role-test-update")], + roles=[await admin.a_get_client_role(client_id=client, role_name="client-role-test-update")], ) assert res == dict() assert ( - len(admin.get_client_role_members(client_id=client, role_name="client-role-test-update")) + len(await admin.a_get_client_role_members(client_id=client, role_name="client-role-test-update")) == 1 ) @@ -5158,12 +5158,12 @@ async def test_a_auth_flows(admin: KeycloakAdmin, realm: str): payload={"required": "yes"}, flow_alias="test-create" ) assert err.match('400: b\'{"error":"Unrecognized field') - payload = await admin.a_get_authentication_flow_executions(flow_alias="test-create")[0] + payload = (await admin.a_get_authentication_flow_executions(flow_alias="test-create"))[0] payload["displayName"] = "test" res = await admin.a_update_authentication_flow_executions(payload=payload, flow_alias="test-create") assert res - exec_id = await admin.a_get_authentication_flow_executions(flow_alias="test-create")[0]["id"] + exec_id = (await admin.a_get_authentication_flow_executions(flow_alias="test-create"))[0]["id"] res = await admin.a_delete_authentication_flow_execution(execution_id=exec_id) assert res == dict() with pytest.raises(KeycloakDeleteError) as err: @@ -5310,7 +5310,7 @@ async def test_a_client_scopes(admin: KeycloakAdmin, realm: str): client_scope_id=res, payload={"name": "test-scope-update"} ) assert res_update == dict() - assert await admin.a_get_client_scope(client_scope_id=res)["name"] == "test-scope-update" + assert (await admin.a_get_client_scope(client_scope_id=res))["name"] == "test-scope-update" # Test get mappers mappers = await admin.a_get_mappers_from_client_scope(client_scope_id=res) @@ -5333,7 +5333,7 @@ async def test_a_client_scopes(admin: KeycloakAdmin, realm: str): assert len(await admin.a_get_mappers_from_client_scope(client_scope_id=res)) == 1 # Test update mapper - test_mapper = await admin.a_get_mappers_from_client_scope(client_scope_id=res)[0] + test_mapper = (await admin.a_get_mappers_from_client_scope(client_scope_id=res))[0] with pytest.raises(KeycloakPutError) as err: await admin.a_update_mapper_in_client_scope( client_scope_id="does-not-exist", protocol_mapper_id=test_mapper["id"], payload=dict() @@ -5345,7 +5345,7 @@ async def test_a_client_scopes(admin: KeycloakAdmin, realm: str): ) assert res_update == dict() assert ( - await admin.a_get_mappers_from_client_scope(client_scope_id=res)[0]["config"]["user.attribute"] + (await admin.a_get_mappers_from_client_scope(client_scope_id=res))[0]["config"]["user.attribute"] == "test" ) @@ -5444,7 +5444,7 @@ async def test_a_components(admin: KeycloakAdmin, realm: str): } ) assert res - assert await admin.a_get_component(component_id=res)["name"] == "Test Component" + assert (await admin.a_get_component(component_id=res))["name"] == "Test Component" # Test update component component = await admin.a_get_component(component_id=res) @@ -5455,7 +5455,7 @@ async def test_a_components(admin: KeycloakAdmin, realm: str): assert err.match('404: b\'{"error":"Could not find component".*}\'') res_upd = await admin.a_update_component(component_id=res, payload=component) assert res_upd == dict() - assert await admin.a_get_component(component_id=res)["name"] == "Test Component Update" + assert (await admin.a_get_component(component_id=res))["name"] == "Test Component Update" # Test delete component res_del = await admin.a_delete_component(component_id=res) @@ -5474,15 +5474,15 @@ async def test_a_keys(admin: KeycloakAdmin, realm: str): :type realm: str """ await admin.a_change_current_realm(realm) - assert set(await admin.a_get_keys()["active"].keys()) == {"AES", "HS256", "RS256", "RSA-OAEP"} or set( - await admin.a_get_keys()["active"].keys() + assert set((await admin.a_get_keys())["active"].keys()) == {"AES", "HS256", "RS256", "RSA-OAEP"} or set( + (await admin.a_get_keys())["active"].keys() ) == {"RSA-OAEP", "RS256", "HS512", "AES"} - assert {k["algorithm"] for k in await admin.a_get_keys()["keys"]} == { + assert {k["algorithm"] for k in (await admin.a_get_keys())["keys"]} == { "HS256", "RSA-OAEP", "AES", "RS256", - } or {k["algorithm"] for k in await admin.a_get_keys()["keys"]} == { + } or {k["algorithm"] for k in (await admin.a_get_keys())["keys"]} == { "HS512", "RSA-OAEP", "AES", @@ -5935,7 +5935,7 @@ async def test_a_clear_realm_cache(realm: str, admin: KeycloakAdmin) -> None: assert res == {} @pytest.mark.asyncio -def test_clear_user_cache(realm: str, admin: KeycloakAdmin) -> None: +async def test_clear_user_cache(realm: str, admin: KeycloakAdmin) -> None: """Test clearing the user cache. :param realm: Realm name diff --git a/tests/test_keycloak_openid.py b/tests/test_keycloak_openid.py index bb0708d..51274db 100644 --- a/tests/test_keycloak_openid.py +++ b/tests/test_keycloak_openid.py @@ -741,7 +741,7 @@ async def test_a_introspect(oid_with_credentials: Tuple[KeycloakOpenID, str, str oid, username, password = oid_with_credentials token = await oid.a_token(username=username, password=password) - assert await oid.a_introspect(token=token["access_token"])["active"] + assert (await oid.a_introspect(token=token["access_token"]))["active"] assert await oid.a_introspect( token=token["access_token"], rpt="some", token_type_hint="requesting_party_token" ) == {"active": False} @@ -822,7 +822,7 @@ async def test_a_get_policies(oid_with_credentials_authz: Tuple[KeycloakOpenID, await oid.a_get_policies(token=token["access_token"]) @pytest.mark.asyncio -def test_a_get_permissions(oid_with_credentials_authz: Tuple[KeycloakOpenID, str, str]): +async def test_a_get_permissions(oid_with_credentials_authz: Tuple[KeycloakOpenID, str, str]): """Test get policies. :param oid_with_credentials_authz: Keycloak OpenID client configured as an authorization diff --git a/tests/test_keycloak_uma.py b/tests/test_keycloak_uma.py index 90057bd..6591e4b 100644 --- a/tests/test_keycloak_uma.py +++ b/tests/test_keycloak_uma.py @@ -251,7 +251,7 @@ def test_uma_access(uma: KeycloakUMA): "type": "urn:test", "ownerManagedAccess": True, } - resource = await uma.a_resource_set_create(resource_to_create) + resource = uma.resource_set_create(resource_to_create) policy_to_create = { "name": "TestPolicy",