1
0
Fork 0
mirror of https://github.com/heartcombo/devise.git synced 2022-11-09 12:18:31 -05:00
heartcombo--devise/test/integration/recoverable_test.rb

335 lines
12 KiB
Ruby
Raw Normal View History

require 'test_helper'
2009-10-12 07:37:42 -04: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
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?
Devise.stubs(:friendly_token).returns("abcdef")
2009-10-12 07:37:42 -04:00
click_button 'Send me reset password instructions'
end
def reset_password(options={}, &block)
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")
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
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')
request_forgot_password do
2014-02-25 11:42:55 -05:00
fill_in 'email', with: 'foo@bar.com'
end
assert_current_url '/users/sign_in'
assert_contain 'You will receive an email with instructions on how to reset your password in a few minutes.'
end
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')
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'
end
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
end
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')
request_forgot_password do
2014-02-25 11:42:55 -05:00
fill_in 'email', with: 'foo@bar.com'
end
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
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
request_forgot_password do
2014-02-25 11:42:55 -05:00
fill_in 'email', with: ' foo@bar.com '
end
2011-06-21 17:44:38 -04:00
assert_current_url '/users/sign_in'
assert_contain 'You will receive an email with instructions on how to reset your password in a few minutes.'
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
request_forgot_password do
2014-02-25 11:42:55 -05:00
fill_in 'email', with: ' foo@bar.com '
end
2011-06-21 17:44:38 -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 ']"
assert_contain 'not found'
end
end
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'
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']"
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
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'
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
request_forgot_password
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'
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
request_forgot_password
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
2013-12-02 04:02:17 -05:00
test 'after entering invalid data user should still be able to change their password' do
user = create_user
request_forgot_password
2014-02-25 11:42:55 -05:00
reset_password { fill_in 'Confirm new password', with: 'other_password' }
assert_response :success
2010-04-13 17:28:13 -04:00
assert_have_selector '#error_explanation'
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.'
assert user.reload.valid_password?('987654321')
end
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
request_forgot_password
reset_password
assert warden.authenticated?(:user)
end
2010-02-05 15:34:05 -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)
request_forgot_password
reset_password
2014-02-28 15:18:22 -05:00
assert_contain 'Your password has been changed successfully.'
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
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)
request_forgot_password
reset_password
2014-02-28 15:18:22 -05:00
assert_contain 'Your password has been changed successfully.'
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)
request_forgot_password
reset_password
2014-02-28 15:18:22 -05:00
assert_contain 'Your password has been changed successfully.'
assert !user.reload.access_locked?
assert warden.authenticated?(:user)
end
2010-02-05 15:34:05 -05:00
end
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"}
assert_response :success
2011-06-21 17:44:38 -04:00
assert_equal response.body, { }.to_xml
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"}
assert_response :unprocessable_entity
assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<errors>)
end
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
create_user
2014-02-25 11:42:55 -05:00
post user_password_path(format: 'xml'), user: {email: "invalid@test.com"}
assert_response :success
assert_equal response.body, { }.to_xml
end
end
test 'change password with valid parameters in XML format should return valid response' do
2013-09-14 16:22:53 -04:00
create_user
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'
}
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
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'}
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'}
assert_response :unprocessable_entity
assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<errors>)
end
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'
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."
assert_current_url "/users/sign_in"
end
2011-05-20 18:41:26 -04:00
end
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'
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."
assert_current_url "/users/sign_in"
2011-05-20 18:41:26 -04:00
end
end
2012-03-19 16:09:22 -04:00
test "after recovering a password, should set failed attempts to 0" do
user = create_user
user.update_attribute(:failed_attempts, 10)
2012-03-19 16:09:22 -04:00
assert_equal 10, user.failed_attempts
request_forgot_password
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