From 5729e4ead641756eb111c22fc77dc97f2b82c4ae Mon Sep 17 00:00:00 2001 From: Pauline Laharanne Date: Fri, 4 Aug 2023 18:17:46 +0200 Subject: [PATCH] add command to delete users --- CHANGES.rst | 2 ++ croud/__main__.py | 14 +++++++++++++- croud/users/commands.py | 17 +++++++++++++++++ tests/commands/test_users.py | 16 +++++++++++++++- 4 files changed, 47 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 96e61c90..0990022a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -7,6 +7,8 @@ Unreleased - Dropped support for Python 3.7. +- Added support for deleting users. + 1.5.0 - 2023/07/27 ================== diff --git a/croud/__main__.py b/croud/__main__.py index 469b8cfa..417a413d 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,18 @@ }, }, }, + "delete": { + "help": "Delete the specified user. The command is for " + "superusers only.", + "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