You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

sudo_mode_test.rb 6.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. require File.expand_path('../../test_helper', __FILE__)
  2. class SudoModeTest < Redmine::IntegrationTest
  3. fixtures :projects, :members, :member_roles, :roles, :users, :email_addresses
  4. def setup
  5. Redmine::SudoMode.stubs(:enabled?).returns(true)
  6. end
  7. def test_sudo_mode_should_be_active_after_login
  8. log_user("admin", "admin")
  9. get "/users/new"
  10. assert_response :success
  11. post "/users",
  12. :user => { :login => "psmith", :firstname => "Paul",
  13. :lastname => "Smith", :mail => "psmith@somenet.foo",
  14. :language => "en", :password => "psmith09",
  15. :password_confirmation => "psmith09" }
  16. assert_response 302
  17. user = User.find_by_login("psmith")
  18. assert_kind_of User, user
  19. end
  20. def test_add_user
  21. log_user("admin", "admin")
  22. expire_sudo_mode!
  23. get "/users/new"
  24. assert_response :success
  25. post "/users",
  26. :user => { :login => "psmith", :firstname => "Paul",
  27. :lastname => "Smith", :mail => "psmith@somenet.foo",
  28. :language => "en", :password => "psmith09",
  29. :password_confirmation => "psmith09" }
  30. assert_response :success
  31. assert_nil User.find_by_login("psmith")
  32. assert_select 'input[name=?][value=?]', 'user[login]', 'psmith'
  33. assert_select 'input[name=?][value=?]', 'user[firstname]', 'Paul'
  34. post "/users",
  35. :user => { :login => "psmith", :firstname => "Paul",
  36. :lastname => "Smith", :mail => "psmith@somenet.foo",
  37. :language => "en", :password => "psmith09",
  38. :password_confirmation => "psmith09" },
  39. :sudo_password => 'admin'
  40. assert_response 302
  41. user = User.find_by_login("psmith")
  42. assert_kind_of User, user
  43. end
  44. def test_create_member_xhr
  45. log_user 'admin', 'admin'
  46. expire_sudo_mode!
  47. get '/projects/ecookbook/settings/members'
  48. assert_response :success
  49. assert_no_difference 'Member.count' do
  50. xhr :post, '/projects/ecookbook/memberships', membership: {role_ids: [1], user_id: 7}
  51. end
  52. assert_no_difference 'Member.count' do
  53. xhr :post, '/projects/ecookbook/memberships', membership: {role_ids: [1], user_id: 7}, sudo_password: ''
  54. end
  55. assert_no_difference 'Member.count' do
  56. xhr :post, '/projects/ecookbook/memberships', membership: {role_ids: [1], user_id: 7}, sudo_password: 'wrong'
  57. end
  58. assert_difference 'Member.count' do
  59. xhr :post, '/projects/ecookbook/memberships', membership: {role_ids: [1], user_id: 7}, sudo_password: 'admin'
  60. end
  61. assert User.find(7).member_of?(Project.find(1))
  62. end
  63. def test_create_member
  64. log_user 'admin', 'admin'
  65. expire_sudo_mode!
  66. get '/projects/ecookbook/settings/members'
  67. assert_response :success
  68. assert_no_difference 'Member.count' do
  69. post '/projects/ecookbook/memberships', membership: {role_ids: [1], user_id: 7}
  70. end
  71. assert_no_difference 'Member.count' do
  72. post '/projects/ecookbook/memberships', membership: {role_ids: [1], user_id: 7}, sudo_password: ''
  73. end
  74. assert_no_difference 'Member.count' do
  75. post '/projects/ecookbook/memberships', membership: {role_ids: [1], user_id: 7}, sudo_password: 'wrong'
  76. end
  77. assert_difference 'Member.count' do
  78. post '/projects/ecookbook/memberships', membership: {role_ids: [1], user_id: 7}, sudo_password: 'admin'
  79. end
  80. assert_redirected_to '/projects/ecookbook/settings/members'
  81. assert User.find(7).member_of?(Project.find(1))
  82. end
  83. def test_create_role
  84. log_user 'admin', 'admin'
  85. expire_sudo_mode!
  86. get '/roles'
  87. assert_response :success
  88. get '/roles/new'
  89. assert_response :success
  90. post '/roles', role: { }
  91. assert_response :success
  92. assert_select 'h2', 'Confirm your password to continue'
  93. assert_select 'form[action="/roles"]'
  94. assert assigns(:sudo_form).errors.blank?
  95. post '/roles', role: { name: 'new role', issues_visibility: 'all' }
  96. assert_response :success
  97. assert_select 'h2', 'Confirm your password to continue'
  98. assert_select 'form[action="/roles"]'
  99. assert_match /"new role"/, response.body
  100. assert assigns(:sudo_form).errors.blank?
  101. post '/roles', role: { name: 'new role', issues_visibility: 'all' }, sudo_password: 'wrong'
  102. assert_response :success
  103. assert_select 'h2', 'Confirm your password to continue'
  104. assert_select 'form[action="/roles"]'
  105. assert_match /"new role"/, response.body
  106. assert assigns(:sudo_form).errors[:password].present?
  107. assert_difference 'Role.count' do
  108. post '/roles', role: { name: 'new role', issues_visibility: 'all', assignable: '1', permissions: %w(view_calendar) }, sudo_password: 'admin'
  109. end
  110. assert_redirected_to '/roles'
  111. end
  112. def test_update_email_address
  113. log_user 'jsmith', 'jsmith'
  114. expire_sudo_mode!
  115. get '/my/account'
  116. assert_response :success
  117. post '/my/account', user: { mail: 'newmail@test.com' }
  118. assert_response :success
  119. assert_select 'h2', 'Confirm your password to continue'
  120. assert_select 'form[action="/my/account"]'
  121. assert_match /"newmail@test\.com"/, response.body
  122. assert assigns(:sudo_form).errors.blank?
  123. # wrong password
  124. post '/my/account', user: { mail: 'newmail@test.com' }, sudo_password: 'wrong'
  125. assert_response :success
  126. assert_select 'h2', 'Confirm your password to continue'
  127. assert_select 'form[action="/my/account"]'
  128. assert_match /"newmail@test\.com"/, response.body
  129. assert assigns(:sudo_form).errors[:password].present?
  130. # correct password
  131. post '/my/account', user: { mail: 'newmail@test.com' }, sudo_password: 'jsmith'
  132. assert_redirected_to '/my/account'
  133. assert_equal 'newmail@test.com', User.find_by_login('jsmith').mail
  134. # sudo mode should now be active and not require password again
  135. post '/my/account', user: { mail: 'even.newer.mail@test.com' }
  136. assert_redirected_to '/my/account'
  137. assert_equal 'even.newer.mail@test.com', User.find_by_login('jsmith').mail
  138. end
  139. def test_sudo_mode_should_skip_api_requests
  140. with_settings :rest_api_enabled => '1' do
  141. assert_difference('User.count') do
  142. post '/users.json', {
  143. :user => {
  144. :login => 'foo', :firstname => 'Firstname', :lastname => 'Lastname',
  145. :mail => 'foo@example.net', :password => 'secret123',
  146. :mail_notification => 'only_assigned'}
  147. },
  148. credentials('admin')
  149. assert_response :created
  150. end
  151. end
  152. end
  153. private
  154. # sudo mode is active after sign, let it expire by advancing the time
  155. def expire_sudo_mode!
  156. travel_to 20.minutes.from_now
  157. end
  158. end