devise 4.1.1 → 4.8.0

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