devise-jdguyot 1.2.rc

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. data/.gitignore +10 -0
  2. data/CHANGELOG.rdoc +532 -0
  3. data/Gemfile +29 -0
  4. data/Gemfile.lock +152 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.rdoc +353 -0
  7. data/Rakefile +36 -0
  8. data/TODO +4 -0
  9. data/app/controllers/devise/confirmations_controller.rb +33 -0
  10. data/app/controllers/devise/omniauth_callbacks_controller.rb +26 -0
  11. data/app/controllers/devise/passwords_controller.rb +41 -0
  12. data/app/controllers/devise/registrations_controller.rb +110 -0
  13. data/app/controllers/devise/sessions_controller.rb +25 -0
  14. data/app/controllers/devise/unlocks_controller.rb +34 -0
  15. data/app/helpers/devise_helper.rb +19 -0
  16. data/app/mailers/devise/mailer.rb +88 -0
  17. data/app/views/devise/confirmations/new.html.erb +12 -0
  18. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  19. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  20. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  21. data/app/views/devise/passwords/edit.html.erb +16 -0
  22. data/app/views/devise/passwords/new.html.erb +12 -0
  23. data/app/views/devise/registrations/edit.html.erb +25 -0
  24. data/app/views/devise/registrations/new.html.erb +18 -0
  25. data/app/views/devise/sessions/new.html.erb +17 -0
  26. data/app/views/devise/shared/_links.erb +25 -0
  27. data/app/views/devise/unlocks/new.html.erb +12 -0
  28. data/config/locales/en.yml +46 -0
  29. data/devise.gemspec +25 -0
  30. data/lib/devise/controllers/helpers.rb +227 -0
  31. data/lib/devise/controllers/internal_helpers.rb +119 -0
  32. data/lib/devise/controllers/scoped_views.rb +33 -0
  33. data/lib/devise/controllers/url_helpers.rb +39 -0
  34. data/lib/devise/encryptors/authlogic_sha512.rb +19 -0
  35. data/lib/devise/encryptors/base.rb +20 -0
  36. data/lib/devise/encryptors/clearance_sha1.rb +17 -0
  37. data/lib/devise/encryptors/restful_authentication_sha1.rb +22 -0
  38. data/lib/devise/encryptors/sha1.rb +25 -0
  39. data/lib/devise/encryptors/sha512.rb +25 -0
  40. data/lib/devise/failure_app.rb +132 -0
  41. data/lib/devise/hooks/activatable.rb +11 -0
  42. data/lib/devise/hooks/forgetable.rb +12 -0
  43. data/lib/devise/hooks/rememberable.rb +48 -0
  44. data/lib/devise/hooks/timeoutable.rb +22 -0
  45. data/lib/devise/hooks/trackable.rb +9 -0
  46. data/lib/devise/mapping.rb +110 -0
  47. data/lib/devise/models/authenticatable.rb +146 -0
  48. data/lib/devise/models/confirmable.rb +160 -0
  49. data/lib/devise/models/database_authenticatable.rb +100 -0
  50. data/lib/devise/models/encryptable.rb +72 -0
  51. data/lib/devise/models/lockable.rb +169 -0
  52. data/lib/devise/models/omniauthable.rb +23 -0
  53. data/lib/devise/models/recoverable.rb +123 -0
  54. data/lib/devise/models/registerable.rb +21 -0
  55. data/lib/devise/models/rememberable.rb +130 -0
  56. data/lib/devise/models/timeoutable.rb +43 -0
  57. data/lib/devise/models/token_authenticatable.rb +72 -0
  58. data/lib/devise/models/trackable.rb +30 -0
  59. data/lib/devise/models/validatable.rb +65 -0
  60. data/lib/devise/models.rb +68 -0
  61. data/lib/devise/modules.rb +30 -0
  62. data/lib/devise/omniauth/config.rb +30 -0
  63. data/lib/devise/omniauth/test_helpers.rb +57 -0
  64. data/lib/devise/omniauth/url_helpers.rb +29 -0
  65. data/lib/devise/omniauth.rb +47 -0
  66. data/lib/devise/orm/active_record.rb +38 -0
  67. data/lib/devise/orm/mongoid.rb +31 -0
  68. data/lib/devise/path_checker.rb +18 -0
  69. data/lib/devise/rails/routes.rb +292 -0
  70. data/lib/devise/rails/warden_compat.rb +125 -0
  71. data/lib/devise/rails.rb +50 -0
  72. data/lib/devise/schema.rb +97 -0
  73. data/lib/devise/strategies/authenticatable.rb +150 -0
  74. data/lib/devise/strategies/base.rb +15 -0
  75. data/lib/devise/strategies/database_authenticatable.rb +21 -0
  76. data/lib/devise/strategies/rememberable.rb +51 -0
  77. data/lib/devise/strategies/token_authenticatable.rb +53 -0
  78. data/lib/devise/test_helpers.rb +100 -0
  79. data/lib/devise/version.rb +3 -0
  80. data/lib/devise.rb +381 -0
  81. data/lib/generators/active_record/devise_generator.rb +28 -0
  82. data/lib/generators/active_record/templates/migration.rb +31 -0
  83. data/lib/generators/devise/devise_generator.rb +17 -0
  84. data/lib/generators/devise/install_generator.rb +24 -0
  85. data/lib/generators/devise/orm_helpers.rb +23 -0
  86. data/lib/generators/devise/views_generator.rb +106 -0
  87. data/lib/generators/mongoid/devise_generator.rb +17 -0
  88. data/lib/generators/templates/README +25 -0
  89. data/lib/generators/templates/devise.rb +186 -0
  90. data/test/controllers/helpers_test.rb +237 -0
  91. data/test/controllers/internal_helpers_test.rb +72 -0
  92. data/test/controllers/url_helpers_test.rb +59 -0
  93. data/test/devise_test.rb +65 -0
  94. data/test/encryptors_test.rb +30 -0
  95. data/test/failure_app_test.rb +187 -0
  96. data/test/generators/active_record_generator_test.rb +24 -0
  97. data/test/generators/install_generator_test.rb +13 -0
  98. data/test/generators/mongoid_generator_test.rb +22 -0
  99. data/test/generators/views_generator_test.rb +35 -0
  100. data/test/indifferent_hash.rb +33 -0
  101. data/test/integration/authenticatable_test.rb +447 -0
  102. data/test/integration/confirmable_test.rb +104 -0
  103. data/test/integration/database_authenticatable_test.rb +60 -0
  104. data/test/integration/http_authenticatable_test.rb +74 -0
  105. data/test/integration/lockable_test.rb +109 -0
  106. data/test/integration/omniauthable_test.rb +107 -0
  107. data/test/integration/recoverable_test.rb +160 -0
  108. data/test/integration/registerable_test.rb +179 -0
  109. data/test/integration/rememberable_test.rb +180 -0
  110. data/test/integration/timeoutable_test.rb +89 -0
  111. data/test/integration/token_authenticatable_test.rb +99 -0
  112. data/test/integration/trackable_test.rb +64 -0
  113. data/test/mailers/confirmation_instructions_test.rb +84 -0
  114. data/test/mailers/reset_password_instructions_test.rb +72 -0
  115. data/test/mailers/unlock_instructions_test.rb +66 -0
  116. data/test/mapping_test.rb +119 -0
  117. data/test/models/confirmable_test.rb +221 -0
  118. data/test/models/database_authenticatable_test.rb +98 -0
  119. data/test/models/encryptable_test.rb +65 -0
  120. data/test/models/lockable_test.rb +204 -0
  121. data/test/models/recoverable_test.rb +190 -0
  122. data/test/models/rememberable_test.rb +279 -0
  123. data/test/models/timeoutable_test.rb +28 -0
  124. data/test/models/token_authenticatable_test.rb +37 -0
  125. data/test/models/trackable_test.rb +5 -0
  126. data/test/models/validatable_test.rb +99 -0
  127. data/test/models_test.rb +84 -0
  128. data/test/omniauth/url_helpers_test.rb +47 -0
  129. data/test/orm/active_record.rb +9 -0
  130. data/test/orm/mongoid.rb +11 -0
  131. data/test/rails_app/Rakefile +10 -0
  132. data/test/rails_app/app/active_record/admin.rb +6 -0
  133. data/test/rails_app/app/active_record/shim.rb +2 -0
  134. data/test/rails_app/app/active_record/user.rb +8 -0
  135. data/test/rails_app/app/controllers/admins/sessions_controller.rb +6 -0
  136. data/test/rails_app/app/controllers/admins_controller.rb +6 -0
  137. data/test/rails_app/app/controllers/application_controller.rb +8 -0
  138. data/test/rails_app/app/controllers/home_controller.rb +16 -0
  139. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +2 -0
  140. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +2 -0
  141. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +7 -0
  142. data/test/rails_app/app/controllers/users_controller.rb +18 -0
  143. data/test/rails_app/app/helpers/application_helper.rb +3 -0
  144. data/test/rails_app/app/mongoid/admin.rb +9 -0
  145. data/test/rails_app/app/mongoid/shim.rb +29 -0
  146. data/test/rails_app/app/mongoid/user.rb +10 -0
  147. data/test/rails_app/app/views/admins/index.html.erb +1 -0
  148. data/test/rails_app/app/views/admins/sessions/new.html.erb +2 -0
  149. data/test/rails_app/app/views/home/index.html.erb +1 -0
  150. data/test/rails_app/app/views/home/private.html.erb +1 -0
  151. data/test/rails_app/app/views/layouts/application.html.erb +24 -0
  152. data/test/rails_app/app/views/users/index.html.erb +1 -0
  153. data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +1 -0
  154. data/test/rails_app/app/views/users/sessions/new.html.erb +1 -0
  155. data/test/rails_app/config/application.rb +40 -0
  156. data/test/rails_app/config/boot.rb +13 -0
  157. data/test/rails_app/config/database.yml +18 -0
  158. data/test/rails_app/config/environment.rb +5 -0
  159. data/test/rails_app/config/environments/development.rb +19 -0
  160. data/test/rails_app/config/environments/production.rb +33 -0
  161. data/test/rails_app/config/environments/test.rb +33 -0
  162. data/test/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  163. data/test/rails_app/config/initializers/devise.rb +176 -0
  164. data/test/rails_app/config/initializers/inflections.rb +2 -0
  165. data/test/rails_app/config/initializers/secret_token.rb +2 -0
  166. data/test/rails_app/config/routes.rb +55 -0
  167. data/test/rails_app/config.ru +4 -0
  168. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +31 -0
  169. data/test/rails_app/db/schema.rb +52 -0
  170. data/test/rails_app/lib/shared_admin.rb +9 -0
  171. data/test/rails_app/lib/shared_user.rb +23 -0
  172. data/test/rails_app/public/404.html +26 -0
  173. data/test/rails_app/public/422.html +26 -0
  174. data/test/rails_app/public/500.html +26 -0
  175. data/test/rails_app/public/favicon.ico +0 -0
  176. data/test/rails_app/script/rails +10 -0
  177. data/test/routes_test.rb +179 -0
  178. data/test/support/assertions.rb +24 -0
  179. data/test/support/helpers.rb +60 -0
  180. data/test/support/integration.rb +88 -0
  181. data/test/support/locale/en.yml +4 -0
  182. data/test/support/webrat/integrations/rails.rb +24 -0
  183. data/test/test_helper.rb +29 -0
  184. data/test/test_helpers_test.rb +118 -0
  185. metadata +388 -0
@@ -0,0 +1,109 @@
1
+ require 'test_helper'
2
+
3
+ class LockTest < ActionController::IntegrationTest
4
+
5
+ def visit_user_unlock_with_token(unlock_token)
6
+ visit user_unlock_path(:unlock_token => unlock_token)
7
+ end
8
+
9
+ test 'user should be able to request a new unlock token' do
10
+ user = create_user(:locked => true)
11
+ ActionMailer::Base.deliveries.clear
12
+
13
+ visit new_user_session_path
14
+ click_link "Didn't receive unlock instructions?"
15
+
16
+ fill_in 'email', :with => user.email
17
+ click_button 'Resend unlock instructions'
18
+
19
+ assert_template 'sessions/new'
20
+ assert_contain 'You will receive an email with instructions about how to unlock your account in a few minutes'
21
+ assert_equal 1, ActionMailer::Base.deliveries.size
22
+ end
23
+
24
+ test 'unlocked user should not be able to request a unlock token' do
25
+ user = create_user(:locked => false)
26
+ ActionMailer::Base.deliveries.clear
27
+
28
+ visit new_user_session_path
29
+ click_link "Didn't receive unlock instructions?"
30
+
31
+ fill_in 'email', :with => user.email
32
+ click_button 'Resend unlock instructions'
33
+
34
+ assert_template 'unlocks/new'
35
+ assert_contain 'not locked'
36
+ assert_equal 0, ActionMailer::Base.deliveries.size
37
+ end
38
+
39
+ test 'unlocked pages should not be available if email strategy is disabled' do
40
+ visit "/admins/sign_in"
41
+
42
+ assert_raise Webrat::NotFoundError do
43
+ click_link "Didn't receive unlock instructions?"
44
+ end
45
+
46
+ assert_raise NameError do
47
+ visit new_admin_unlock_path
48
+ end
49
+
50
+ visit "/admins/unlock/new"
51
+ assert_response :not_found
52
+ end
53
+
54
+ test 'user with invalid unlock token should not be able to unlock an account' do
55
+ visit_user_unlock_with_token('invalid_token')
56
+
57
+ assert_response :success
58
+ assert_current_url '/users/unlock?unlock_token=invalid_token'
59
+ assert_have_selector '#error_explanation'
60
+ assert_contain /Unlock token(.*)invalid/
61
+ end
62
+
63
+ test "locked user should be able to unlock account" do
64
+ user = create_user(:locked => true)
65
+ assert user.access_locked?
66
+
67
+ visit_user_unlock_with_token(user.unlock_token)
68
+
69
+ assert_current_url '/'
70
+ assert_contain 'Your account was successfully unlocked.'
71
+
72
+ assert_not user.reload.access_locked?
73
+ end
74
+
75
+ test "sign in user automatically after unlocking it's account" do
76
+ user = create_user(:locked => true)
77
+ visit_user_unlock_with_token(user.unlock_token)
78
+ assert warden.authenticated?(:user)
79
+ end
80
+
81
+ test "user should not be able to sign in when locked" do
82
+ user = sign_in_as_user(:locked => true)
83
+ assert_template 'sessions/new'
84
+ assert_contain 'Your account is locked.'
85
+ assert_not warden.authenticated?(:user)
86
+ end
87
+
88
+ test "user should not send a new e-mail if already locked" do
89
+ user = create_user(:locked => true)
90
+ user.failed_attempts = User.maximum_attempts + 1
91
+ user.save!
92
+
93
+ ActionMailer::Base.deliveries.clear
94
+
95
+ sign_in_as_user(:password => "invalid")
96
+ assert_contain 'Your account is locked.'
97
+ assert ActionMailer::Base.deliveries.empty?
98
+ end
99
+
100
+ test 'error message is configurable by resource name' do
101
+ store_translations :en, :devise => {
102
+ :failure => { :user => { :locked => "You are locked!" } }
103
+ } do
104
+ user = sign_in_as_user(:locked => true)
105
+ assert_contain 'You are locked!'
106
+ end
107
+ end
108
+
109
+ end
@@ -0,0 +1,107 @@
1
+ require 'test_helper'
2
+
3
+ class OmniauthableIntegrationTest < ActionController::IntegrationTest
4
+ FACEBOOK_INFO = {
5
+ :id => '12345',
6
+ :link => 'http://facebook.com/josevalim',
7
+ :email => 'user@example.com',
8
+ :first_name => 'Jose',
9
+ :last_name => 'Valim',
10
+ :website => 'http://blog.plataformatec.com.br'
11
+ }
12
+
13
+ ACCESS_TOKEN = {
14
+ :access_token => "plataformatec"
15
+ }
16
+
17
+ setup do
18
+ stub_facebook!
19
+ Devise::OmniAuth.short_circuit_authorizers!
20
+ end
21
+
22
+ teardown do
23
+ Devise::OmniAuth.unshort_circuit_authorizers!
24
+ Devise::OmniAuth.reset_stubs!
25
+ end
26
+
27
+ def stub_facebook!
28
+ Devise::OmniAuth.stub!(:facebook) do |b|
29
+ b.post('/oauth/access_token') { [200, {}, ACCESS_TOKEN.to_json] }
30
+ b.get('/me?access_token=plataformatec') { [200, {}, FACEBOOK_INFO.to_json] }
31
+ end
32
+ end
33
+
34
+ test "can access omniauth.auth in the env hash" do
35
+ visit "/users/sign_in"
36
+ click_link "Sign in with Facebook"
37
+
38
+ json = ActiveSupport::JSON.decode(response.body)
39
+
40
+ assert_equal "12345", json["uid"]
41
+ assert_equal "facebook", json["provider"]
42
+ assert_equal "josevalim", json["user_info"]["nickname"]
43
+ assert_equal FACEBOOK_INFO, json["extra"]["user_hash"].symbolize_keys
44
+ assert_equal "plataformatec", json["credentials"]["token"]
45
+ end
46
+
47
+ test "cleans up session on sign up" do
48
+ assert_no_difference "User.count" do
49
+ visit "/users/sign_in"
50
+ click_link "Sign in with Facebook"
51
+ end
52
+
53
+ assert session["devise.facebook_data"]
54
+
55
+ assert_difference "User.count" do
56
+ visit "/users/sign_up"
57
+ fill_in "Password", :with => "123456"
58
+ fill_in "Password confirmation", :with => "123456"
59
+ click_button "Sign up"
60
+ end
61
+
62
+ assert_current_url "/"
63
+ assert_contain "You have signed up successfully."
64
+ assert_contain "Hello User user@example.com"
65
+ assert_not session["devise.facebook_data"]
66
+ end
67
+
68
+ test "cleans up session on cancel" do
69
+ assert_no_difference "User.count" do
70
+ visit "/users/sign_in"
71
+ click_link "Sign in with Facebook"
72
+ end
73
+
74
+ assert session["devise.facebook_data"]
75
+ visit "/users/cancel"
76
+ assert !session["devise.facebook_data"]
77
+ end
78
+
79
+ test "cleans up session on sign in" do
80
+ assert_no_difference "User.count" do
81
+ visit "/users/sign_in"
82
+ click_link "Sign in with Facebook"
83
+ end
84
+
85
+ assert session["devise.facebook_data"]
86
+ user = sign_in_as_user
87
+ assert !session["devise.facebook_data"]
88
+ end
89
+
90
+ test "handles callback error parameter according to the specification" do
91
+ visit "/users/auth/facebook/callback?error=access_denied"
92
+ assert_current_url "/users/sign_in"
93
+ assert_contain 'Could not authorize you from Facebook because "Access denied".'
94
+ end
95
+
96
+ test "handles other exceptions from omniauth" do
97
+ Devise::OmniAuth.stub!(:facebook) do |b|
98
+ b.post('/oauth/access_token') { [401, {}, {}.to_json] }
99
+ end
100
+
101
+ visit "/users/sign_in"
102
+ click_link "Sign in with facebook"
103
+
104
+ assert_current_url "/users/sign_in"
105
+ assert_contain 'Could not authorize you from Facebook because "Invalid credentials".'
106
+ end
107
+ end
@@ -0,0 +1,160 @@
1
+ require 'test_helper'
2
+
3
+ class PasswordTest < ActionController::IntegrationTest
4
+
5
+ def visit_new_password_path
6
+ visit new_user_session_path
7
+ click_link 'Forgot your password?'
8
+ end
9
+
10
+ def request_forgot_password(&block)
11
+ visit_new_password_path
12
+ assert_response :success
13
+ assert_not warden.authenticated?(:user)
14
+
15
+ fill_in 'email', :with => 'user@test.com'
16
+ yield if block_given?
17
+ click_button 'Send me reset password instructions'
18
+ end
19
+
20
+ def reset_password(options={}, &block)
21
+ visit edit_user_password_path(:reset_password_token => options[:reset_password_token]) unless options[:visit] == false
22
+ assert_response :success
23
+
24
+ fill_in 'New password', :with => '987654321'
25
+ fill_in 'Confirm new password', :with => '987654321'
26
+ yield if block_given?
27
+ click_button 'Change my password'
28
+ end
29
+
30
+ test 'reset password with email of different case should succeed when email is in the list of case insensitive keys' do
31
+ create_user(:email => 'Foo@Bar.com')
32
+
33
+ request_forgot_password do
34
+ fill_in 'email', :with => 'foo@bar.com'
35
+ end
36
+
37
+ assert_current_url '/users/sign_in'
38
+ assert_contain 'You will receive an email with instructions about how to reset your password in a few minutes.'
39
+ end
40
+
41
+ test 'reset password with email of different case should fail when email is NOT the list of case insensitive keys' do
42
+ swap Devise, :case_insensitive_keys => [] do
43
+ create_user(:email => 'Foo@Bar.com')
44
+
45
+ request_forgot_password do
46
+ fill_in 'email', :with => 'foo@bar.com'
47
+ end
48
+
49
+ assert_response :success
50
+ assert_current_url '/users/password'
51
+ assert_have_selector "input[type=email][value='foo@bar.com']"
52
+ assert_contain 'not found'
53
+ end
54
+ end
55
+
56
+ test 'authenticated user should not be able to visit forgot password page' do
57
+ sign_in_as_user
58
+ assert warden.authenticated?(:user)
59
+
60
+ get new_user_password_path
61
+
62
+ assert_response :redirect
63
+ assert_redirected_to root_path
64
+ end
65
+
66
+ test 'not authenticated user should be able to request a forgot password' do
67
+ create_user
68
+ request_forgot_password
69
+
70
+ assert_current_url '/users/sign_in'
71
+ assert_contain 'You will receive an email with instructions about how to reset your password in a few minutes.'
72
+ end
73
+
74
+ test 'not authenticated user with invalid email should receive an error message' do
75
+ request_forgot_password do
76
+ fill_in 'email', :with => 'invalid.test@test.com'
77
+ end
78
+
79
+ assert_response :success
80
+ assert_current_url '/users/password'
81
+ assert_have_selector "input[type=email][value='invalid.test@test.com']"
82
+ assert_contain 'not found'
83
+ end
84
+
85
+ test 'authenticated user should not be able to visit edit password page' do
86
+ sign_in_as_user
87
+ get edit_user_password_path
88
+ assert_response :redirect
89
+ assert_redirected_to root_path
90
+ assert warden.authenticated?(:user)
91
+ end
92
+
93
+ test 'not authenticated user with invalid reset password token should not be able to change his password' do
94
+ user = create_user
95
+ reset_password :reset_password_token => 'invalid_reset_password'
96
+
97
+ assert_response :success
98
+ assert_current_url '/users/password'
99
+ assert_have_selector '#error_explanation'
100
+ assert_contain /Reset password token(.*)invalid/
101
+ assert_not user.reload.valid_password?('987654321')
102
+ end
103
+
104
+ test 'not authenticated user with valid reset password token but invalid password should not be able to change his password' do
105
+ user = create_user
106
+ request_forgot_password
107
+ reset_password :reset_password_token => user.reload.reset_password_token do
108
+ fill_in 'Confirm new password', :with => 'other_password'
109
+ end
110
+
111
+ assert_response :success
112
+ assert_current_url '/users/password'
113
+ assert_have_selector '#error_explanation'
114
+ assert_contain 'Password doesn\'t match confirmation'
115
+ assert_not user.reload.valid_password?('987654321')
116
+ end
117
+
118
+ test 'not authenticated user with valid data should be able to change his password' do
119
+ user = create_user
120
+ request_forgot_password
121
+ reset_password :reset_password_token => user.reload.reset_password_token
122
+
123
+ assert_current_url '/'
124
+ assert_contain 'Your password was changed successfully.'
125
+ assert user.reload.valid_password?('987654321')
126
+ end
127
+
128
+ test 'after entering invalid data user should still be able to change his password' do
129
+ user = create_user
130
+ request_forgot_password
131
+ reset_password :reset_password_token => user.reload.reset_password_token do
132
+ fill_in 'Confirm new password', :with => 'other_password'
133
+ end
134
+ assert_response :success
135
+ assert_have_selector '#error_explanation'
136
+ assert_not user.reload.valid_password?('987654321')
137
+
138
+ reset_password :reset_password_token => user.reload.reset_password_token, :visit => false
139
+ assert_contain 'Your password was changed successfully.'
140
+ assert user.reload.valid_password?('987654321')
141
+ end
142
+
143
+ test 'sign in user automatically after changing it\'s password' do
144
+ user = create_user
145
+ request_forgot_password
146
+ reset_password :reset_password_token => user.reload.reset_password_token
147
+
148
+ assert warden.authenticated?(:user)
149
+ end
150
+
151
+ test 'does not sign in user automatically after changing it\'s password if it\'s not active' do
152
+ user = create_user(:confirm => false)
153
+ request_forgot_password
154
+ reset_password :reset_password_token => user.reload.reset_password_token
155
+
156
+ assert_equal new_user_session_path, @request.path
157
+ assert !warden.authenticated?(:user)
158
+ end
159
+
160
+ end
@@ -0,0 +1,179 @@
1
+ require 'test_helper'
2
+
3
+ class RegistrationTest < ActionController::IntegrationTest
4
+
5
+ test 'a guest admin should be able to sign in successfully' do
6
+ get new_admin_session_path
7
+ click_link 'Sign up'
8
+
9
+ assert_template 'registrations/new'
10
+
11
+ fill_in 'email', :with => 'new_user@test.com'
12
+ fill_in 'password', :with => 'new_user123'
13
+ fill_in 'password confirmation', :with => 'new_user123'
14
+ click_button 'Sign up'
15
+
16
+ assert_contain 'Welcome! You have signed up successfully.'
17
+ assert warden.authenticated?(:admin)
18
+
19
+ admin = Admin.last :order => "id"
20
+ assert_equal admin.email, 'new_user@test.com'
21
+ end
22
+
23
+ test 'a guest user should be able to sign up successfully and be blocked by confirmation' do
24
+ get new_user_registration_path
25
+
26
+ fill_in 'email', :with => 'new_user@test.com'
27
+ fill_in 'password', :with => 'new_user123'
28
+ fill_in 'password confirmation', :with => 'new_user123'
29
+ click_button 'Sign up'
30
+
31
+ assert_contain 'You have signed up successfully. However, we could not sign you in because your account is unconfirmed.'
32
+ assert_not_contain 'You have to confirm your account before continuing'
33
+
34
+ assert_not warden.authenticated?(:user)
35
+
36
+ user = User.last :order => "id"
37
+ assert_equal user.email, 'new_user@test.com'
38
+ assert_not user.confirmed?
39
+ end
40
+
41
+ test 'a guest user cannot sign up with invalid information' do
42
+ get new_user_registration_path
43
+
44
+ fill_in 'email', :with => 'invalid_email'
45
+ fill_in 'password', :with => 'new_user123'
46
+ fill_in 'password confirmation', :with => 'new_user321'
47
+ click_button 'Sign up'
48
+
49
+ assert_template 'registrations/new'
50
+ assert_have_selector '#error_explanation'
51
+ assert_contain "Email is invalid"
52
+ assert_contain "Password doesn't match confirmation"
53
+ assert_contain "2 errors prohibited"
54
+ assert_nil User.first
55
+
56
+ assert_not warden.authenticated?(:user)
57
+ end
58
+
59
+ test 'a guest should not sign up with email/password that already exists' do
60
+ user = create_user
61
+ get new_user_registration_path
62
+
63
+ fill_in 'email', :with => 'user@test.com'
64
+ fill_in 'password', :with => '123456'
65
+ fill_in 'password confirmation', :with => '123456'
66
+ click_button 'Sign up'
67
+
68
+ assert_current_url '/users'
69
+ assert_contain(/Email.*already.*taken/)
70
+
71
+ assert_not warden.authenticated?(:user)
72
+ end
73
+
74
+ test 'a guest should not be able to change account' do
75
+ get edit_user_registration_path
76
+ assert_redirected_to new_user_session_path
77
+ follow_redirect!
78
+ assert_contain 'You need to sign in or sign up before continuing.'
79
+ end
80
+
81
+ test 'a signed in user should not be able to access sign up' do
82
+ sign_in_as_user
83
+ get new_user_registration_path
84
+ assert_redirected_to root_path
85
+ end
86
+
87
+ test 'a signed in user should be able to edit his account' do
88
+ sign_in_as_user
89
+ get edit_user_registration_path
90
+
91
+ fill_in 'email', :with => 'user.new@email.com'
92
+ fill_in 'current password', :with => '123456'
93
+ click_button 'Update'
94
+
95
+ assert_current_url '/'
96
+ assert_contain 'You updated your account successfully.'
97
+
98
+ assert_equal "user.new@email.com", User.first.email
99
+ end
100
+
101
+ test 'a signed in user should still be able to use the website after changing his password' do
102
+ sign_in_as_user
103
+ get edit_user_registration_path
104
+
105
+ fill_in 'password', :with => '12345678'
106
+ fill_in 'password confirmation', :with => '12345678'
107
+ fill_in 'current password', :with => '123456'
108
+ click_button 'Update'
109
+
110
+ assert_contain 'You updated your account successfully.'
111
+ get users_path
112
+ assert warden.authenticated?(:user)
113
+ end
114
+
115
+ test 'a signed in user should not change his current user with invalid password' do
116
+ sign_in_as_user
117
+ get edit_user_registration_path
118
+
119
+ fill_in 'email', :with => 'user.new@email.com'
120
+ fill_in 'current password', :with => 'invalid'
121
+ click_button 'Update'
122
+
123
+ assert_template 'registrations/edit'
124
+ assert_contain 'user@test.com'
125
+ assert_have_selector 'form input[value="user.new@email.com"]'
126
+
127
+ assert_equal "user@test.com", User.first.email
128
+ end
129
+
130
+ test 'a signed in user should be able to edit his password' do
131
+ sign_in_as_user
132
+ get edit_user_registration_path
133
+
134
+ fill_in 'password', :with => 'pas123'
135
+ fill_in 'password confirmation', :with => 'pas123'
136
+ fill_in 'current password', :with => '123456'
137
+ click_button 'Update'
138
+
139
+ assert_current_url '/'
140
+ assert_contain 'You updated your account successfully.'
141
+
142
+ assert User.first.valid_password?('pas123')
143
+ end
144
+
145
+ test 'a signed in user should not be able to edit his password with invalid confirmation' do
146
+ sign_in_as_user
147
+ get edit_user_registration_path
148
+
149
+ fill_in 'password', :with => 'pas123'
150
+ fill_in 'password confirmation', :with => ''
151
+ fill_in 'current password', :with => '123456'
152
+ click_button 'Update'
153
+
154
+ assert_contain "Password doesn't match confirmation"
155
+ assert_not User.first.valid_password?('pas123')
156
+ end
157
+
158
+ test 'a signed in user should be able to cancel his account' do
159
+ sign_in_as_user
160
+ get edit_user_registration_path
161
+
162
+ click_link "Cancel my account", :method => :delete
163
+ assert_contain "Bye! Your account was successfully cancelled. We hope to see you again soon."
164
+
165
+ assert User.all.empty?
166
+ end
167
+
168
+ test 'a user should be able to cancel sign up by deleting data in the session' do
169
+ get "/set"
170
+ assert_equal "something", @request.session["devise.foo_bar"]
171
+
172
+ get "/users/sign_up"
173
+ assert_equal "something", @request.session["devise.foo_bar"]
174
+
175
+ get "/users/cancel"
176
+ assert_nil @request.session["devise.foo_bar"]
177
+ assert_redirected_to new_user_registration_path
178
+ end
179
+ end