require File.expand_path('../../test_helper', __FILE__) class SudoTest < Redmine::IntegrationTest fixtures :projects, :members, :member_roles, :roles, :users def setup Redmine::SudoMode.enable! end def teardown Redmine::SudoMode.disable! end def test_create_member_xhr log_user 'admin', 'admin' get '/projects/ecookbook/settings/members' assert_response :success assert_no_difference 'Member.count' do xhr :post, '/projects/ecookbook/memberships', membership: {role_ids: [1], user_id: 7} end assert_no_difference 'Member.count' do xhr :post, '/projects/ecookbook/memberships', membership: {role_ids: [1], user_id: 7}, sudo_password: '' end assert_no_difference 'Member.count' do xhr :post, '/projects/ecookbook/memberships', membership: {role_ids: [1], user_id: 7}, sudo_password: 'wrong' end assert_difference 'Member.count' do xhr :post, '/projects/ecookbook/memberships', membership: {role_ids: [1], user_id: 7}, sudo_password: 'admin' end assert User.find(7).member_of?(Project.find(1)) end def test_create_member log_user 'admin', 'admin' get '/projects/ecookbook/settings/members' assert_response :success assert_no_difference 'Member.count' do post '/projects/ecookbook/memberships', membership: {role_ids: [1], user_id: 7} end assert_no_difference 'Member.count' do post '/projects/ecookbook/memberships', membership: {role_ids: [1], user_id: 7}, sudo_password: '' end assert_no_difference 'Member.count' do post '/projects/ecookbook/memberships', membership: {role_ids: [1], user_id: 7}, sudo_password: 'wrong' end assert_difference 'Member.count' do post '/projects/ecookbook/memberships', membership: {role_ids: [1], user_id: 7}, sudo_password: 'admin' end assert_redirected_to '/projects/ecookbook/settings/members' assert User.find(7).member_of?(Project.find(1)) end def test_create_role log_user 'admin', 'admin' get '/roles' assert_response :success get '/roles/new' assert_response :success post '/roles', role: { } assert_response :success assert_select 'h2', 'Confirm your password to continue' assert_select 'form[action="/roles"]' assert assigns(:sudo_form).errors.blank? post '/roles', role: { name: 'new role', issues_visibility: 'all' } assert_response :success assert_select 'h2', 'Confirm your password to continue' assert_select 'form[action="/roles"]' assert_match /"new role"/, response.body assert assigns(:sudo_form).errors.blank? post '/roles', role: { name: 'new role', issues_visibility: 'all' }, sudo_password: 'wrong' assert_response :success assert_select 'h2', 'Confirm your password to continue' assert_select 'form[action="/roles"]' assert_match /"new role"/, response.body assert assigns(:sudo_form).errors[:password].present? assert_difference 'Role.count' do post '/roles', role: { name: 'new role', issues_visibility: 'all', assignable: '1', permissions: %w(view_calendar) }, sudo_password: 'admin' end assert_redirected_to '/roles' end def test_update_email_address log_user 'jsmith', 'jsmith' get '/my/account' assert_response :success post '/my/account', user: { mail: 'newmail@test.com' } assert_response :success assert_select 'h2', 'Confirm your password to continue' assert_select 'form[action="/my/account"]' assert_match /"newmail@test\.com"/, response.body assert assigns(:sudo_form).errors.blank? # wrong password post '/my/account', user: { mail: 'newmail@test.com' }, sudo_password: 'wrong' assert_response :success assert_select 'h2', 'Confirm your password to continue' assert_select 'form[action="/my/account"]' assert_match /"newmail@test\.com"/, response.body assert assigns(:sudo_form).errors[:password].present? # correct password post '/my/account', user: { mail: 'newmail@test.com' }, sudo_password: 'jsmith' assert_redirected_to '/my/account' assert_equal 'newmail@test.com', User.find_by_login('jsmith').mail # sudo mode should now be active and not require password again post '/my/account', user: { mail: 'even.newer.mail@test.com' } assert_redirected_to '/my/account' assert_equal 'even.newer.mail@test.com', User.find_by_login('jsmith').mail end end