Skip to content

Commit

Permalink
keep pycharm happy
Browse files Browse the repository at this point in the history
  • Loading branch information
vbrik committed Jul 12, 2024
1 parent 32df97b commit e15c9ee
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 7 deletions.
18 changes: 12 additions & 6 deletions krs/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
# noinspection PyPackageRequirements
from unidecode import unidecode

# noinspection PyPackageRequirements
import requests.exceptions

from .token import get_rest_client
Expand Down Expand Up @@ -85,6 +86,7 @@ async def user_info(username, rest_client=None):
Args:
username (str): username of user
rest_client (RestClient): Keycloak REST client
Returns:
dict: user info
Expand Down Expand Up @@ -164,7 +166,8 @@ async def create_user(username, first_name, last_name, email, attribs=None, rest
logger.info(f'user "{username}" created')


async def modify_user(username, first_name=None, last_name=None, email=None, attribs=None, actions=None, actions_reset=False, rest_client=None):
async def modify_user(username, first_name=None, last_name=None, email=None, attribs=None,
actions=None, actions_reset=False, rest_client=None):
"""
Modify a user in Keycloak.
Expand Down Expand Up @@ -232,6 +235,7 @@ async def set_user_password(username, password=None, temporary=False, rest_clien
username (str): username of user
password (str): new password
temporary (bool): is this a temporary password that must be changed?
rest_client (RestClient): Keycloak REST client
"""
if password is None:
# get password from cmdline
Expand All @@ -243,15 +247,15 @@ async def set_user_password(username, password=None, temporary=False, rest_clien

try:
ret = await user_info(username, rest_client=rest_client)
except Exception:
except UserDoesNotExist:
logger.info(f'user "{username}" does not exist')
else:
url = f'/users/{ret["id"]}/reset-password'
args = {
'value': password,
'temporary': bool(temporary),
}
ret = await rest_client.request('PUT', url, args)
await rest_client.request('PUT', url, args)
logger.info(f'user "{username}" password set')


Expand All @@ -261,14 +265,15 @@ async def delete_user(username, rest_client=None):
Args:
username (str): username of user to delete
rest_client (RestClient): Keycloak REST client
"""
try:
ret = await user_info(username, rest_client=rest_client)
except Exception:
except UserDoesNotExist:
logger.info(f'user "{username}" does not exist')
else:
url = f'/users/{ret["id"]}'
ret = await rest_client.request('DELETE', url)
await rest_client.request('DELETE', url)
logger.info(f'user "{username}" deleted')


Expand Down Expand Up @@ -298,7 +303,8 @@ def main():
parser_modify.add_argument('--first_name', help='first name')
parser_modify.add_argument('--last_name', help='last name')
parser_modify.add_argument('--email', help='email address')
parser_modify.add_argument('--actions', action='append', help='required actions', choices=['CONFIGURE_TOTP', 'UPDATE_PASSWORD', 'UPDATE_PROFILE', 'VERIFY_EMAIL'])
parser_modify.add_argument('--actions', action='append', help='required actions',
choices=['CONFIGURE_TOTP', 'UPDATE_PASSWORD', 'UPDATE_PROFILE', 'VERIFY_EMAIL'])
parser_modify.add_argument('--actions-reset', action='store_true', help='reset required actions')
parser_modify.add_argument('attribs', nargs=argparse.REMAINDER)
parser_modify.set_defaults(func=modify_user)
Expand Down
32 changes: 31 additions & 1 deletion tests/krs/test_users.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
# noinspection PyPackageRequirements
import pytest

from krs.token import get_token
from krs import users

from ..util import keycloak_bootstrap


@pytest.mark.asyncio
async def test_list_users_empty(keycloak_bootstrap):
ret = await users.list_users(rest_client=keycloak_bootstrap)
assert ret == {}


# noinspection LongLine
@pytest.mark.asyncio
async def test_list_users(keycloak_bootstrap):
await users.create_user('testuser', first_name='first', last_name='last', email='foo@test', rest_client=keycloak_bootstrap)
Expand Down Expand Up @@ -64,6 +67,7 @@ async def test_list_user_attr_query_invalid(keycloak_bootstrap):
assert not await users.list_users(attr_query={f"{char}": "not_impl_name"}, rest_client=keycloak_bootstrap)


# noinspection LongLine
@pytest.mark.asyncio
async def test_user_info(keycloak_bootstrap):
await users.create_user('testuser', first_name='first', last_name='last', email='foo@test', rest_client=keycloak_bootstrap)
Expand All @@ -72,6 +76,8 @@ async def test_user_info(keycloak_bootstrap):
assert ret['lastName'] == 'last'
assert ret['email'] == 'foo@test'


# noinspection LongLine
@pytest.mark.asyncio
async def test_create_user(keycloak_bootstrap):
await users.create_user('testuser', first_name='Fĭrst', last_name='Mü Lăst', email='foo@test', rest_client=keycloak_bootstrap)
Expand Down Expand Up @@ -100,6 +106,9 @@ async def test_modify_user(keycloak_bootstrap):
assert 'foo' in ret['attributes']
assert ret['attributes']['foo'] == 'bar'


# noinspection LongLine
# noinspection PyTypeChecker
@pytest.mark.asyncio
async def test_modify_user_asserts(keycloak_bootstrap):
await users.create_user('testuser', first_name='first', last_name='last', email='foo@test', rest_client=keycloak_bootstrap)
Expand All @@ -112,59 +121,80 @@ async def test_modify_user_asserts(keycloak_bootstrap):
with pytest.raises(RuntimeError):
await users.modify_user('testuser', email={'foo': 'bar'}, rest_client=keycloak_bootstrap)


# noinspection LongLine
# noinspection PyPep8Naming
@pytest.mark.asyncio
async def test_modify_user_firstName(keycloak_bootstrap):
await users.create_user('testuser', first_name='first', last_name='last', email='foo@test', rest_client=keycloak_bootstrap)
await users.modify_user('testuser', first_name='bar', rest_client=keycloak_bootstrap)
ret = await users.user_info('testuser', rest_client=keycloak_bootstrap)
assert ret['firstName'] == 'bar'


# noinspection LongLine
# noinspection PyPep8Naming
@pytest.mark.asyncio
async def test_modify_user_lastName(keycloak_bootstrap):
await users.create_user('testuser', first_name='first', last_name='last', email='foo@test', rest_client=keycloak_bootstrap)
await users.modify_user('testuser', last_name='bar', rest_client=keycloak_bootstrap)
ret = await users.user_info('testuser', rest_client=keycloak_bootstrap)
assert ret['lastName'] == 'bar'


# noinspection LongLine
@pytest.mark.asyncio
async def test_modify_user_email(keycloak_bootstrap):
await users.create_user('testuser', first_name='first', last_name='last', email='foo@test', rest_client=keycloak_bootstrap)
await users.modify_user('testuser', email='bar@test', rest_client=keycloak_bootstrap)
ret = await users.user_info('testuser', rest_client=keycloak_bootstrap)
assert ret['email'] == 'bar@test'


# noinspection LongLine
@pytest.mark.asyncio
async def test_modify_user_existing_attr(keycloak_bootstrap):
await users.create_user('testuser', first_name='first', last_name='last', email='foo@test', attribs={'foo': 'bar'}, rest_client=keycloak_bootstrap)
await users.modify_user('testuser', attribs={'baz': 'foo'}, rest_client=keycloak_bootstrap)
ret = await users.user_info('testuser', rest_client=keycloak_bootstrap)
assert ret['attributes'] == {'foo': 'bar', 'baz': 'foo', 'canonical_email': '[email protected]'}


# noinspection LongLine
@pytest.mark.asyncio
async def test_modify_user_attr_list(keycloak_bootstrap):
await users.create_user('testuser', first_name='first', last_name='last', email='foo@test', attribs={'foo': ['bar', 'baz']}, rest_client=keycloak_bootstrap)
await users.modify_user('testuser', attribs={'baz': [1, 2, 3]}, rest_client=keycloak_bootstrap)
ret = await users.user_info('testuser', rest_client=keycloak_bootstrap)
assert ret['attributes'] == {'foo': ['bar', 'baz'], 'baz': ['1', '2', '3'], 'canonical_email': '[email protected]'}


# noinspection LongLine
@pytest.mark.asyncio
async def test_modify_user_del_attr(keycloak_bootstrap):
await users.create_user('testuser', first_name='first', last_name='last', email='foo@test', attribs={'foo': 'bar'}, rest_client=keycloak_bootstrap)
await users.modify_user('testuser', attribs={'foo': None, 'baz': 'foo'}, rest_client=keycloak_bootstrap)
ret = await users.user_info('testuser', rest_client=keycloak_bootstrap)
assert ret['attributes'] == {'baz': 'foo', 'canonical_email': '[email protected]'}


# noinspection LongLine
@pytest.mark.asyncio
async def test_set_user_password(keycloak_bootstrap):
await users.create_user('testuser', first_name='first', last_name='last', email='foo@test', rest_client=keycloak_bootstrap)
await users.set_user_password('testuser', 'foo', rest_client=keycloak_bootstrap)


# noinspection LongLine
@pytest.mark.asyncio
async def test_set_user_password_bad(keycloak_bootstrap):
await users.create_user('testuser', first_name='first', last_name='last', email='foo@test', rest_client=keycloak_bootstrap)
with pytest.raises(Exception):
# noinspection PyTypeChecker
await users.set_user_password('testuser', ['f', 'o', 'o'], rest_client=keycloak_bootstrap)


# noinspection LongLine
@pytest.mark.asyncio
async def test_delete_user(keycloak_bootstrap):
await users.create_user('testuser', first_name='first', last_name='last', email='foo@test', rest_client=keycloak_bootstrap)
Expand Down

0 comments on commit e15c9ee

Please sign in to comment.