2010-03-26 06:27:19 -04:00
require 'test_helper'
2009-10-12 07:37:42 -04:00
2013-01-22 20:17:17 -05:00
class PasswordTest < ActionDispatch :: IntegrationTest
2009-10-12 07:37:42 -04:00
def visit_new_password_path
2009-10-12 08:56:12 -04:00
visit new_user_session_path
2010-03-30 14:06:56 -04:00
click_link 'Forgot your password?'
2009-10-12 07:37:42 -04:00
end
def request_forgot_password ( & block )
visit_new_password_path
assert_response :success
2009-10-12 08:56:12 -04:00
assert_not warden . authenticated? ( :user )
2009-10-12 07:37:42 -04:00
2014-02-25 11:42:55 -05:00
fill_in 'email' , with : 'user@test.com'
2009-10-12 07:37:42 -04:00
yield if block_given?
2013-08-06 05:55:13 -04:00
Devise . stubs ( :friendly_token ) . returns ( " abcdef " )
2009-10-12 07:37:42 -04:00
click_button 'Send me reset password instructions'
end
2011-05-20 17:42:11 -04:00
def reset_password ( options = { } , & block )
2013-08-06 05:55:13 -04:00
unless options [ :visit ] == false
2014-02-25 11:42:55 -05:00
visit edit_user_password_path ( reset_password_token : options [ :reset_password_token ] || " abcdef " )
2013-08-06 05:55:13 -04:00
assert_response :success
end
2009-10-12 07:37:42 -04:00
2014-02-25 11:42:55 -05:00
fill_in 'New password' , with : '987654321'
fill_in 'Confirm new password' , with : '987654321'
2009-10-12 07:37:42 -04:00
yield if block_given?
click_button 'Change my password'
end
2010-11-20 09:54:01 -05:00
test 'reset password with email of different case should succeed when email is in the list of case insensitive keys' do
2014-02-25 11:42:55 -05:00
create_user ( email : 'Foo@Bar.com' )
2011-05-20 17:42:11 -04:00
2010-11-20 09:54:01 -05:00
request_forgot_password do
2014-02-25 11:42:55 -05:00
fill_in 'email' , with : 'foo@bar.com'
2010-11-20 09:54:01 -05:00
end
2011-05-20 17:42:11 -04:00
2010-11-20 09:54:01 -05:00
assert_current_url '/users/sign_in'
2013-11-28 11:29:50 -05:00
assert_contain 'You will receive an email with instructions on how to reset your password in a few minutes.'
2010-11-20 09:54:01 -05:00
end
2011-11-05 11:53:27 -04:00
test 'reset password with email should send an email from a custom mailer' do
2014-02-25 11:42:55 -05:00
create_user ( email : 'Foo@Bar.com' )
2011-11-05 11:53:27 -04:00
User . any_instance . stubs ( :devise_mailer ) . returns ( Users :: Mailer )
request_forgot_password do
2014-02-25 11:42:55 -05:00
fill_in 'email' , with : 'foo@bar.com'
2011-11-05 11:53:27 -04:00
end
2013-08-06 05:55:13 -04:00
mail = ActionMailer :: Base . deliveries . last
assert_equal [ 'custom@example.com' ] , mail . from
assert_match edit_user_password_path ( reset_password_token : 'abcdef' ) , mail . body . encoded
2011-11-05 11:53:27 -04:00
end
2010-11-20 09:54:01 -05:00
test 'reset password with email of different case should fail when email is NOT the list of case insensitive keys' do
2014-02-25 11:42:55 -05:00
swap Devise , case_insensitive_keys : [ ] do
create_user ( email : 'Foo@Bar.com' )
2011-05-20 17:42:11 -04:00
2010-11-20 09:54:01 -05:00
request_forgot_password do
2014-02-25 11:42:55 -05:00
fill_in 'email' , with : 'foo@bar.com'
2010-11-20 09:54:01 -05:00
end
2011-05-20 17:42:11 -04:00
2010-11-20 09:54:01 -05:00
assert_response :success
assert_current_url '/users/password'
assert_have_selector " input[type=email][value='foo@bar.com'] "
assert_contain 'not found'
end
end
2011-06-21 17:44:38 -04:00
2011-06-10 04:37:43 -04:00
test 'reset password with email with extra whitespace should succeed when email is in the list of strip whitespace keys' do
2014-02-25 11:42:55 -05:00
create_user ( email : 'foo@bar.com' )
2011-06-21 17:44:38 -04:00
2011-06-10 04:37:43 -04:00
request_forgot_password do
2014-02-25 11:42:55 -05:00
fill_in 'email' , with : ' foo@bar.com '
2011-06-10 04:37:43 -04:00
end
2011-06-21 17:44:38 -04:00
2011-06-10 04:37:43 -04:00
assert_current_url '/users/sign_in'
2013-11-28 11:29:50 -05:00
assert_contain 'You will receive an email with instructions on how to reset your password in a few minutes.'
2011-06-10 04:37:43 -04:00
end
test 'reset password with email with extra whitespace should fail when email is NOT the list of strip whitespace keys' do
2014-02-25 11:42:55 -05:00
swap Devise , strip_whitespace_keys : [ ] do
create_user ( email : 'foo@bar.com' )
2011-06-21 17:44:38 -04:00
2011-06-10 04:37:43 -04:00
request_forgot_password do
2014-02-25 11:42:55 -05:00
fill_in 'email' , with : ' foo@bar.com '
2011-06-10 04:37:43 -04:00
end
2011-06-21 17:44:38 -04:00
2011-06-10 04:37:43 -04:00
assert_response :success
assert_current_url '/users/password'
2011-06-10 05:10:56 -04:00
assert_have_selector " input[type=email][value=' foo@bar.com '] "
2011-06-10 04:37:43 -04:00
assert_contain 'not found'
end
end
2010-11-20 09:54:01 -05:00
2009-10-12 08:56:12 -04:00
test 'authenticated user should not be able to visit forgot password page' do
sign_in_as_user
assert warden . authenticated? ( :user )
2009-10-12 07:37:42 -04:00
2009-10-12 08:56:12 -04:00
get new_user_password_path
2009-10-12 07:37:42 -04:00
assert_response :redirect
assert_redirected_to root_path
end
2009-10-12 08:56:12 -04:00
test 'not authenticated user should be able to request a forgot password' do
create_user
2009-10-12 07:37:42 -04:00
request_forgot_password
2010-09-30 03:05:11 -04:00
assert_current_url '/users/sign_in'
2013-11-28 11:29:50 -05:00
assert_contain 'You will receive an email with instructions on how to reset your password in a few minutes.'
2009-10-12 07:37:42 -04:00
end
2009-10-12 08:56:12 -04:00
test 'not authenticated user with invalid email should receive an error message' do
2009-10-12 07:37:42 -04:00
request_forgot_password do
2014-02-25 11:42:55 -05:00
fill_in 'email' , with : 'invalid.test@test.com'
2009-10-12 07:37:42 -04:00
end
assert_response :success
2010-09-30 03:05:11 -04:00
assert_current_url '/users/password'
assert_have_selector " input[type=email][value='invalid.test@test.com'] "
2010-07-25 13:53:42 -04:00
assert_contain 'not found'
2009-10-12 07:37:42 -04:00
end
2009-10-12 08:56:12 -04:00
test 'authenticated user should not be able to visit edit password page' do
sign_in_as_user
get edit_user_password_path
2009-10-12 07:37:42 -04:00
assert_response :redirect
assert_redirected_to root_path
2009-10-12 08:56:12 -04:00
assert warden . authenticated? ( :user )
2009-10-12 07:37:42 -04:00
end
2012-06-08 04:08:35 -04:00
test 'not authenticated user without a reset password token should not be able to visit the page' do
get edit_user_password_path
assert_response :redirect
assert_redirected_to " /users/sign_in "
end
2013-12-02 04:02:17 -05:00
test 'not authenticated user with invalid reset password token should not be able to change their password' do
2009-10-12 08:56:12 -04:00
user = create_user
2014-02-25 11:42:55 -05:00
reset_password reset_password_token : 'invalid_reset_password'
2009-10-12 07:37:42 -04:00
assert_response :success
2010-09-30 03:05:11 -04:00
assert_current_url '/users/password'
2010-04-13 17:28:13 -04:00
assert_have_selector '#error_explanation'
2009-12-21 15:10:23 -05:00
assert_contain / Reset password token(.*)invalid /
2009-10-12 08:56:12 -04:00
assert_not user . reload . valid_password? ( '987654321' )
2009-10-12 07:37:42 -04:00
end
2013-12-02 04:02:17 -05:00
test 'not authenticated user with valid reset password token but invalid password should not be able to change their password' do
2009-10-12 08:56:12 -04:00
user = create_user
2009-10-15 16:36:44 -04:00
request_forgot_password
2013-08-06 05:55:13 -04:00
reset_password do
2014-02-25 11:42:55 -05:00
fill_in 'Confirm new password' , with : 'other_password'
2009-10-12 07:37:42 -04:00
end
assert_response :success
2010-09-30 03:05:11 -04:00
assert_current_url '/users/password'
2010-04-13 17:28:13 -04:00
assert_have_selector '#error_explanation'
2013-05-03 21:56:46 -04:00
assert_contain Devise . rails4? ?
" Password confirmation doesn't match Password " : " Password doesn't match confirmation "
2009-10-12 08:56:12 -04:00
assert_not user . reload . valid_password? ( '987654321' )
2009-10-12 07:37:42 -04:00
end
2013-12-02 04:02:17 -05:00
test 'not authenticated user with valid data should be able to change their password' do
2009-10-12 08:56:12 -04:00
user = create_user
2009-10-15 16:36:44 -04:00
request_forgot_password
2013-08-06 05:55:13 -04:00
reset_password
2009-10-12 07:37:42 -04:00
2010-09-30 03:05:11 -04:00
assert_current_url '/'
2014-02-28 15:18:22 -05:00
assert_contain 'Your password has been changed successfully. You are now signed in.'
2009-10-12 08:56:12 -04:00
assert user . reload . valid_password? ( '987654321' )
2009-10-12 07:37:42 -04:00
end
2009-10-18 07:54:53 -04:00
2013-12-02 04:02:17 -05:00
test 'after entering invalid data user should still be able to change their password' do
2009-10-18 07:54:53 -04:00
user = create_user
request_forgot_password
2013-08-06 05:55:13 -04:00
2014-02-25 11:42:55 -05:00
reset_password { fill_in 'Confirm new password' , with : 'other_password' }
2009-10-18 07:54:53 -04:00
assert_response :success
2010-04-13 17:28:13 -04:00
assert_have_selector '#error_explanation'
2009-10-18 07:54:53 -04:00
assert_not user . reload . valid_password? ( '987654321' )
2014-02-25 11:42:55 -05:00
reset_password visit : false
2014-02-28 15:18:22 -05:00
assert_contain 'Your password has been changed successfully.'
2009-10-18 07:54:53 -04:00
assert user . reload . valid_password? ( '987654321' )
end
2009-10-18 08:36:20 -04:00
2011-07-29 17:17:31 -04:00
test 'sign in user automatically after changing its password' do
2013-09-14 16:22:53 -04:00
create_user
2009-10-18 08:36:20 -04:00
request_forgot_password
2013-08-06 05:55:13 -04:00
reset_password
2009-10-18 08:36:20 -04:00
assert warden . authenticated? ( :user )
end
2010-02-05 15:34:05 -05:00
2012-11-07 04:45:46 -05:00
test 'does not sign in user automatically after changing its password if it\'s locked and unlock strategy is :none or :time' do
[ :none , :time ] . each do | strategy |
2014-02-25 11:42:55 -05:00
swap Devise , unlock_strategy : strategy do
user = create_user ( locked : true )
2012-11-07 04:45:46 -05:00
request_forgot_password
2013-08-06 05:55:13 -04:00
reset_password
2012-11-07 04:45:46 -05:00
2014-02-28 15:18:22 -05:00
assert_contain 'Your password has been changed successfully.'
2012-11-07 04:45:46 -05:00
assert_not_contain 'You are now signed in.'
assert_equal new_user_session_path , @request . path
assert ! warden . authenticated? ( :user )
end
end
end
2010-02-05 15:34:05 -05:00
2012-11-07 04:45:46 -05:00
test 'unlocks and signs in locked user automatically after changing it\'s password if unlock strategy is :email' do
2014-02-25 11:42:55 -05:00
swap Devise , unlock_strategy : :email do
user = create_user ( locked : true )
2012-11-07 04:45:46 -05:00
request_forgot_password
2013-08-06 05:55:13 -04:00
reset_password
2012-11-07 04:45:46 -05:00
2014-02-28 15:18:22 -05:00
assert_contain 'Your password has been changed successfully.'
2012-11-07 04:45:46 -05:00
assert ! user . reload . access_locked?
assert warden . authenticated? ( :user )
end
end
test 'unlocks and signs in locked user automatically after changing it\'s password if unlock strategy is :both' do
2014-02-25 11:42:55 -05:00
swap Devise , unlock_strategy : :both do
user = create_user ( locked : true )
2012-11-07 04:45:46 -05:00
request_forgot_password
2013-08-06 05:55:13 -04:00
reset_password
2012-11-07 04:45:46 -05:00
2014-02-28 15:18:22 -05:00
assert_contain 'Your password has been changed successfully.'
2012-11-07 04:45:46 -05:00
assert ! user . reload . access_locked?
assert warden . authenticated? ( :user )
end
2010-02-05 15:34:05 -05:00
end
2011-01-15 14:33:54 -05:00
test 'reset password request with valid E-Mail in XML format should return valid response' do
create_user
2014-02-25 11:42:55 -05:00
post user_password_path ( format : 'xml' ) , user : { email : " user@test.com " }
2011-01-15 14:33:54 -05:00
assert_response :success
2011-06-21 17:44:38 -04:00
assert_equal response . body , { } . to_xml
2011-01-15 14:33:54 -05:00
end
test 'reset password request with invalid E-Mail in XML format should return valid response' do
create_user
2014-02-25 11:42:55 -05:00
post user_password_path ( format : 'xml' ) , user : { email : " invalid.test@test.com " }
2011-01-15 14:33:54 -05:00
assert_response :unprocessable_entity
assert response . body . include? %( <?xml version= \" 1.0 \" encoding= \" UTF-8 \" ?> \n <errors> )
end
2011-10-12 17:12:20 -04:00
test 'reset password request with invalid E-Mail in XML format should return empty and valid response' do
2014-02-25 11:42:55 -05:00
swap Devise , paranoid : true do
2011-10-12 17:12:20 -04:00
create_user
2014-02-25 11:42:55 -05:00
post user_password_path ( format : 'xml' ) , user : { email : " invalid@test.com " }
2011-10-12 17:12:20 -04:00
assert_response :success
assert_equal response . body , { } . to_xml
end
end
2011-01-15 14:33:54 -05:00
test 'change password with valid parameters in XML format should return valid response' do
2013-09-14 16:22:53 -04:00
create_user
2011-01-15 14:33:54 -05:00
request_forgot_password
2014-02-25 11:42:55 -05:00
put user_password_path ( format : 'xml' ) , user : {
reset_password_token : 'abcdef' , password : '987654321' , password_confirmation : '987654321'
2013-08-06 05:55:13 -04:00
}
2011-01-15 14:33:54 -05:00
assert_response :success
assert warden . authenticated? ( :user )
end
test 'change password with invalid token in XML format should return invalid response' do
2013-04-18 00:54:38 -04:00
create_user
2011-01-15 14:33:54 -05:00
request_forgot_password
2014-02-25 11:42:55 -05:00
put user_password_path ( format : 'xml' ) , user : { reset_password_token : 'invalid.token' , password : '987654321' , password_confirmation : '987654321' }
2011-01-15 14:33:54 -05:00
assert_response :unprocessable_entity
assert response . body . include? %( <?xml version= \" 1.0 \" encoding= \" UTF-8 \" ?> \n <errors> )
end
test 'change password with invalid new password in XML format should return invalid response' do
user = create_user
request_forgot_password
2014-02-25 11:42:55 -05:00
put user_password_path ( format : 'xml' ) , user : { reset_password_token : user . reload . reset_password_token , password : '' , password_confirmation : '987654321' }
2011-01-15 14:33:54 -05:00
assert_response :unprocessable_entity
assert response . body . include? %( <?xml version= \" 1.0 \" encoding= \" UTF-8 \" ?> \n <errors> )
end
2011-05-20 17:42:11 -04:00
2011-06-22 20:04:50 -04:00
test " when using json requests to ask a confirmable request, should not return the object " do
2014-02-25 11:42:55 -05:00
user = create_user ( confirm : false )
2011-06-22 20:04:50 -04:00
2014-02-25 11:42:55 -05:00
post user_password_path ( format : :json ) , user : { email : user . email }
2011-06-22 20:04:50 -04:00
assert_response :success
assert_equal response . body , " {} "
end
2011-05-20 18:41:26 -04:00
test " when in paranoid mode and with an invalid e-mail, asking to reset a password should display a message that does not indicates that the e-mail does not exists in the database " do
2014-02-25 11:42:55 -05:00
swap Devise , paranoid : true do
2011-05-20 18:41:26 -04:00
visit_new_password_path
2014-02-25 11:42:55 -05:00
fill_in " email " , with : " arandomemail@test.com "
2011-05-20 18:41:26 -04:00
click_button 'Send me reset password instructions'
2011-06-16 10:27:27 -04:00
assert_not_contain " 1 error prohibited this user from being saved: "
assert_not_contain " Email not found "
2012-05-14 16:53:34 -04:00
assert_contain " If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes. "
2011-10-12 17:12:20 -04:00
assert_current_url " /users/sign_in "
2011-05-20 17:42:11 -04:00
end
2011-05-20 18:41:26 -04:00
end
2011-05-20 17:42:11 -04:00
2011-06-16 10:27:27 -04:00
test " when in paranoid mode and with a valid e-mail, asking to reset password should display a message that does not indicates that the email exists in the database and redirect to the failure route " do
2014-02-25 11:42:55 -05:00
swap Devise , paranoid : true do
2011-05-20 18:41:26 -04:00
user = create_user
visit_new_password_path
2014-02-25 11:42:55 -05:00
fill_in 'email' , with : user . email
2011-05-20 18:41:26 -04:00
click_button 'Send me reset password instructions'
2011-06-16 10:27:27 -04:00
2012-05-14 16:53:34 -04:00
assert_contain " If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes. "
2011-10-12 17:12:20 -04:00
assert_current_url " /users/sign_in "
2011-05-20 18:41:26 -04:00
end
2011-05-20 17:42:11 -04:00
end
2012-03-19 16:09:22 -04:00
test " after recovering a password, should set failed attempts to 0 " do
user = create_user
2012-08-05 08:24:10 -04:00
user . update_attribute ( :failed_attempts , 10 )
2012-03-19 16:09:22 -04:00
assert_equal 10 , user . failed_attempts
request_forgot_password
2013-08-06 05:55:13 -04:00
reset_password
2012-03-19 16:09:22 -04:00
assert warden . authenticated? ( :user )
user . reload
assert_equal 0 , user . failed_attempts
end
2009-10-12 07:37:42 -04:00
end