Skip to content

Commit 42a7b9c

Browse files
authored
Merge pull request #1678 from codidact/0valt/1668/suggestions
Suggestions for PR #1668
2 parents 42477d4 + c037fff commit 42a7b9c

4 files changed

Lines changed: 52 additions & 22 deletions

File tree

app/controllers/users/registrations_controller.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@ def delete
3232
def do_delete
3333
@user = current_user
3434
if @user.admin?
35-
@user.errors.add(:base, 'Admin accounts cannot be self-deleted. Contact support.')
35+
@user.errors.add(:base, I18n.t('users.errors.no_admin_self_delete'))
3636
render :delete
3737
elsif @user.moderator?
38-
@user.errors.add(:base, 'Moderator accounts cannot be self-deleted. Contact support.')
38+
@user.errors.add(:base, I18n.t('users.errors.no_mod_self_delete'))
3939
render :delete
4040
elsif params[:username] != @user.username
41-
@user.errors.add(:base, 'The username you entered was incorrect.')
41+
@user.errors.add(:base, I18n.t('users.errors.self_delete_wrong_username'))
4242
render :delete
4343
else
4444
@user.do_soft_delete(@user)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
en:
2+
users:
3+
errors:
4+
no_admin_self_delete: >
5+
Admin accounts cannot be self-deleted. Contact support.
6+
no_mod_self_delete: >
7+
Moderator accounts cannot be self-deleted. Contact support.
8+
self_delete_wrong_username: >
9+
The username you entered was incorrect.

test/controllers/sudo_controller_test.rb

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ class SudoControllerTest < ActionController::TestCase
1717

1818
test 'should fail sudo mode with wrong password' do
1919
sign_in users(:standard_user)
20-
post :enter_sudo, params: { password: 'wrong' }
20+
try_enter_sudo('wrong')
21+
2122
assert_response(:success)
2223
assert_equal 'The password you entered was incorrect.', flash[:danger]
2324
end
@@ -26,7 +27,8 @@ class SudoControllerTest < ActionController::TestCase
2627
set_password(users(:standard_user), 'test1234')
2728
sign_in users(:standard_user)
2829
session[:sudo_return] = users_me_path
29-
post :enter_sudo, params: { password: 'test1234' }
30+
try_enter_sudo('test1234')
31+
3032
assert_response(:found)
3133
assert_redirected_to users_me_path
3234
assert_not_nil session[:sudo]
@@ -37,6 +39,12 @@ class SudoControllerTest < ActionController::TestCase
3739

3840
private
3941

42+
# Attempts to enter sudo mode for the current user
43+
# @param password [String] password of the user entering sudo mode
44+
def try_enter_sudo(password)
45+
post :enter_sudo, params: { password: password }
46+
end
47+
4048
def set_password(user, password)
4149
user.password = password
4250
user.skip_reconfirmation!

test/controllers/users/registrations_controller_test.rb

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ class Users::RegistrationsControllerTest < ActionController::TestCase
88

99
test 'should register user' do
1010
try_register_user('test', 'test@example.com', 'testtest')
11+
1112
assert_response(:found)
1213
assert_not_nil assigns(:user).id
1314
assert_redirected_to root_path
@@ -16,6 +17,7 @@ class Users::RegistrationsControllerTest < ActionController::TestCase
1617
test 'should prevent rapid registrations from same IP' do
1718
User.create(username: 'test', email: 'test2@example.com', password: 'testtest', current_sign_in_ip: '0.0.0.0')
1819
try_register_user('test', 'test@example.com', 'testtest')
20+
1921
assert_response(:found)
2022
assert_redirected_to users_path
2123
assert_not_nil flash[:danger]
@@ -24,6 +26,7 @@ class Users::RegistrationsControllerTest < ActionController::TestCase
2426
test 'ensure Devise errors are handled properly' do
2527
existing_user = users(:standard_user)
2628
try_register_user(existing_user.username, existing_user.email, 'testtest')
29+
2730
assert_response(:success)
2831
assert_not_empty assigns(:user).errors
2932
end
@@ -51,7 +54,8 @@ class Users::RegistrationsControllerTest < ActionController::TestCase
5154
test 'should delete user account' do
5255
sign_in users(:standard_user)
5356
session[:sudo] = DateTime.now.iso8601
54-
post :do_delete, params: { username: users(:standard_user).username }
57+
try_do_delete_user(users(:standard_user))
58+
5559
assert_response(:found)
5660
assert_redirected_to root_path
5761
assert_equal 'Sorry to see you go!', flash[:info]
@@ -60,13 +64,15 @@ class Users::RegistrationsControllerTest < ActionController::TestCase
6064

6165
test 'should require authentication to delete user account' do
6266
post :do_delete, params: { username: 'anything' }
67+
6368
assert_response(:found)
6469
assert_redirected_to new_user_session_path
6570
end
6671

6772
test 'should require sudo to delete user account' do
6873
sign_in users(:standard_user)
6974
post :do_delete, params: { username: 'anything' }
75+
7076
assert_response(:found)
7177
assert_redirected_to user_sudo_path
7278
end
@@ -75,31 +81,38 @@ class Users::RegistrationsControllerTest < ActionController::TestCase
7581
sign_in users(:standard_user)
7682
session[:sudo] = DateTime.now.iso8601
7783
post :do_delete, params: { username: 'wrong' }
78-
assert_response(:success)
79-
assert_equal ['The username you entered was incorrect.'], assigns(:user).errors.full_messages
80-
assert_not assigns(:user).deleted
81-
end
8284

83-
test 'should prevent deletion of moderators' do
84-
sign_in users(:moderator)
85-
session[:sudo] = DateTime.now.iso8601
86-
post :do_delete, params: { username: users(:moderator).username }
8785
assert_response(:success)
88-
assert_equal ['Moderator accounts cannot be self-deleted. Contact support.'], assigns(:user).errors.full_messages
86+
assert_equal [I18n.t('users.errors.self_delete_wrong_username')], assigns(:user).errors.full_messages
8987
assert_not assigns(:user).deleted
9088
end
9189

92-
test 'should prevent deletion of admins' do
93-
sign_in users(:admin)
94-
session[:sudo] = DateTime.now.iso8601
95-
post :do_delete, params: { username: users(:admin).username }
96-
assert_response(:success)
97-
assert_equal ['Admin accounts cannot be self-deleted. Contact support.'], assigns(:user).errors.full_messages
98-
assert_not assigns(:user).deleted
90+
test 'should prevent self-deletion if the user is at least a moderator' do
91+
locale_string_map = {
92+
moderator: 'users.errors.no_mod_self_delete',
93+
admin: 'users.errors.no_admin_self_delete'
94+
}
95+
96+
[:moderator, :admin].each do |name|
97+
sign_in users(name)
98+
session[:sudo] = DateTime.now.iso8601
99+
100+
try_do_delete_user(users(name))
101+
102+
assert_response(:success)
103+
assert_equal [I18n.t(locale_string_map[name])], assigns(:user).errors.full_messages
104+
assert_not assigns(:user).deleted
105+
end
99106
end
100107

101108
private
102109

110+
# Attempts to sudo delete a given user
111+
# @param user [User] user to delete
112+
def try_do_delete_user(user)
113+
post :do_delete, params: { username: user.username }
114+
end
115+
103116
def try_register_user(username, email, password)
104117
post :create, params: { user: { username: username, email: email, password: password,
105118
password_confirmation: password } }

0 commit comments

Comments
 (0)