/test/functional/account_controller_test.rb

https://bitbucket.org/redmine/redmine/ · Ruby · 457 lines · 367 code · 72 blank · 18 comment · 0 complexity · c7713f481bd2e59219dcb4e02436e661 MD5 · raw file

  1. # Redmine - project management software
  2. # Copyright (C) 2006-2016 Jean-Philippe Lang
  3. #
  4. # This program is free software; you can redistribute it and/or
  5. # modify it under the terms of the GNU General Public License
  6. # as published by the Free Software Foundation; either version 2
  7. # of the License, or (at your option) any later version.
  8. #
  9. # This program is distributed in the hope that it will be useful,
  10. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. # GNU General Public License for more details.
  13. #
  14. # You should have received a copy of the GNU General Public License
  15. # along with this program; if not, write to the Free Software
  16. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  17. require File.expand_path('../../test_helper', __FILE__)
  18. class AccountControllerTest < Redmine::ControllerTest
  19. fixtures :users, :email_addresses, :roles
  20. def setup
  21. User.current = nil
  22. end
  23. def test_get_login
  24. get :login
  25. assert_response :success
  26. assert_select 'input[name=username]'
  27. assert_select 'input[name=password]'
  28. end
  29. def test_get_login_while_logged_in_should_redirect_to_back_url_if_present
  30. @request.session[:user_id] = 2
  31. @request.env["HTTP_REFERER"] = 'http://test.host/issues/show/1'
  32. get :login, :back_url => 'http://test.host/issues/show/1'
  33. assert_redirected_to '/issues/show/1'
  34. assert_equal 2, @request.session[:user_id]
  35. end
  36. def test_get_login_while_logged_in_should_redirect_to_referer_without_back_url
  37. @request.session[:user_id] = 2
  38. @request.env["HTTP_REFERER"] = 'http://test.host/issues/show/1'
  39. get :login
  40. assert_redirected_to '/issues/show/1'
  41. assert_equal 2, @request.session[:user_id]
  42. end
  43. def test_get_login_while_logged_in_should_redirect_to_home_by_default
  44. @request.session[:user_id] = 2
  45. get :login
  46. assert_redirected_to '/'
  47. assert_equal 2, @request.session[:user_id]
  48. end
  49. def test_login_should_redirect_to_back_url_param
  50. # request.uri is "test.host" in test environment
  51. back_urls = [
  52. 'http://test.host/issues/show/1',
  53. 'http://test.host/',
  54. '/'
  55. ]
  56. back_urls.each do |back_url|
  57. post :login, :username => 'jsmith', :password => 'jsmith', :back_url => back_url
  58. assert_redirected_to back_url
  59. end
  60. end
  61. def test_login_with_suburi_should_redirect_to_back_url_param
  62. @relative_url_root = Redmine::Utils.relative_url_root
  63. Redmine::Utils.relative_url_root = '/redmine'
  64. back_urls = [
  65. 'http://test.host/redmine/issues/show/1',
  66. '/redmine'
  67. ]
  68. back_urls.each do |back_url|
  69. post :login, :username => 'jsmith', :password => 'jsmith', :back_url => back_url
  70. assert_redirected_to back_url
  71. end
  72. ensure
  73. Redmine::Utils.relative_url_root = @relative_url_root
  74. end
  75. def test_login_should_not_redirect_to_another_host
  76. back_urls = [
  77. 'http://test.foo/fake',
  78. '//test.foo/fake'
  79. ]
  80. back_urls.each do |back_url|
  81. post :login, :username => 'jsmith', :password => 'jsmith', :back_url => back_url
  82. assert_redirected_to '/my/page'
  83. end
  84. end
  85. def test_login_with_suburi_should_not_redirect_to_another_suburi
  86. @relative_url_root = Redmine::Utils.relative_url_root
  87. Redmine::Utils.relative_url_root = '/redmine'
  88. back_urls = [
  89. 'http://test.host/',
  90. 'http://test.host/fake',
  91. 'http://test.host/fake/issues',
  92. 'http://test.host/redmine/../fake',
  93. 'http://test.host/redmine/../fake/issues',
  94. 'http://test.host/redmine/%2e%2e/fake',
  95. '//test.foo/fake',
  96. 'http://test.host//fake',
  97. 'http://test.host/\n//fake',
  98. '//bar@test.foo',
  99. '//test.foo',
  100. '////test.foo',
  101. '@test.foo',
  102. 'fake@test.foo',
  103. '.test.foo'
  104. ]
  105. back_urls.each do |back_url|
  106. post :login, :username => 'jsmith', :password => 'jsmith', :back_url => back_url
  107. assert_redirected_to '/my/page'
  108. end
  109. ensure
  110. Redmine::Utils.relative_url_root = @relative_url_root
  111. end
  112. def test_login_with_wrong_password
  113. post :login, :username => 'admin', :password => 'bad'
  114. assert_response :success
  115. assert_select 'div.flash.error', :text => /Invalid user or password/
  116. assert_select 'input[name=username][value=admin]'
  117. assert_select 'input[name=password]'
  118. assert_select 'input[name=password][value]', 0
  119. end
  120. def test_login_with_locked_account_should_fail
  121. User.find(2).update_attribute :status, User::STATUS_LOCKED
  122. post :login, :username => 'jsmith', :password => 'jsmith'
  123. assert_redirected_to '/login'
  124. assert_include 'locked', flash[:error]
  125. assert_nil @request.session[:user_id]
  126. end
  127. def test_login_as_registered_user_with_manual_activation_should_inform_user
  128. User.find(2).update_attribute :status, User::STATUS_REGISTERED
  129. with_settings :self_registration => '2', :default_language => 'en' do
  130. post :login, :username => 'jsmith', :password => 'jsmith'
  131. assert_redirected_to '/login'
  132. assert_include 'pending administrator approval', flash[:error]
  133. end
  134. end
  135. def test_login_as_registered_user_with_email_activation_should_propose_new_activation_email
  136. User.find(2).update_attribute :status, User::STATUS_REGISTERED
  137. with_settings :self_registration => '1', :default_language => 'en' do
  138. post :login, :username => 'jsmith', :password => 'jsmith'
  139. assert_redirected_to '/login'
  140. assert_equal 2, @request.session[:registered_user_id]
  141. assert_include 'new activation email', flash[:error]
  142. end
  143. end
  144. def test_login_should_rescue_auth_source_exception
  145. source = AuthSource.create!(:name => 'Test')
  146. User.find(2).update_attribute :auth_source_id, source.id
  147. AuthSource.any_instance.stubs(:authenticate).raises(AuthSourceException.new("Something wrong"))
  148. post :login, :username => 'jsmith', :password => 'jsmith'
  149. assert_response 500
  150. assert_select_error /Something wrong/
  151. end
  152. def test_login_should_reset_session
  153. @controller.expects(:reset_session).once
  154. post :login, :username => 'jsmith', :password => 'jsmith'
  155. assert_response 302
  156. end
  157. def test_get_logout_should_not_logout
  158. @request.session[:user_id] = 2
  159. get :logout
  160. assert_response :success
  161. assert_equal 2, @request.session[:user_id]
  162. end
  163. def test_get_logout_with_anonymous_should_redirect
  164. get :logout
  165. assert_redirected_to '/'
  166. end
  167. def test_logout
  168. @request.session[:user_id] = 2
  169. post :logout
  170. assert_redirected_to '/'
  171. assert_nil @request.session[:user_id]
  172. end
  173. def test_logout_should_reset_session
  174. @controller.expects(:reset_session).once
  175. @request.session[:user_id] = 2
  176. post :logout
  177. assert_response 302
  178. end
  179. def test_get_register_with_registration_on
  180. with_settings :self_registration => '3' do
  181. get :register
  182. assert_response :success
  183. assert_select 'input[name=?]', 'user[password]'
  184. assert_select 'input[name=?]', 'user[password_confirmation]'
  185. end
  186. end
  187. def test_get_register_should_detect_user_language
  188. with_settings :self_registration => '3' do
  189. @request.env['HTTP_ACCEPT_LANGUAGE'] = 'fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3'
  190. get :register
  191. assert_response :success
  192. assert_select 'select[name=?]', 'user[language]' do
  193. assert_select 'option[value=fr][selected=selected]'
  194. end
  195. end
  196. end
  197. def test_get_register_with_registration_off_should_redirect
  198. with_settings :self_registration => '0' do
  199. get :register
  200. assert_redirected_to '/'
  201. end
  202. end
  203. def test_get_register_should_show_hide_mail_preference
  204. get :register
  205. assert_select 'input[name=?][checked=checked]', 'pref[hide_mail]'
  206. end
  207. def test_get_register_should_show_hide_mail_preference_with_setting_turned_off
  208. with_settings :default_users_hide_mail => '0' do
  209. get :register
  210. assert_select 'input[name=?]:not([checked=checked])', 'pref[hide_mail]'
  211. end
  212. end
  213. # See integration/account_test.rb for the full test
  214. def test_post_register_with_registration_on
  215. with_settings :self_registration => '3' do
  216. assert_difference 'User.count' do
  217. post :register, :user => {
  218. :login => 'register',
  219. :password => 'secret123',
  220. :password_confirmation => 'secret123',
  221. :firstname => 'John',
  222. :lastname => 'Doe',
  223. :mail => 'register@example.com'
  224. }
  225. assert_redirected_to '/my/account'
  226. end
  227. user = User.order('id DESC').first
  228. assert_equal 'register', user.login
  229. assert_equal 'John', user.firstname
  230. assert_equal 'Doe', user.lastname
  231. assert_equal 'register@example.com', user.mail
  232. assert user.check_password?('secret123')
  233. assert user.active?
  234. end
  235. end
  236. def test_post_register_with_registration_off_should_redirect
  237. with_settings :self_registration => '0' do
  238. assert_no_difference 'User.count' do
  239. post :register, :user => {
  240. :login => 'register',
  241. :password => 'test',
  242. :password_confirmation => 'test',
  243. :firstname => 'John',
  244. :lastname => 'Doe',
  245. :mail => 'register@example.com'
  246. }
  247. assert_redirected_to '/'
  248. end
  249. end
  250. end
  251. def test_post_register_should_create_user_with_hide_mail_preference
  252. with_settings :default_users_hide_mail => '0' do
  253. user = new_record(User) do
  254. post :register, :user => {
  255. :login => 'register',
  256. :password => 'secret123', :password_confirmation => 'secret123',
  257. :firstname => 'John', :lastname => 'Doe',
  258. :mail => 'register@example.com'
  259. }, :pref => {
  260. :hide_mail => '1'
  261. }
  262. end
  263. assert_equal true, user.pref.hide_mail
  264. end
  265. end
  266. def test_get_lost_password_should_display_lost_password_form
  267. get :lost_password
  268. assert_response :success
  269. assert_select 'input[name=mail]'
  270. end
  271. def test_lost_password_for_active_user_should_create_a_token
  272. Token.delete_all
  273. ActionMailer::Base.deliveries.clear
  274. assert_difference 'ActionMailer::Base.deliveries.size' do
  275. assert_difference 'Token.count' do
  276. post :lost_password, :mail => 'JSmith@somenet.foo'
  277. assert_redirected_to '/login'
  278. end
  279. end
  280. token = Token.order('id DESC').first
  281. assert_equal User.find(2), token.user
  282. assert_equal 'recovery', token.action
  283. assert_select_email do
  284. assert_select "a[href=?]", "http://localhost:3000/account/lost_password?token=#{token.value}"
  285. end
  286. end
  287. def test_lost_password_using_additional_email_address_should_send_email_to_the_address
  288. EmailAddress.create!(:user_id => 2, :address => 'anotherAddress@foo.bar')
  289. Token.delete_all
  290. assert_difference 'ActionMailer::Base.deliveries.size' do
  291. assert_difference 'Token.count' do
  292. post :lost_password, :mail => 'ANOTHERaddress@foo.bar'
  293. assert_redirected_to '/login'
  294. end
  295. end
  296. mail = ActionMailer::Base.deliveries.last
  297. assert_equal ['anotherAddress@foo.bar'], mail.bcc
  298. end
  299. def test_lost_password_for_unknown_user_should_fail
  300. Token.delete_all
  301. assert_no_difference 'Token.count' do
  302. post :lost_password, :mail => 'invalid@somenet.foo'
  303. assert_response :success
  304. end
  305. end
  306. def test_lost_password_for_non_active_user_should_fail
  307. Token.delete_all
  308. assert User.find(2).lock!
  309. assert_no_difference 'Token.count' do
  310. post :lost_password, :mail => 'JSmith@somenet.foo'
  311. assert_redirected_to '/account/lost_password'
  312. end
  313. end
  314. def test_lost_password_for_user_who_cannot_change_password_should_fail
  315. User.any_instance.stubs(:change_password_allowed?).returns(false)
  316. assert_no_difference 'Token.count' do
  317. post :lost_password, :mail => 'JSmith@somenet.foo'
  318. assert_response :success
  319. end
  320. end
  321. def test_get_lost_password_with_token_should_display_the_password_recovery_form
  322. user = User.find(2)
  323. token = Token.create!(:action => 'recovery', :user => user)
  324. get :lost_password, :token => token.value
  325. assert_response :success
  326. assert_select 'input[type=hidden][name=token][value=?]', token.value
  327. end
  328. def test_get_lost_password_with_invalid_token_should_redirect
  329. get :lost_password, :token => "abcdef"
  330. assert_redirected_to '/'
  331. end
  332. def test_post_lost_password_with_token_should_change_the_user_password
  333. ActionMailer::Base.deliveries.clear
  334. user = User.find(2)
  335. token = Token.create!(:action => 'recovery', :user => user)
  336. post :lost_password, :token => token.value, :new_password => 'newpass123', :new_password_confirmation => 'newpass123'
  337. assert_redirected_to '/login'
  338. user.reload
  339. assert user.check_password?('newpass123')
  340. assert_nil Token.find_by_id(token.id), "Token was not deleted"
  341. assert_not_nil (mail = ActionMailer::Base.deliveries.last)
  342. assert_select_email do
  343. assert_select 'a[href^=?]', 'http://localhost:3000/my/password', :text => 'Change password'
  344. end
  345. end
  346. def test_post_lost_password_with_token_for_non_active_user_should_fail
  347. user = User.find(2)
  348. token = Token.create!(:action => 'recovery', :user => user)
  349. user.lock!
  350. post :lost_password, :token => token.value, :new_password => 'newpass123', :new_password_confirmation => 'newpass123'
  351. assert_redirected_to '/'
  352. assert ! user.check_password?('newpass123')
  353. end
  354. def test_post_lost_password_with_token_and_password_confirmation_failure_should_redisplay_the_form
  355. user = User.find(2)
  356. token = Token.create!(:action => 'recovery', :user => user)
  357. post :lost_password, :token => token.value, :new_password => 'newpass', :new_password_confirmation => 'wrongpass'
  358. assert_response :success
  359. assert_not_nil Token.find_by_id(token.id), "Token was deleted"
  360. assert_select 'input[type=hidden][name=token][value=?]', token.value
  361. end
  362. def test_post_lost_password_with_invalid_token_should_redirect
  363. post :lost_password, :token => "abcdef", :new_password => 'newpass', :new_password_confirmation => 'newpass'
  364. assert_redirected_to '/'
  365. end
  366. def test_activation_email_should_send_an_activation_email
  367. User.find(2).update_attribute :status, User::STATUS_REGISTERED
  368. @request.session[:registered_user_id] = 2
  369. with_settings :self_registration => '1' do
  370. assert_difference 'ActionMailer::Base.deliveries.size' do
  371. get :activation_email
  372. assert_redirected_to '/login'
  373. end
  374. end
  375. end
  376. def test_activation_email_without_session_data_should_fail
  377. User.find(2).update_attribute :status, User::STATUS_REGISTERED
  378. with_settings :self_registration => '1' do
  379. assert_no_difference 'ActionMailer::Base.deliveries.size' do
  380. get :activation_email
  381. assert_redirected_to '/'
  382. end
  383. end
  384. end
  385. end