diff --git a/CHANGES.rst b/CHANGES.rst index 29594d13..c8ec37b5 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,8 @@ Changes for croud Unreleased ========== +- Added support for deleting users. + 1.5.0 - 2023/07/27 ================== diff --git a/croud/__main__.py b/croud/__main__.py index 469b8cfa..5c0b8ae0 100644 --- a/croud/__main__.py +++ b/croud/__main__.py @@ -106,7 +106,7 @@ subscriptions_list, ) from croud.tools.spinner import HALO -from croud.users.commands import users_list +from croud.users.commands import users_delete, users_list from croud.users.roles.commands import roles_list # Arguments common to all import-job create commands @@ -1090,6 +1090,17 @@ }, }, }, + "delete": { + "help": "Delete the specified user.", + "extra_args": [ + Argument( + "--user-id", type=str, required=True, + help="The user ID to use.", + ), + Argument("-y", "--yes", action="store_true", default=False) + ], + "resolver": users_delete, + }, }, }, "api-keys": { diff --git a/croud/users/commands.py b/croud/users/commands.py index 9ea09014..b80ed6d2 100644 --- a/croud/users/commands.py +++ b/croud/users/commands.py @@ -22,6 +22,7 @@ from croud.api import Client from croud.config import get_output_format from croud.printer import print_response, print_warning +from croud.util import require_confirmation def transform_roles_list(key): @@ -50,3 +51,19 @@ def users_list(args: Namespace) -> None: "project_roles": transform_roles_list("project_id"), }, ) + + +@require_confirmation( + "Are you sure you want to delete the user?", + cancel_msg="User deletion cancelled.", +) +def users_delete(args: Namespace) -> None: + client = Client.from_args(args) + + data, errors = client.delete(f"/api/v2/users/{args.user_id}/") + print_response( + data=data, + errors=errors, + success_message="User deleted.", + output_fmt=get_output_format(args), + ) diff --git a/tests/commands/test_users.py b/tests/commands/test_users.py index 23bf5179..46fb3de1 100644 --- a/tests/commands/test_users.py +++ b/tests/commands/test_users.py @@ -23,7 +23,7 @@ from croud.api import Client, RequestMethod from croud.users.commands import transform_roles_list -from tests.util import assert_rest, call_command +from tests.util import assert_rest, call_command, gen_uuid pytestmark = pytest.mark.usefixtures("config") @@ -90,3 +90,17 @@ def test_transform_roles_list(mock_request): "project-2: project_member,\n" "project-3: project_member" ) + + +@mock.patch.object(Client, "request", return_value=(None, {})) +def test_users_delete(mock_request, capsys): + user_id = gen_uuid() + with mock.patch("builtins.input", side_effect=["Y"]) as mock_input: + call_command("croud", "users", "delete", "--user-id", user_id) + assert_rest(mock_request, RequestMethod.DELETE, f"/api/v2/users/{user_id}/") + mock_input.assert_called_once_with( + "Are you sure you want to delete the user? [yN] " + ) + + _, err_output = capsys.readouterr() + assert "User deleted." in err_output