devise 4.5.0 → 4.6.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of devise might be problematic. Click here for more details.

Files changed (195) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +30 -1
  3. data/MIT-LICENSE +1 -1
  4. data/README.md +18 -0
  5. data/app/controllers/devise/passwords_controller.rb +1 -0
  6. data/app/controllers/devise/registrations_controller.rb +25 -7
  7. data/app/helpers/devise_helper.rb +10 -19
  8. data/app/views/devise/confirmations/new.html.erb +1 -1
  9. data/app/views/devise/passwords/edit.html.erb +1 -1
  10. data/app/views/devise/passwords/new.html.erb +1 -1
  11. data/app/views/devise/registrations/edit.html.erb +1 -1
  12. data/app/views/devise/registrations/new.html.erb +1 -1
  13. data/app/views/devise/sessions/new.html.erb +2 -2
  14. data/app/views/devise/shared/_error_messages.html.erb +15 -0
  15. data/app/views/devise/shared/_links.html.erb +7 -7
  16. data/app/views/devise/unlocks/new.html.erb +1 -1
  17. data/config/locales/en.yml +1 -0
  18. data/lib/devise.rb +4 -0
  19. data/lib/devise/controllers/helpers.rb +1 -1
  20. data/lib/devise/failure_app.rb +28 -3
  21. data/lib/devise/models/authenticatable.rb +7 -15
  22. data/lib/devise/models/confirmable.rb +4 -1
  23. data/lib/devise/models/database_authenticatable.rb +41 -6
  24. data/lib/devise/models/lockable.rb +2 -2
  25. data/lib/devise/models/registerable.rb +2 -0
  26. data/lib/devise/strategies/database_authenticatable.rb +3 -0
  27. data/lib/devise/test/controller_helpers.rb +1 -1
  28. data/lib/devise/version.rb +1 -1
  29. data/lib/generators/active_record/devise_generator.rb +4 -4
  30. data/lib/generators/devise/controllers_generator.rb +1 -1
  31. data/lib/generators/templates/devise.rb +12 -3
  32. data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +1 -1
  33. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +1 -1
  34. metadata +5 -305
  35. data/.gitignore +0 -10
  36. data/.travis.yml +0 -69
  37. data/.yardopts +0 -9
  38. data/CODE_OF_CONDUCT.md +0 -22
  39. data/CONTRIBUTING.md +0 -79
  40. data/Gemfile +0 -39
  41. data/Gemfile.lock +0 -202
  42. data/ISSUE_TEMPLATE.md +0 -19
  43. data/Rakefile +0 -37
  44. data/bin/test +0 -13
  45. data/devise.gemspec +0 -28
  46. data/devise.png +0 -0
  47. data/gemfiles/Gemfile.rails-4.1-stable +0 -32
  48. data/gemfiles/Gemfile.rails-4.1-stable.lock +0 -171
  49. data/gemfiles/Gemfile.rails-4.2-stable +0 -32
  50. data/gemfiles/Gemfile.rails-4.2-stable.lock +0 -192
  51. data/gemfiles/Gemfile.rails-5.0-stable +0 -33
  52. data/gemfiles/Gemfile.rails-5.0-stable.lock +0 -192
  53. data/gemfiles/Gemfile.rails-5.2-rc1 +0 -26
  54. data/gemfiles/Gemfile.rails-5.2-rc1.lock +0 -201
  55. data/guides/bug_report_templates/integration_test.rb +0 -106
  56. data/test/controllers/custom_registrations_controller_test.rb +0 -42
  57. data/test/controllers/custom_strategy_test.rb +0 -66
  58. data/test/controllers/helper_methods_test.rb +0 -24
  59. data/test/controllers/helpers_test.rb +0 -318
  60. data/test/controllers/inherited_controller_i18n_messages_test.rb +0 -53
  61. data/test/controllers/internal_helpers_test.rb +0 -129
  62. data/test/controllers/load_hooks_controller_test.rb +0 -21
  63. data/test/controllers/passwords_controller_test.rb +0 -34
  64. data/test/controllers/sessions_controller_test.rb +0 -108
  65. data/test/controllers/url_helpers_test.rb +0 -67
  66. data/test/delegator_test.rb +0 -21
  67. data/test/devise_test.rb +0 -109
  68. data/test/failure_app_test.rb +0 -346
  69. data/test/generators/active_record_generator_test.rb +0 -130
  70. data/test/generators/controllers_generator_test.rb +0 -50
  71. data/test/generators/devise_generator_test.rb +0 -41
  72. data/test/generators/install_generator_test.rb +0 -26
  73. data/test/generators/mongoid_generator_test.rb +0 -25
  74. data/test/generators/views_generator_test.rb +0 -105
  75. data/test/helpers/devise_helper_test.rb +0 -51
  76. data/test/integration/authenticatable_test.rb +0 -706
  77. data/test/integration/confirmable_test.rb +0 -326
  78. data/test/integration/database_authenticatable_test.rb +0 -110
  79. data/test/integration/http_authenticatable_test.rb +0 -114
  80. data/test/integration/lockable_test.rb +0 -242
  81. data/test/integration/mounted_engine_test.rb +0 -38
  82. data/test/integration/omniauthable_test.rb +0 -148
  83. data/test/integration/recoverable_test.rb +0 -349
  84. data/test/integration/registerable_test.rb +0 -365
  85. data/test/integration/rememberable_test.rb +0 -219
  86. data/test/integration/timeoutable_test.rb +0 -186
  87. data/test/integration/trackable_test.rb +0 -99
  88. data/test/mailers/confirmation_instructions_test.rb +0 -117
  89. data/test/mailers/email_changed_test.rb +0 -132
  90. data/test/mailers/mailer_test.rb +0 -20
  91. data/test/mailers/reset_password_instructions_test.rb +0 -98
  92. data/test/mailers/unlock_instructions_test.rb +0 -93
  93. data/test/mapping_test.rb +0 -136
  94. data/test/models/authenticatable_test.rb +0 -25
  95. data/test/models/confirmable_test.rb +0 -549
  96. data/test/models/database_authenticatable_test.rb +0 -290
  97. data/test/models/lockable_test.rb +0 -352
  98. data/test/models/omniauthable_test.rb +0 -9
  99. data/test/models/recoverable_test.rb +0 -263
  100. data/test/models/registerable_test.rb +0 -9
  101. data/test/models/rememberable_test.rb +0 -184
  102. data/test/models/serializable_test.rb +0 -60
  103. data/test/models/timeoutable_test.rb +0 -53
  104. data/test/models/trackable_test.rb +0 -80
  105. data/test/models/validatable_test.rb +0 -121
  106. data/test/models_test.rb +0 -155
  107. data/test/omniauth/config_test.rb +0 -61
  108. data/test/omniauth/url_helpers_test.rb +0 -53
  109. data/test/orm/active_record.rb +0 -24
  110. data/test/orm/mongoid.rb +0 -15
  111. data/test/parameter_sanitizer_test.rb +0 -105
  112. data/test/rails_app/Rakefile +0 -6
  113. data/test/rails_app/app/active_record/admin.rb +0 -8
  114. data/test/rails_app/app/active_record/shim.rb +0 -4
  115. data/test/rails_app/app/active_record/user.rb +0 -20
  116. data/test/rails_app/app/active_record/user_on_engine.rb +0 -9
  117. data/test/rails_app/app/active_record/user_on_main_app.rb +0 -9
  118. data/test/rails_app/app/active_record/user_with_validations.rb +0 -12
  119. data/test/rails_app/app/active_record/user_without_email.rb +0 -10
  120. data/test/rails_app/app/controllers/admins/sessions_controller.rb +0 -8
  121. data/test/rails_app/app/controllers/admins_controller.rb +0 -8
  122. data/test/rails_app/app/controllers/application_controller.rb +0 -13
  123. data/test/rails_app/app/controllers/application_with_fake_engine.rb +0 -32
  124. data/test/rails_app/app/controllers/custom/registrations_controller.rb +0 -33
  125. data/test/rails_app/app/controllers/home_controller.rb +0 -31
  126. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +0 -4
  127. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +0 -4
  128. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +0 -16
  129. data/test/rails_app/app/controllers/users_controller.rb +0 -33
  130. data/test/rails_app/app/helpers/application_helper.rb +0 -5
  131. data/test/rails_app/app/mailers/users/from_proc_mailer.rb +0 -5
  132. data/test/rails_app/app/mailers/users/mailer.rb +0 -5
  133. data/test/rails_app/app/mailers/users/reply_to_mailer.rb +0 -6
  134. data/test/rails_app/app/mongoid/admin.rb +0 -31
  135. data/test/rails_app/app/mongoid/shim.rb +0 -25
  136. data/test/rails_app/app/mongoid/user.rb +0 -50
  137. data/test/rails_app/app/mongoid/user_on_engine.rb +0 -41
  138. data/test/rails_app/app/mongoid/user_on_main_app.rb +0 -41
  139. data/test/rails_app/app/mongoid/user_with_validations.rb +0 -37
  140. data/test/rails_app/app/mongoid/user_without_email.rb +0 -35
  141. data/test/rails_app/app/views/admins/index.html.erb +0 -1
  142. data/test/rails_app/app/views/admins/sessions/new.html.erb +0 -2
  143. data/test/rails_app/app/views/home/admin_dashboard.html.erb +0 -1
  144. data/test/rails_app/app/views/home/index.html.erb +0 -1
  145. data/test/rails_app/app/views/home/join.html.erb +0 -1
  146. data/test/rails_app/app/views/home/private.html.erb +0 -1
  147. data/test/rails_app/app/views/home/user_dashboard.html.erb +0 -1
  148. data/test/rails_app/app/views/layouts/application.html.erb +0 -24
  149. data/test/rails_app/app/views/users/edit_form.html.erb +0 -1
  150. data/test/rails_app/app/views/users/index.html.erb +0 -1
  151. data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +0 -1
  152. data/test/rails_app/app/views/users/sessions/new.html.erb +0 -1
  153. data/test/rails_app/bin/bundle +0 -3
  154. data/test/rails_app/bin/rails +0 -4
  155. data/test/rails_app/bin/rake +0 -4
  156. data/test/rails_app/config.ru +0 -4
  157. data/test/rails_app/config/application.rb +0 -48
  158. data/test/rails_app/config/boot.rb +0 -27
  159. data/test/rails_app/config/database.yml +0 -18
  160. data/test/rails_app/config/environment.rb +0 -7
  161. data/test/rails_app/config/environments/development.rb +0 -32
  162. data/test/rails_app/config/environments/production.rb +0 -88
  163. data/test/rails_app/config/environments/test.rb +0 -47
  164. data/test/rails_app/config/initializers/backtrace_silencers.rb +0 -9
  165. data/test/rails_app/config/initializers/devise.rb +0 -187
  166. data/test/rails_app/config/initializers/inflections.rb +0 -4
  167. data/test/rails_app/config/initializers/secret_token.rb +0 -5
  168. data/test/rails_app/config/initializers/session_store.rb +0 -3
  169. data/test/rails_app/config/routes.rb +0 -128
  170. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +0 -77
  171. data/test/rails_app/db/schema.rb +0 -57
  172. data/test/rails_app/lib/lazy_load_test_module.rb +0 -5
  173. data/test/rails_app/lib/shared_admin.rb +0 -23
  174. data/test/rails_app/lib/shared_user.rb +0 -32
  175. data/test/rails_app/lib/shared_user_without_email.rb +0 -28
  176. data/test/rails_app/lib/shared_user_without_omniauth.rb +0 -15
  177. data/test/rails_app/public/404.html +0 -26
  178. data/test/rails_app/public/422.html +0 -26
  179. data/test/rails_app/public/500.html +0 -26
  180. data/test/rails_app/public/favicon.ico +0 -0
  181. data/test/rails_test.rb +0 -11
  182. data/test/routes_test.rb +0 -281
  183. data/test/secret_key_finder_test.rb +0 -121
  184. data/test/support/action_controller/record_identifier.rb +0 -12
  185. data/test/support/assertions.rb +0 -30
  186. data/test/support/helpers.rb +0 -83
  187. data/test/support/http_method_compatibility.rb +0 -53
  188. data/test/support/integration.rb +0 -95
  189. data/test/support/locale/en.yml +0 -8
  190. data/test/support/mongoid.yml +0 -6
  191. data/test/support/webrat/integrations/rails.rb +0 -35
  192. data/test/test/controller_helpers_test.rb +0 -193
  193. data/test/test/integration_helpers_test.rb +0 -34
  194. data/test/test_helper.rb +0 -36
  195. data/test/test_models.rb +0 -35
@@ -1,242 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- class LockTest < Devise::IntegrationTest
6
-
7
- def visit_user_unlock_with_token(unlock_token)
8
- visit user_unlock_path(unlock_token: unlock_token)
9
- end
10
-
11
- def send_unlock_request
12
- user = create_user(locked: true)
13
- ActionMailer::Base.deliveries.clear
14
-
15
- visit new_user_session_path
16
- click_link "Didn't receive unlock instructions?"
17
-
18
- Devise.stubs(:friendly_token).returns("abcdef")
19
- fill_in 'email', with: user.email
20
- click_button 'Resend unlock instructions'
21
- end
22
-
23
- test 'user should be able to request a new unlock token' do
24
- send_unlock_request
25
-
26
- assert_template 'sessions/new'
27
- assert_contain 'You will receive an email with instructions for how to unlock your account in a few minutes'
28
-
29
- mail = ActionMailer::Base.deliveries.last
30
- assert_equal 1, ActionMailer::Base.deliveries.size
31
- assert_equal ['please-change-me@config-initializers-devise.com'], mail.from
32
- assert_match user_unlock_path(unlock_token: 'abcdef'), mail.body.encoded
33
- end
34
-
35
- test 'user should receive the instructions from a custom mailer' do
36
- User.any_instance.stubs(:devise_mailer).returns(Users::Mailer)
37
-
38
- send_unlock_request
39
-
40
- assert_equal ['custom@example.com'], ActionMailer::Base.deliveries.first.from
41
- end
42
-
43
- test 'unlocked user should not be able to request a unlock token' do
44
- user = create_user(locked: false)
45
- ActionMailer::Base.deliveries.clear
46
-
47
- visit new_user_session_path
48
- click_link "Didn't receive unlock instructions?"
49
-
50
- fill_in 'email', with: user.email
51
- click_button 'Resend unlock instructions'
52
-
53
- assert_template 'unlocks/new'
54
- assert_contain 'not locked'
55
- assert_equal 0, ActionMailer::Base.deliveries.size
56
- end
57
-
58
- test 'unlocked pages should not be available if email strategy is disabled' do
59
- visit "/admin_area/sign_in"
60
-
61
- assert_raise Webrat::NotFoundError do
62
- click_link "Didn't receive unlock instructions?"
63
- end
64
-
65
- assert_raise NameError do
66
- visit new_admin_unlock_path
67
- end
68
-
69
- assert_raise ActionController::RoutingError do
70
- visit "/admin_area/unlock/new"
71
- end
72
- end
73
-
74
- test 'user with invalid unlock token should not be able to unlock an account' do
75
- visit_user_unlock_with_token('invalid_token')
76
-
77
- assert_response :success
78
- assert_current_url '/users/unlock?unlock_token=invalid_token'
79
- assert_have_selector '#error_explanation'
80
- assert_contain %r{Unlock token(.*)invalid}
81
- end
82
-
83
- test "locked user should be able to unlock account" do
84
- user = create_user
85
- raw = user.lock_access!
86
- visit_user_unlock_with_token(raw)
87
-
88
- assert_current_url "/users/sign_in"
89
- assert_contain 'Your account has been unlocked successfully. Please sign in to continue.'
90
- refute user.reload.access_locked?
91
- end
92
-
93
- test "user should not send a new e-mail if already locked" do
94
- user = create_user(locked: true)
95
- user.failed_attempts = User.maximum_attempts + 1
96
- user.save!
97
-
98
- ActionMailer::Base.deliveries.clear
99
-
100
- sign_in_as_user(password: "invalid")
101
- assert_contain 'Your account is locked.'
102
- assert ActionMailer::Base.deliveries.empty?
103
- end
104
-
105
- test 'error message is configurable by resource name' do
106
- store_translations :en, devise: {
107
- failure: {user: {locked: "You are locked!"}}
108
- } do
109
-
110
- user = create_user(locked: true)
111
- user.failed_attempts = User.maximum_attempts + 1
112
- user.save!
113
-
114
- sign_in_as_user(password: "invalid")
115
- assert_contain "You are locked!"
116
- end
117
- end
118
-
119
- test "user should not be able to sign in when locked" do
120
- store_translations :en, devise: {
121
- failure: {user: {locked: "You are locked!"}}
122
- } do
123
-
124
- user = create_user(locked: true)
125
- user.failed_attempts = User.maximum_attempts + 1
126
- user.save!
127
-
128
- sign_in_as_user(password: "123456")
129
- assert_contain "You are locked!"
130
- end
131
- end
132
-
133
- test 'user should be able to request a new unlock token via XML request' do
134
- user = create_user(locked: true)
135
- ActionMailer::Base.deliveries.clear
136
-
137
- post user_unlock_path(format: 'xml'), params: { user: {email: user.email} }
138
- assert_response :success
139
- assert_equal response.body, {}.to_xml
140
-
141
- assert_equal 1, ActionMailer::Base.deliveries.size
142
- end
143
-
144
- test 'unlocked user should not be able to request a unlock token via XML request' do
145
- user = create_user(locked: false)
146
- ActionMailer::Base.deliveries.clear
147
-
148
- post user_unlock_path(format: 'xml'), params: { user: {email: user.email} }
149
- assert_response :unprocessable_entity
150
- assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<errors>)
151
- assert_equal 0, ActionMailer::Base.deliveries.size
152
- end
153
-
154
- test 'user with valid unlock token should be able to unlock account via XML request' do
155
- user = create_user()
156
- raw = user.lock_access!
157
- assert user.access_locked?
158
- get user_unlock_path(format: 'xml', unlock_token: raw)
159
- assert_response :success
160
- assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>)
161
- end
162
-
163
-
164
- test 'user with invalid unlock token should not be able to unlock the account via XML request' do
165
- get user_unlock_path(format: 'xml', unlock_token: 'invalid_token')
166
- assert_response :unprocessable_entity
167
- assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<errors>)
168
- end
169
-
170
- test "when using json to ask a unlock request, should not return the user" do
171
- user = create_user(locked: true)
172
- post user_unlock_path(format: "json", user: {email: user.email})
173
- assert_response :success
174
- assert_equal response.body, {}.to_json
175
- end
176
-
177
- test "in paranoid mode, when trying to unlock a user that exists it should not say that it exists if it is locked" do
178
- swap Devise, paranoid: true do
179
- user = create_user(locked: true)
180
-
181
- visit new_user_session_path
182
- click_link "Didn't receive unlock instructions?"
183
-
184
- fill_in 'email', with: user.email
185
- click_button 'Resend unlock instructions'
186
-
187
- assert_current_url "/users/sign_in"
188
- assert_contain "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes."
189
- end
190
- end
191
-
192
- test "in paranoid mode, when trying to unlock a user that exists it should not say that it exists if it is not locked" do
193
- swap Devise, paranoid: true do
194
- user = create_user(locked: false)
195
-
196
- visit new_user_session_path
197
- click_link "Didn't receive unlock instructions?"
198
-
199
- fill_in 'email', with: user.email
200
- click_button 'Resend unlock instructions'
201
-
202
- assert_current_url "/users/sign_in"
203
- assert_contain "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes."
204
- end
205
- end
206
-
207
- test "in paranoid mode, when trying to unlock a user that does not exists it should not say that it does not exists" do
208
- swap Devise, paranoid: true do
209
- visit new_user_session_path
210
- click_link "Didn't receive unlock instructions?"
211
-
212
- fill_in 'email', with: "arandomemail@hotmail.com"
213
- click_button 'Resend unlock instructions'
214
-
215
- assert_not_contain "1 error prohibited this user from being saved:"
216
- assert_not_contain "Email not found"
217
- assert_current_url "/users/sign_in"
218
-
219
- assert_contain "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes."
220
-
221
- end
222
- end
223
-
224
- test "in paranoid mode, when locking a user that exists it should not say that the user was locked" do
225
- swap Devise, paranoid: true, maximum_attempts: 1 do
226
- user = create_user(locked: false)
227
-
228
- visit new_user_session_path
229
- fill_in 'email', with: user.email
230
- fill_in 'password', with: "abadpassword"
231
- click_button 'Log in'
232
-
233
- fill_in 'email', with: user.email
234
- fill_in 'password', with: "abadpassword"
235
- click_button 'Log in'
236
-
237
- assert_current_url "/users/sign_in"
238
- assert_not_contain "locked"
239
- end
240
- end
241
-
242
- end
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- class MyMountableEngine
6
- def self.call(env)
7
- ['200', { 'Content-Type' => 'text/html' }, ['Rendered content of MyMountableEngine']]
8
- end
9
- end
10
-
11
- # If disable_clear_and_finalize is set to true, Rails will not clear other routes when calling
12
- # again the draw method. Look at the source code at:
13
- # http://www.rubydoc.info/docs/rails/ActionDispatch/Routing/RouteSet:draw
14
- Rails.application.routes.disable_clear_and_finalize = true
15
-
16
- Rails.application.routes.draw do
17
- authenticate(:user) do
18
- mount MyMountableEngine, at: '/mountable_engine'
19
- end
20
- end
21
-
22
- class AuthenticatedMountedEngineTest < Devise::IntegrationTest
23
- test 'redirects to the sign in page when not authenticated' do
24
- get '/mountable_engine'
25
- follow_redirect!
26
-
27
- assert_response :ok
28
- assert_contain 'You need to sign in or sign up before continuing.'
29
- end
30
-
31
- test 'renders the mounted engine when authenticated' do
32
- sign_in_as_user
33
- get '/mountable_engine'
34
-
35
- assert_response :success
36
- assert_contain 'Rendered content of MyMountableEngine'
37
- end
38
- end
@@ -1,148 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
-
6
- class OmniauthableIntegrationTest < Devise::IntegrationTest
7
- FACEBOOK_INFO = {
8
- "id" => '12345',
9
- "link" => 'http://facebook.com/josevalim',
10
- "email" => 'user@example.com',
11
- "first_name" => 'Jose',
12
- "last_name" => 'Valim',
13
- "website" => 'http://blog.plataformatec.com.br'
14
- }
15
-
16
- setup do
17
- OmniAuth.config.test_mode = true
18
- OmniAuth.config.mock_auth[:facebook] = {
19
- "uid" => '12345',
20
- "provider" => 'facebook',
21
- "user_info" => {"nickname" => 'josevalim'},
22
- "credentials" => {"token" => 'plataformatec'},
23
- "extra" => {"user_hash" => FACEBOOK_INFO}
24
- }
25
- OmniAuth.config.add_camelization 'facebook', 'FaceBook'
26
- end
27
-
28
- teardown do
29
- OmniAuth.config.camelizations.delete('facebook')
30
- OmniAuth.config.test_mode = false
31
- end
32
-
33
- def stub_action!(name)
34
- Users::OmniauthCallbacksController.class_eval do
35
- alias_method :__old_facebook, :facebook
36
- alias_method :facebook, name
37
- end
38
- yield
39
- ensure
40
- Users::OmniauthCallbacksController.class_eval do
41
- alias_method :facebook, :__old_facebook
42
- end
43
- end
44
-
45
- test "omniauth sign in should not run model validations" do
46
- stub_action!(:sign_in_facebook) do
47
- create_user
48
- visit "/users/sign_in"
49
- click_link "Sign in with FaceBook"
50
- assert warden.authenticated?(:user)
51
-
52
- refute User.validations_performed
53
- end
54
- end
55
-
56
- test "can access omniauth.auth in the env hash" do
57
- visit "/users/sign_in"
58
- click_link "Sign in with FaceBook"
59
-
60
- json = ActiveSupport::JSON.decode(response.body)
61
-
62
- assert_equal "12345", json["uid"]
63
- assert_equal "facebook", json["provider"]
64
- assert_equal "josevalim", json["user_info"]["nickname"]
65
- assert_equal FACEBOOK_INFO, json["extra"]["user_hash"]
66
- assert_equal "plataformatec", json["credentials"]["token"]
67
- end
68
-
69
- test "cleans up session on sign up" do
70
- assert_no_difference "User.count" do
71
- visit "/users/sign_in"
72
- click_link "Sign in with FaceBook"
73
- end
74
-
75
- assert session["devise.facebook_data"]
76
-
77
- assert_difference "User.count" do
78
- visit "/users/sign_up"
79
- fill_in "Password", with: "12345678"
80
- fill_in "Password confirmation", with: "12345678"
81
- click_button "Sign up"
82
- end
83
-
84
- assert_current_url "/"
85
- assert_contain "You have signed up successfully."
86
- assert_contain "Hello User user@example.com"
87
- refute session["devise.facebook_data"]
88
- end
89
-
90
- test "cleans up session on cancel" do
91
- assert_no_difference "User.count" do
92
- visit "/users/sign_in"
93
- click_link "Sign in with FaceBook"
94
- end
95
-
96
- assert session["devise.facebook_data"]
97
- visit "/users/cancel"
98
- assert !session["devise.facebook_data"]
99
- end
100
-
101
- test "cleans up session on sign in" do
102
- assert_no_difference "User.count" do
103
- visit "/users/sign_in"
104
- click_link "Sign in with FaceBook"
105
- end
106
-
107
- assert session["devise.facebook_data"]
108
- sign_in_as_user
109
- assert !session["devise.facebook_data"]
110
- end
111
-
112
- test "sign in and send remember token if configured" do
113
- visit "/users/sign_in"
114
- click_link "Sign in with FaceBook"
115
- assert_nil warden.cookies["remember_user_token"]
116
-
117
- stub_action!(:sign_in_facebook) do
118
- create_user
119
- visit "/users/sign_in"
120
- click_link "Sign in with FaceBook"
121
- assert warden.authenticated?(:user)
122
- assert warden.cookies["remember_user_token"]
123
- end
124
- end
125
-
126
- test "generates a proper link when SCRIPT_NAME is set" do
127
- header 'SCRIPT_NAME', '/q'
128
- visit "/users/sign_in"
129
- assert_select "a", href: "/q/users/auth/facebook"
130
- end
131
-
132
- test "handles callback error parameter according to the specification" do
133
- OmniAuth.config.mock_auth[:facebook] = :access_denied
134
- visit "/users/auth/facebook/callback?error=access_denied"
135
- assert_current_url "/users/sign_in"
136
- assert_contain 'Could not authenticate you from FaceBook because "Access denied".'
137
- end
138
-
139
- test "handles other exceptions from OmniAuth" do
140
- OmniAuth.config.mock_auth[:facebook] = :invalid_credentials
141
-
142
- visit "/users/sign_in"
143
- click_link "Sign in with FaceBook"
144
-
145
- assert_current_url "/users/sign_in"
146
- assert_contain 'Could not authenticate you from FaceBook because "Invalid credentials".'
147
- end
148
- end
@@ -1,349 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- class PasswordTest < Devise::IntegrationTest
6
-
7
- def visit_new_password_path
8
- visit new_user_session_path
9
- click_link 'Forgot your password?'
10
- end
11
-
12
- def request_forgot_password(&block)
13
- visit_new_password_path
14
- assert_response :success
15
- refute warden.authenticated?(:user)
16
-
17
- fill_in 'email', with: 'user@test.com'
18
- yield if block_given?
19
-
20
- Devise.stubs(:friendly_token).returns("abcdef")
21
- click_button 'Send me reset password instructions'
22
- end
23
-
24
- def reset_password(options={}, &block)
25
- unless options[:visit] == false
26
- visit edit_user_password_path(reset_password_token: options[:reset_password_token] || "abcdef")
27
- assert_response :success
28
- end
29
-
30
- fill_in 'New password', with: '987654321'
31
- fill_in 'Confirm new password', with: '987654321'
32
- yield if block_given?
33
- click_button 'Change my password'
34
- end
35
-
36
- test 'reset password with email of different case should succeed when email is in the list of case insensitive keys' do
37
- create_user(email: 'Foo@Bar.com')
38
-
39
- request_forgot_password do
40
- fill_in 'email', with: 'foo@bar.com'
41
- end
42
-
43
- assert_current_url '/users/sign_in'
44
- assert_contain 'You will receive an email with instructions on how to reset your password in a few minutes.'
45
- end
46
-
47
- test 'reset password with email should send an email from a custom mailer' do
48
- create_user(email: 'Foo@Bar.com')
49
-
50
- User.any_instance.stubs(:devise_mailer).returns(Users::Mailer)
51
- request_forgot_password do
52
- fill_in 'email', with: 'foo@bar.com'
53
- end
54
-
55
- mail = ActionMailer::Base.deliveries.last
56
- assert_equal ['custom@example.com'], mail.from
57
- assert_match edit_user_password_path(reset_password_token: 'abcdef'), mail.body.encoded
58
- end
59
-
60
- test 'reset password with email of different case should fail when email is NOT the list of case insensitive keys' do
61
- swap Devise, case_insensitive_keys: [] do
62
- create_user(email: 'Foo@Bar.com')
63
-
64
- request_forgot_password do
65
- fill_in 'email', with: 'foo@bar.com'
66
- end
67
-
68
- assert_response :success
69
- assert_current_url '/users/password'
70
- assert_have_selector "input[type=email][value='foo@bar.com']"
71
- assert_contain 'not found'
72
- end
73
- end
74
-
75
- test 'reset password with email with extra whitespace should succeed when email is in the list of strip whitespace keys' do
76
- create_user(email: 'foo@bar.com')
77
-
78
- request_forgot_password do
79
- fill_in 'email', with: ' foo@bar.com '
80
- end
81
-
82
- assert_current_url '/users/sign_in'
83
- assert_contain 'You will receive an email with instructions on how to reset your password in a few minutes.'
84
- end
85
-
86
- test 'reset password with email with extra whitespace should fail when email is NOT the list of strip whitespace keys' do
87
- swap Devise, strip_whitespace_keys: [] do
88
- create_user(email: 'foo@bar.com')
89
-
90
- request_forgot_password do
91
- fill_in 'email', with: ' foo@bar.com '
92
- end
93
-
94
- assert_response :success
95
- assert_current_url '/users/password'
96
- assert_have_selector "input[type=email][value=' foo@bar.com ']"
97
- assert_contain 'not found'
98
- end
99
- end
100
-
101
- test 'authenticated user should not be able to visit forgot password page' do
102
- sign_in_as_user
103
- assert warden.authenticated?(:user)
104
-
105
- get new_user_password_path
106
-
107
- assert_response :redirect
108
- assert_redirected_to root_path
109
- end
110
-
111
- test 'not authenticated user should be able to request a forgot password' do
112
- create_user
113
- request_forgot_password
114
-
115
- assert_current_url '/users/sign_in'
116
- assert_contain 'You will receive an email with instructions on how to reset your password in a few minutes.'
117
- end
118
-
119
- test 'not authenticated user with invalid email should receive an error message' do
120
- request_forgot_password do
121
- fill_in 'email', with: 'invalid.test@test.com'
122
- end
123
-
124
- assert_response :success
125
- assert_current_url '/users/password'
126
- assert_have_selector "input[type=email][value='invalid.test@test.com']"
127
- assert_contain 'not found'
128
- end
129
-
130
- test 'authenticated user should not be able to visit edit password page' do
131
- sign_in_as_user
132
- get edit_user_password_path
133
- assert_response :redirect
134
- assert_redirected_to root_path
135
- assert warden.authenticated?(:user)
136
- end
137
-
138
- test 'not authenticated user without a reset password token should not be able to visit the page' do
139
- get edit_user_password_path
140
- assert_response :redirect
141
- assert_redirected_to "/users/sign_in"
142
- end
143
-
144
- test 'not authenticated user with invalid reset password token should not be able to change their password' do
145
- user = create_user
146
- reset_password reset_password_token: 'invalid_reset_password'
147
-
148
- assert_response :success
149
- assert_current_url '/users/password'
150
- assert_have_selector '#error_explanation'
151
- assert_contain %r{Reset password token(.*)invalid}
152
- refute user.reload.valid_password?('987654321')
153
- end
154
-
155
- test 'not authenticated user with valid reset password token but invalid password should not be able to change their password' do
156
- user = create_user
157
- request_forgot_password
158
- reset_password do
159
- fill_in 'Confirm new password', with: 'other_password'
160
- end
161
-
162
- assert_response :success
163
- assert_current_url '/users/password'
164
- assert_have_selector '#error_explanation'
165
- assert_contain "Password confirmation doesn't match Password"
166
- refute user.reload.valid_password?('987654321')
167
- end
168
-
169
- test 'not authenticated user with valid data should be able to change their password' do
170
- user = create_user
171
- request_forgot_password
172
- reset_password
173
-
174
- assert_current_url '/'
175
- assert_contain 'Your password has been changed successfully. You are now signed in.'
176
- assert user.reload.valid_password?('987654321')
177
- end
178
-
179
- test 'after entering invalid data user should still be able to change their password' do
180
- user = create_user
181
- request_forgot_password
182
-
183
- reset_password { fill_in 'Confirm new password', with: 'other_password' }
184
- assert_response :success
185
- assert_have_selector '#error_explanation'
186
- refute user.reload.valid_password?('987654321')
187
-
188
- reset_password visit: false
189
- assert_contain 'Your password has been changed successfully.'
190
- assert user.reload.valid_password?('987654321')
191
- end
192
-
193
- test 'sign in user automatically after changing its password' do
194
- create_user
195
- request_forgot_password
196
- reset_password
197
-
198
- assert warden.authenticated?(:user)
199
- end
200
-
201
- test 'does not sign in user automatically after changing its password if config.sign_in_after_reset_password is false' do
202
- swap Devise, sign_in_after_reset_password: false do
203
- create_user
204
- request_forgot_password
205
- reset_password
206
-
207
- assert_contain 'Your password has been changed successfully.'
208
- assert_not_contain 'You are now signed in.'
209
- assert_equal new_user_session_path, @request.path
210
- assert !warden.authenticated?(:user)
211
- end
212
- end
213
-
214
- test 'does not sign in user automatically after changing its password if it\'s locked and unlock strategy is :none or :time' do
215
- [:none, :time].each do |strategy|
216
- swap Devise, unlock_strategy: strategy do
217
- create_user(locked: true)
218
- request_forgot_password
219
- reset_password
220
-
221
- assert_contain 'Your password has been changed successfully.'
222
- assert_not_contain 'You are now signed in.'
223
- assert_equal new_user_session_path, @request.path
224
- assert !warden.authenticated?(:user)
225
- end
226
- end
227
- end
228
-
229
- test 'unlocks and signs in locked user automatically after changing it\'s password if unlock strategy is :email' do
230
- swap Devise, unlock_strategy: :email do
231
- user = create_user(locked: true)
232
- request_forgot_password
233
- reset_password
234
-
235
- assert_contain 'Your password has been changed successfully.'
236
- assert !user.reload.access_locked?
237
- assert warden.authenticated?(:user)
238
- end
239
- end
240
-
241
- test 'unlocks and signs in locked user automatically after changing it\'s password if unlock strategy is :both' do
242
- swap Devise, unlock_strategy: :both do
243
- user = create_user(locked: true)
244
- request_forgot_password
245
- reset_password
246
-
247
- assert_contain 'Your password has been changed successfully.'
248
- assert !user.reload.access_locked?
249
- assert warden.authenticated?(:user)
250
- end
251
- end
252
-
253
- test 'reset password request with valid E-Mail in XML format should return valid response' do
254
- create_user
255
- post user_password_path(format: 'xml'), params: { user: {email: "user@test.com"} }
256
- assert_response :success
257
- assert_equal response.body, { }.to_xml
258
- end
259
-
260
- test 'reset password request with invalid E-Mail in XML format should return valid response' do
261
- create_user
262
- post user_password_path(format: 'xml'), params: { user: {email: "invalid.test@test.com"} }
263
- assert_response :unprocessable_entity
264
- assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<errors>)
265
- end
266
-
267
- test 'reset password request with invalid E-Mail in XML format should return empty and valid response' do
268
- swap Devise, paranoid: true do
269
- create_user
270
- post user_password_path(format: 'xml'), params: { user: {email: "invalid@test.com"} }
271
- assert_response :success
272
- assert_equal response.body, { }.to_xml
273
- end
274
- end
275
-
276
- test 'change password with valid parameters in XML format should return valid response' do
277
- create_user
278
- request_forgot_password
279
- put user_password_path(format: 'xml'), params: { user: {
280
- reset_password_token: 'abcdef', password: '987654321', password_confirmation: '987654321'
281
- }
282
- }
283
- assert_response :success
284
- assert warden.authenticated?(:user)
285
- end
286
-
287
- test 'change password with invalid token in XML format should return invalid response' do
288
- create_user
289
- request_forgot_password
290
- put user_password_path(format: 'xml'), params: { user: {reset_password_token: 'invalid.token', password: '987654321', password_confirmation: '987654321'} }
291
- assert_response :unprocessable_entity
292
- assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<errors>)
293
- end
294
-
295
- test 'change password with invalid new password in XML format should return invalid response' do
296
- user = create_user
297
- request_forgot_password
298
- put user_password_path(format: 'xml'), params: { user: {reset_password_token: user.reload.reset_password_token, password: '', password_confirmation: '987654321'} }
299
- assert_response :unprocessable_entity
300
- assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<errors>)
301
- end
302
-
303
- test "when using json requests to ask a confirmable request, should not return the object" do
304
- user = create_user(confirm: false)
305
-
306
- post user_password_path(format: :json), params: { user: { email: user.email } }
307
-
308
- assert_response :success
309
- assert_equal response.body, "{}"
310
- end
311
-
312
- 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
313
- swap Devise, paranoid: true do
314
- visit_new_password_path
315
- fill_in "email", with: "arandomemail@test.com"
316
- click_button 'Send me reset password instructions'
317
-
318
- assert_not_contain "1 error prohibited this user from being saved:"
319
- assert_not_contain "Email not found"
320
- 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."
321
- assert_current_url "/users/sign_in"
322
- end
323
- end
324
-
325
- 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
326
- swap Devise, paranoid: true do
327
- user = create_user
328
- visit_new_password_path
329
- fill_in 'email', with: user.email
330
- click_button 'Send me reset password instructions'
331
-
332
- 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."
333
- assert_current_url "/users/sign_in"
334
- end
335
- end
336
-
337
- test "after recovering a password, should set failed attempts to 0" do
338
- user = create_user
339
- user.update_attribute(:failed_attempts, 10)
340
-
341
- assert_equal 10, user.failed_attempts
342
- request_forgot_password
343
- reset_password
344
-
345
- assert warden.authenticated?(:user)
346
- user.reload
347
- assert_equal 0, user.failed_attempts
348
- end
349
- end