From b162153f4136dc8f83f92cd89a7ddaa4df3d7bc1 Mon Sep 17 00:00:00 2001 From: David Date: Tue, 4 Jun 2024 13:05:53 -0500 Subject: [PATCH] chore: add divergence test for uma and conneciton class --- src/keycloak/keycloak_uma.py | 18 ++++++++++++++++++ tests/test_connection.py | 26 ++++++++++++++++++++++++++ tests/test_keycloak_uma.py | 14 ++++++++++++++ 3 files changed, 58 insertions(+) diff --git a/src/keycloak/keycloak_uma.py b/src/keycloak/keycloak_uma.py index f4683b3..d2d8bfa 100644 --- a/src/keycloak/keycloak_uma.py +++ b/src/keycloak/keycloak_uma.py @@ -83,6 +83,24 @@ class KeycloakUMA: """ return url.format(**{k: quote_plus(v) for k, v in kwargs.items()}) + @staticmethod + async def a_format_url(url, **kwargs): + """Substitute url path parameters. + + Given a parameterized url string, returns the string after url encoding and substituting + the given params. For example, + `format_url("https://myserver/{my_resource}/{id}", my_resource="hello world", id="myid")` + would produce `https://myserver/hello+world/myid`. + + :param url: url string to format + :type url: str + :param kwargs: dict containing kwargs to substitute + :type kwargs: dict + :return: formatted string + :rtype: str + """ + return url.format(**{k: quote_plus(v) for k, v in kwargs.items()}) + @property def uma_well_known(self): """Get the well_known UMA2 config. diff --git a/tests/test_connection.py b/tests/test_connection.py index 6b1f8ff..db60384 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -39,3 +39,29 @@ def test_bad_connection(): cm.raw_post(path="bad", data={}) with pytest.raises(KeycloakConnectionError): cm.raw_put(path="bad", data={}) + + +@pytest.mark.asyncio +async def a_test_bad_connection(): + """Test bad connection.""" + cm = ConnectionManager(base_url="http://not.real.domain") + with pytest.raises(KeycloakConnectionError): + await cm.a_raw_get(path="bad") + with pytest.raises(KeycloakConnectionError): + await cm.a_raw_delete(path="bad") + with pytest.raises(KeycloakConnectionError): + await cm.a_raw_post(path="bad", data={}) + with pytest.raises(KeycloakConnectionError): + await cm.a_raw_put(path="bad", data={}) + + +def test_counter_part(): + """Test that each function has its async counter part.""" + con_methods = [ + func for func in dir(ConnectionManager) if callable(getattr(ConnectionManager, func)) + ] + sync_methods = [method for method in con_methods if method.startswith("a_")] + + for method in sync_methods: + async_method = method[2:] + assert (async_method in con_methods) is True diff --git a/tests/test_keycloak_uma.py b/tests/test_keycloak_uma.py index 6525989..13e49ad 100644 --- a/tests/test_keycloak_uma.py +++ b/tests/test_keycloak_uma.py @@ -599,3 +599,17 @@ async def test_a_uma_permission_ticket(uma: KeycloakUMA): uma.permission_ticket_create(permissions) await uma.a_resource_set_delete(resource["_id"]) + + +def test_counter_part(): + """Test that each function has its async counter part.""" + uma_methods = [func for func in dir(KeycloakUMA) if callable(getattr(KeycloakUMA, func))] + sync_methods = [ + method + for method in uma_methods + if not method.startswith("a_") and not method.startswith("_") + ] + + for method in sync_methods: + async_method = f"a_{method}" + assert (async_method in uma_methods) is True