From 8c6a6516e1dc5c1b4f12740a6f7b32765b530bb7 Mon Sep 17 00:00:00 2001 From: erdgeist Date: Fri, 31 Jul 2026 17:05:05 +0200 Subject: Replace user deletion with deactivation Deactivation adds the alumni role and leaves the others in place, so reactivation is lossless and nobody has to remember what an account held. login_from_session checks alumni? on every request, so a signed-in user is locked out on their next one without any session invalidation. Guards prevent deactivating yourself or the last active admin, and both verbs are witnessed in the action log. --- test/controllers/users_controller_test.rb | 40 +++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 12 deletions(-) (limited to 'test/controllers') diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb index 1c5d16fc..14133029 100644 --- a/test/controllers/users_controller_test.rb +++ b/test/controllers/users_controller_test.rb @@ -13,7 +13,7 @@ class UsersControllerTest < ActionController::TestCase login_as :aaron get :index assert_response :success - assert_select "button[type=submit]", I18n.t("admin.common.destroy") + assert_select "button[type=submit]", I18n.t("users.user.deactivate") assert_select "a", I18n.t("admin.common.show") end @@ -146,22 +146,38 @@ class UsersControllerTest < ActionController::TestCase test "destroying an user being logged in as regular user wont work" do login_as :quentin - assert_no_difference "User.count" do - delete :destroy, params: { :id => User.find_by_login("aaron").id } - end + put :deactivate, params: { :id => users(:quentin).id } + assert_redirected_to users_path - assert_equal( - I18n.t("flash.common.admin_required"), - flash[:notice] - ) + assert_not users(:quentin).reload.alumni? end - test "destroying an user being logged in as admin user" do + test "an admin deactivates another user, who can no longer sign in" do login_as :aaron - assert_difference "User.count", -1 do - delete :destroy, params: { :id => User.find_by_login("quentin").id } - end + user = users(:quentin) + + put :deactivate, params: { :id => user.id } + assert_redirected_to users_path + assert user.reload.alumni? + assert_equal ["admin", "alumni"].sort, user.roles.sort if user.is_admin? + end + + test "reactivation restores the other roles untouched" do + login_as :aaron + user = users(:quentin) + user.update_column(:roles, ["alumni", "redaktion"]) + + put :reactivate, params: { :id => user.id } + + assert_not user.reload.alumni? + assert_equal ["redaktion"], user.roles + end + + test "an admin cannot deactivate their own account" do + login_as :aaron + put :deactivate, params: { :id => users(:aaron).id } + assert_not users(:aaron).reload.alumni? end test "enrolled user gets a working my account" do -- cgit v1.3