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.

account_controller_test.rb 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. # Redmine - project management software
  2. # Copyright (C) 2006-2015 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 < ActionController::TestCase
  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_template 'login'
  27. assert_select 'input[name=username]'
  28. assert_select 'input[name=password]'
  29. end
  30. def test_get_login_while_logged_in_should_redirect_to_back_url_if_present
  31. @request.session[:user_id] = 2
  32. @request.env["HTTP_REFERER"] = 'http://test.host/issues/show/1'
  33. get :login, :back_url => 'http://test.host/issues/show/1'
  34. assert_redirected_to '/issues/show/1'
  35. assert_equal 2, @request.session[:user_id]
  36. end
  37. def test_get_login_while_logged_in_should_redirect_to_referer_without_back_url
  38. @request.session[:user_id] = 2
  39. @request.env["HTTP_REFERER"] = 'http://test.host/issues/show/1'
  40. get :login
  41. assert_redirected_to '/issues/show/1'
  42. assert_equal 2, @request.session[:user_id]
  43. end
  44. def test_get_login_while_logged_in_should_redirect_to_home_by_default
  45. @request.session[:user_id] = 2
  46. get :login
  47. assert_redirected_to '/'
  48. assert_equal 2, @request.session[:user_id]
  49. end
  50. def test_login_should_redirect_to_back_url_param
  51. # request.uri is "test.host" in test environment
  52. back_urls = [
  53. 'http://test.host/issues/show/1',
  54. 'http://test.host/',
  55. '/'
  56. ]
  57. back_urls.each do |back_url|
  58. post :login, :username => 'jsmith', :password => 'jsmith', :back_url => back_url
  59. assert_redirected_to back_url
  60. end
  61. end
  62. def test_login_with_suburi_should_redirect_to_back_url_param
  63. @relative_url_root = Redmine::Utils.relative_url_root
  64. Redmine::Utils.relative_url_root = '/redmine'
  65. back_urls = [
  66. 'http://test.host/redmine/issues/show/1',
  67. '/redmine'
  68. ]
  69. back_urls.each do |back_url|
  70. post :login, :username => 'jsmith', :password => 'jsmith', :back_url => back_url
  71. assert_redirected_to back_url
  72. end
  73. ensure
  74. Redmine::Utils.relative_url_root = @relative_url_root
  75. end
  76. def test_login_should_not_redirect_to_another_host
  77. back_urls = [
  78. 'http://test.foo/fake',
  79. '//test.foo/fake'
  80. ]
  81. back_urls.each do |back_url|
  82. post :login, :username => 'jsmith', :password => 'jsmith', :back_url => back_url
  83. assert_redirected_to '/my/page'
  84. end
  85. end
  86. def test_login_with_suburi_should_not_redirect_to_another_suburi
  87. @relative_url_root = Redmine::Utils.relative_url_root
  88. Redmine::Utils.relative_url_root = '/redmine'
  89. back_urls = [
  90. 'http://test.host/',
  91. 'http://test.host/fake',
  92. 'http://test.host/fake/issues',
  93. 'http://test.host/redmine/../fake',
  94. 'http://test.host/redmine/../fake/issues',
  95. 'http://test.host/redmine/%2e%2e/fake',
  96. '//test.foo/fake',
  97. 'http://test.host//fake',
  98. 'http://test.host/\n//fake',
  99. '//bar@test.foo',
  100. '//test.foo',
  101. '////test.foo',
  102. '@test.foo',
  103. 'fake@test.foo',
  104. '.test.foo'
  105. ]
  106. back_urls.each do |back_url|
  107. post :login, :username => 'jsmith', :password => 'jsmith', :back_url => back_url
  108. assert_redirected_to '/my/page'
  109. end
  110. ensure
  111. Redmine::Utils.relative_url_root = @relative_url_root
  112. end
  113. def test_login_with_wrong_password
  114. post :login, :username => 'admin', :password => 'bad'
  115. assert_response :success
  116. assert_template 'login'
  117. assert_select 'div.flash.error', :text => /Invalid user or password/
  118. assert_select 'input[name=username][value=admin]'
  119. assert_select 'input[name=password]'
  120. assert_select 'input[name=password][value]', 0
  121. end
  122. def test_login_with_locked_account_should_fail
  123. User.find(2).update_attribute :status, User::STATUS_LOCKED
  124. post :login, :username => 'jsmith', :password => 'jsmith'
  125. assert_redirected_to '/login'
  126. assert_include 'locked', flash[:error]
  127. assert_nil @request.session[:user_id]
  128. end
  129. def test_login_as_registered_user_with_manual_activation_should_inform_user
  130. User.find(2).update_attribute :status, User::STATUS_REGISTERED
  131. with_settings :self_registration => '2', :default_language => 'en' do
  132. post :login, :username => 'jsmith', :password => 'jsmith'
  133. assert_redirected_to '/login'
  134. assert_include 'pending administrator approval', flash[:error]
  135. end
  136. end
  137. def test_login_as_registered_user_with_email_activation_should_propose_new_activation_email
  138. User.find(2).update_attribute :status, User::STATUS_REGISTERED
  139. with_settings :self_registration => '1', :default_language => 'en' do
  140. post :login, :username => 'jsmith', :password => 'jsmith'
  141. assert_redirected_to '/login'
  142. assert_equal 2, @request.session[:registered_user_id]
  143. assert_include 'new activation email', flash[:error]
  144. end
  145. end
  146. def test_login_should_rescue_auth_source_exception
  147. source = AuthSource.create!(:name => 'Test')
  148. User.find(2).update_attribute :auth_source_id, source.id
  149. AuthSource.any_instance.stubs(:authenticate).raises(AuthSourceException.new("Something wrong"))
  150. post :login, :username => 'jsmith', :password => 'jsmith'
  151. assert_response 500
  152. assert_select_error /Something wrong/
  153. end
  154. def test_login_should_reset_session
  155. @controller.expects(:reset_session).once
  156. post :login, :username => 'jsmith', :password => 'jsmith'
  157. assert_response 302
  158. end
  159. def test_get_logout_should_not_logout
  160. @request.session[:user_id] = 2
  161. get :logout
  162. assert_response :success
  163. assert_template 'logout'
  164. assert_equal 2, @request.session[:user_id]
  165. end
  166. def test_get_logout_with_anonymous_should_redirect
  167. get :logout
  168. assert_redirected_to '/'
  169. end
  170. def test_logout
  171. @request.session[:user_id] = 2
  172. post :logout
  173. assert_redirected_to '/'
  174. assert_nil @request.session[:user_id]
  175. end
  176. def test_logout_should_reset_session
  177. @controller.expects(:reset_session).once
  178. @request.session[:user_id] = 2
  179. post :logout
  180. assert_response 302
  181. end
  182. def test_get_register_with_registration_on
  183. with_settings :self_registration => '3' do
  184. get :register
  185. assert_response :success
  186. assert_template 'register'
  187. assert_not_nil assigns(:user)
  188. assert_select 'input[name=?]', 'user[password]'
  189. assert_select 'input[name=?]', 'user[password_confirmation]'
  190. end
  191. end
  192. def test_get_register_should_detect_user_language
  193. with_settings :self_registration => '3' do
  194. @request.env['HTTP_ACCEPT_LANGUAGE'] = 'fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3'
  195. get :register
  196. assert_response :success
  197. assert_not_nil assigns(:user)
  198. assert_equal 'fr', assigns(:user).language
  199. assert_select 'select[name=?]', 'user[language]' do
  200. assert_select 'option[value=fr][selected=selected]'
  201. end
  202. end
  203. end
  204. def test_get_register_with_registration_off_should_redirect
  205. with_settings :self_registration => '0' do
  206. get :register
  207. assert_redirected_to '/'
  208. end
  209. end
  210. # See integration/account_test.rb for the full test
  211. def test_post_register_with_registration_on
  212. with_settings :self_registration => '3' do
  213. assert_difference 'User.count' do
  214. post :register, :user => {
  215. :login => 'register',
  216. :password => 'secret123',
  217. :password_confirmation => 'secret123',
  218. :firstname => 'John',
  219. :lastname => 'Doe',
  220. :mail => 'register@example.com'
  221. }
  222. assert_redirected_to '/my/account'
  223. end
  224. user = User.order('id DESC').first
  225. assert_equal 'register', user.login
  226. assert_equal 'John', user.firstname
  227. assert_equal 'Doe', user.lastname
  228. assert_equal 'register@example.com', user.mail
  229. assert user.check_password?('secret123')
  230. assert user.active?
  231. end
  232. end
  233. def test_post_register_with_registration_off_should_redirect
  234. with_settings :self_registration => '0' do
  235. assert_no_difference 'User.count' do
  236. post :register, :user => {
  237. :login => 'register',
  238. :password => 'test',
  239. :password_confirmation => 'test',
  240. :firstname => 'John',
  241. :lastname => 'Doe',
  242. :mail => 'register@example.com'
  243. }
  244. assert_redirected_to '/'
  245. end
  246. end
  247. end
  248. def test_get_lost_password_should_display_lost_password_form
  249. get :lost_password
  250. assert_response :success
  251. assert_select 'input[name=mail]'
  252. end
  253. def test_lost_password_for_active_user_should_create_a_token
  254. Token.delete_all
  255. ActionMailer::Base.deliveries.clear
  256. assert_difference 'ActionMailer::Base.deliveries.size' do
  257. assert_difference 'Token.count' do
  258. with_settings :host_name => 'mydomain.foo', :protocol => 'http' do
  259. post :lost_password, :mail => 'JSmith@somenet.foo'
  260. assert_redirected_to '/login'
  261. end
  262. end
  263. end
  264. token = Token.order('id DESC').first
  265. assert_equal User.find(2), token.user
  266. assert_equal 'recovery', token.action
  267. assert_select_email do
  268. assert_select "a[href=?]", "http://mydomain.foo/account/lost_password?token=#{token.value}"
  269. end
  270. end
  271. def test_lost_password_using_additional_email_address_should_send_email_to_the_address
  272. EmailAddress.create!(:user_id => 2, :address => 'anotherAddress@foo.bar')
  273. Token.delete_all
  274. assert_difference 'ActionMailer::Base.deliveries.size' do
  275. assert_difference 'Token.count' do
  276. post :lost_password, :mail => 'ANOTHERaddress@foo.bar'
  277. assert_redirected_to '/login'
  278. end
  279. end
  280. mail = ActionMailer::Base.deliveries.last
  281. assert_equal ['anotherAddress@foo.bar'], mail.bcc
  282. end
  283. def test_lost_password_for_unknown_user_should_fail
  284. Token.delete_all
  285. assert_no_difference 'Token.count' do
  286. post :lost_password, :mail => 'invalid@somenet.foo'
  287. assert_response :success
  288. end
  289. end
  290. def test_lost_password_for_non_active_user_should_fail
  291. Token.delete_all
  292. assert User.find(2).lock!
  293. assert_no_difference 'Token.count' do
  294. post :lost_password, :mail => 'JSmith@somenet.foo'
  295. assert_redirected_to '/account/lost_password'
  296. end
  297. end
  298. def test_lost_password_for_user_who_cannot_change_password_should_fail
  299. User.any_instance.stubs(:change_password_allowed?).returns(false)
  300. assert_no_difference 'Token.count' do
  301. post :lost_password, :mail => 'JSmith@somenet.foo'
  302. assert_response :success
  303. end
  304. end
  305. def test_get_lost_password_with_token_should_display_the_password_recovery_form
  306. user = User.find(2)
  307. token = Token.create!(:action => 'recovery', :user => user)
  308. get :lost_password, :token => token.value
  309. assert_response :success
  310. assert_template 'password_recovery'
  311. assert_select 'input[type=hidden][name=token][value=?]', token.value
  312. end
  313. def test_get_lost_password_with_invalid_token_should_redirect
  314. get :lost_password, :token => "abcdef"
  315. assert_redirected_to '/'
  316. end
  317. def test_post_lost_password_with_token_should_change_the_user_password
  318. user = User.find(2)
  319. token = Token.create!(:action => 'recovery', :user => user)
  320. post :lost_password, :token => token.value, :new_password => 'newpass123', :new_password_confirmation => 'newpass123'
  321. assert_redirected_to '/login'
  322. user.reload
  323. assert user.check_password?('newpass123')
  324. assert_nil Token.find_by_id(token.id), "Token was not deleted"
  325. end
  326. def test_post_lost_password_with_token_for_non_active_user_should_fail
  327. user = User.find(2)
  328. token = Token.create!(:action => 'recovery', :user => user)
  329. user.lock!
  330. post :lost_password, :token => token.value, :new_password => 'newpass123', :new_password_confirmation => 'newpass123'
  331. assert_redirected_to '/'
  332. assert ! user.check_password?('newpass123')
  333. end
  334. def test_post_lost_password_with_token_and_password_confirmation_failure_should_redisplay_the_form
  335. user = User.find(2)
  336. token = Token.create!(:action => 'recovery', :user => user)
  337. post :lost_password, :token => token.value, :new_password => 'newpass', :new_password_confirmation => 'wrongpass'
  338. assert_response :success
  339. assert_template 'password_recovery'
  340. assert_not_nil Token.find_by_id(token.id), "Token was deleted"
  341. assert_select 'input[type=hidden][name=token][value=?]', token.value
  342. end
  343. def test_post_lost_password_with_invalid_token_should_redirect
  344. post :lost_password, :token => "abcdef", :new_password => 'newpass', :new_password_confirmation => 'newpass'
  345. assert_redirected_to '/'
  346. end
  347. def test_activation_email_should_send_an_activation_email
  348. User.find(2).update_attribute :status, User::STATUS_REGISTERED
  349. @request.session[:registered_user_id] = 2
  350. with_settings :self_registration => '1' do
  351. assert_difference 'ActionMailer::Base.deliveries.size' do
  352. get :activation_email
  353. assert_redirected_to '/login'
  354. end
  355. end
  356. end
  357. def test_activation_email_without_session_data_should_fail
  358. User.find(2).update_attribute :status, User::STATUS_REGISTERED
  359. with_settings :self_registration => '1' do
  360. assert_no_difference 'ActionMailer::Base.deliveries.size' do
  361. get :activation_email
  362. assert_redirected_to '/'
  363. end
  364. end
  365. end
  366. end