devise 2.1.2 → 3.5.10

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 (242) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +39 -10
  3. data/.yardopts +9 -0
  4. data/{CHANGELOG.rdoc → CHANGELOG.md} +445 -112
  5. data/CODE_OF_CONDUCT.md +22 -0
  6. data/CONTRIBUTING.md +16 -0
  7. data/Gemfile +10 -15
  8. data/Gemfile.lock +151 -129
  9. data/MIT-LICENSE +1 -1
  10. data/README.md +256 -96
  11. data/Rakefile +4 -2
  12. data/app/controllers/devise/confirmations_controller.rb +15 -7
  13. data/app/controllers/devise/omniauth_callbacks_controller.rb +6 -2
  14. data/app/controllers/devise/passwords_controller.rb +33 -9
  15. data/app/controllers/devise/registrations_controller.rb +66 -26
  16. data/app/controllers/devise/sessions_controller.rb +52 -21
  17. data/app/controllers/devise/unlocks_controller.rb +11 -6
  18. data/app/controllers/devise_controller.rb +65 -58
  19. data/app/helpers/devise_helper.rb +2 -2
  20. data/app/mailers/devise/mailer.rb +19 -10
  21. data/app/views/devise/confirmations/new.html.erb +8 -4
  22. data/app/views/devise/mailer/confirmation_instructions.html.erb +2 -2
  23. data/app/views/devise/mailer/password_change.html.erb +3 -0
  24. data/app/views/devise/mailer/reset_password_instructions.html.erb +2 -2
  25. data/app/views/devise/mailer/unlock_instructions.html.erb +2 -2
  26. data/app/views/devise/passwords/edit.html.erb +15 -6
  27. data/app/views/devise/passwords/new.html.erb +8 -4
  28. data/app/views/devise/registrations/edit.html.erb +29 -15
  29. data/app/views/devise/registrations/new.html.erb +19 -8
  30. data/app/views/devise/sessions/new.html.erb +17 -8
  31. data/app/views/devise/shared/{_links.erb → _links.html.erb} +4 -4
  32. data/app/views/devise/unlocks/new.html.erb +8 -4
  33. data/config/locales/en.yml +51 -47
  34. data/devise.gemspec +8 -6
  35. data/devise.png +0 -0
  36. data/gemfiles/Gemfile.rails-3.2-stable +29 -0
  37. data/gemfiles/Gemfile.rails-3.2-stable.lock +172 -0
  38. data/gemfiles/Gemfile.rails-4.0-stable +30 -0
  39. data/gemfiles/Gemfile.rails-4.0-stable.lock +166 -0
  40. data/gemfiles/Gemfile.rails-4.1-stable +30 -0
  41. data/gemfiles/Gemfile.rails-4.1-stable.lock +171 -0
  42. data/gemfiles/Gemfile.rails-4.2-stable +30 -0
  43. data/gemfiles/Gemfile.rails-4.2-stable.lock +193 -0
  44. data/lib/devise/controllers/helpers.rb +126 -108
  45. data/lib/devise/controllers/rememberable.rb +19 -17
  46. data/lib/devise/controllers/scoped_views.rb +1 -1
  47. data/lib/devise/controllers/sign_in_out.rb +96 -0
  48. data/lib/devise/controllers/store_location.rb +58 -0
  49. data/lib/devise/controllers/url_helpers.rb +7 -7
  50. data/lib/devise/encryptor.rb +22 -0
  51. data/lib/devise/failure_app.rb +85 -25
  52. data/lib/devise/hooks/activatable.rb +5 -6
  53. data/lib/devise/hooks/csrf_cleaner.rb +7 -0
  54. data/lib/devise/hooks/forgetable.rb +1 -1
  55. data/lib/devise/hooks/lockable.rb +2 -2
  56. data/lib/devise/hooks/proxy.rb +21 -0
  57. data/lib/devise/hooks/rememberable.rb +5 -4
  58. data/lib/devise/hooks/timeoutable.rb +16 -8
  59. data/lib/devise/hooks/trackable.rb +1 -1
  60. data/lib/devise/mailers/helpers.rb +27 -23
  61. data/lib/devise/mapping.rb +11 -7
  62. data/lib/devise/models/authenticatable.rb +82 -66
  63. data/lib/devise/models/confirmable.rb +142 -55
  64. data/lib/devise/models/database_authenticatable.rb +59 -15
  65. data/lib/devise/models/lockable.rb +41 -30
  66. data/lib/devise/models/omniauthable.rb +3 -3
  67. data/lib/devise/models/recoverable.rb +56 -41
  68. data/lib/devise/models/rememberable.rb +65 -27
  69. data/lib/devise/models/timeoutable.rb +2 -8
  70. data/lib/devise/models/trackable.rb +6 -4
  71. data/lib/devise/models/validatable.rb +9 -9
  72. data/lib/devise/models.rb +4 -13
  73. data/lib/devise/modules.rb +10 -11
  74. data/lib/devise/omniauth/url_helpers.rb +2 -2
  75. data/lib/devise/orm/active_record.rb +1 -1
  76. data/lib/devise/orm/mongoid.rb +1 -1
  77. data/lib/devise/{param_filter.rb → parameter_filter.rb} +10 -11
  78. data/lib/devise/parameter_sanitizer.rb +99 -0
  79. data/lib/devise/rails/routes.rb +173 -115
  80. data/lib/devise/rails/warden_compat.rb +10 -31
  81. data/lib/devise/rails.rb +14 -12
  82. data/lib/devise/strategies/authenticatable.rb +26 -26
  83. data/lib/devise/strategies/base.rb +1 -1
  84. data/lib/devise/strategies/database_authenticatable.rb +8 -4
  85. data/lib/devise/strategies/rememberable.rb +15 -5
  86. data/lib/devise/test_helpers.rb +7 -5
  87. data/lib/devise/time_inflector.rb +14 -0
  88. data/lib/devise/token_generator.rb +70 -0
  89. data/lib/devise/version.rb +1 -1
  90. data/lib/devise.rb +110 -52
  91. data/lib/generators/active_record/devise_generator.rb +34 -18
  92. data/lib/generators/active_record/templates/migration.rb +5 -6
  93. data/lib/generators/active_record/templates/migration_existing.rb +5 -6
  94. data/lib/generators/devise/controllers_generator.rb +44 -0
  95. data/lib/generators/devise/devise_generator.rb +5 -3
  96. data/lib/generators/devise/install_generator.rb +5 -0
  97. data/lib/generators/devise/orm_helpers.rb +25 -6
  98. data/lib/generators/devise/views_generator.rb +52 -22
  99. data/lib/generators/mongoid/devise_generator.rb +21 -26
  100. data/lib/generators/templates/README +9 -5
  101. data/lib/generators/templates/controllers/README +14 -0
  102. data/lib/generators/templates/controllers/confirmations_controller.rb +28 -0
  103. data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +28 -0
  104. data/lib/generators/templates/controllers/passwords_controller.rb +32 -0
  105. data/lib/generators/templates/controllers/registrations_controller.rb +60 -0
  106. data/lib/generators/templates/controllers/sessions_controller.rb +25 -0
  107. data/lib/generators/templates/controllers/unlocks_controller.rb +28 -0
  108. data/lib/generators/templates/devise.rb +80 -43
  109. data/lib/generators/templates/markerb/confirmation_instructions.markerb +2 -2
  110. data/lib/generators/templates/markerb/password_change.markerb +3 -0
  111. data/lib/generators/templates/markerb/reset_password_instructions.markerb +1 -1
  112. data/lib/generators/templates/markerb/unlock_instructions.markerb +2 -2
  113. data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +3 -2
  114. data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +4 -4
  115. data/lib/generators/templates/simple_form_for/passwords/new.html.erb +2 -2
  116. data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +11 -6
  117. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +4 -4
  118. data/lib/generators/templates/simple_form_for/sessions/new.html.erb +6 -6
  119. data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +3 -2
  120. data/script/cached-bundle +49 -0
  121. data/script/s3-put +71 -0
  122. data/test/controllers/custom_registrations_controller_test.rb +40 -0
  123. data/test/controllers/helper_methods_test.rb +21 -0
  124. data/test/controllers/helpers_test.rb +95 -32
  125. data/test/controllers/inherited_controller_i18n_messages_test.rb +51 -0
  126. data/test/controllers/internal_helpers_test.rb +39 -14
  127. data/test/controllers/load_hooks_controller_test.rb +19 -0
  128. data/test/controllers/passwords_controller_test.rb +31 -0
  129. data/test/controllers/sessions_controller_test.rb +66 -6
  130. data/test/controllers/url_helpers_test.rb +10 -4
  131. data/test/delegator_test.rb +1 -1
  132. data/test/devise_test.rb +45 -10
  133. data/test/failure_app_test.rb +121 -27
  134. data/test/generators/active_record_generator_test.rb +48 -8
  135. data/test/generators/controllers_generator_test.rb +48 -0
  136. data/test/generators/devise_generator_test.rb +2 -2
  137. data/test/generators/mongoid_generator_test.rb +3 -3
  138. data/test/generators/views_generator_test.rb +54 -3
  139. data/test/helpers/devise_helper_test.rb +18 -20
  140. data/test/integration/authenticatable_test.rb +161 -65
  141. data/test/integration/confirmable_test.rb +146 -77
  142. data/test/integration/database_authenticatable_test.rb +43 -30
  143. data/test/integration/http_authenticatable_test.rb +30 -22
  144. data/test/integration/lockable_test.rb +64 -49
  145. data/test/integration/omniauthable_test.rb +17 -15
  146. data/test/integration/recoverable_test.rb +111 -70
  147. data/test/integration/registerable_test.rb +114 -79
  148. data/test/integration/rememberable_test.rb +87 -31
  149. data/test/integration/timeoutable_test.rb +77 -33
  150. data/test/integration/trackable_test.rb +5 -5
  151. data/test/mailers/confirmation_instructions_test.rb +28 -8
  152. data/test/mailers/reset_password_instructions_test.rb +21 -8
  153. data/test/mailers/unlock_instructions_test.rb +20 -6
  154. data/test/mapping_test.rb +12 -5
  155. data/test/models/authenticatable_test.rb +17 -1
  156. data/test/models/confirmable_test.rb +216 -62
  157. data/test/models/database_authenticatable_test.rb +129 -49
  158. data/test/models/lockable_test.rb +132 -45
  159. data/test/models/recoverable_test.rb +100 -54
  160. data/test/models/rememberable_test.rb +89 -94
  161. data/test/models/serializable_test.rb +12 -11
  162. data/test/models/timeoutable_test.rb +6 -1
  163. data/test/models/trackable_test.rb +28 -0
  164. data/test/models/validatable_test.rb +31 -21
  165. data/test/models_test.rb +22 -48
  166. data/test/omniauth/config_test.rb +4 -4
  167. data/test/omniauth/url_helpers_test.rb +7 -4
  168. data/test/orm/active_record.rb +1 -0
  169. data/test/orm/mongoid.rb +2 -3
  170. data/test/parameter_sanitizer_test.rb +81 -0
  171. data/test/rails_app/Rakefile +0 -4
  172. data/test/rails_app/app/active_record/shim.rb +1 -1
  173. data/test/rails_app/app/active_record/user_on_engine.rb +7 -0
  174. data/test/rails_app/app/active_record/user_on_main_app.rb +7 -0
  175. data/test/rails_app/app/active_record/user_without_email.rb +8 -0
  176. data/test/rails_app/app/controllers/admins/sessions_controller.rb +1 -1
  177. data/test/rails_app/app/controllers/admins_controller.rb +0 -5
  178. data/test/rails_app/app/controllers/application_controller.rb +6 -2
  179. data/test/rails_app/app/controllers/application_with_fake_engine.rb +30 -0
  180. data/test/rails_app/app/controllers/custom/registrations_controller.rb +31 -0
  181. data/test/rails_app/app/controllers/home_controller.rb +1 -1
  182. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +1 -1
  183. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +1 -1
  184. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +4 -4
  185. data/test/rails_app/app/controllers/users_controller.rb +12 -4
  186. data/test/rails_app/app/mailers/users/from_proc_mailer.rb +3 -0
  187. data/test/rails_app/app/mailers/users/mailer.rb +1 -1
  188. data/test/rails_app/app/mailers/users/reply_to_mailer.rb +4 -0
  189. data/test/rails_app/app/mongoid/admin.rb +12 -10
  190. data/test/rails_app/app/mongoid/shim.rb +4 -5
  191. data/test/rails_app/app/mongoid/user.rb +19 -22
  192. data/test/rails_app/app/mongoid/user_on_engine.rb +39 -0
  193. data/test/rails_app/app/mongoid/user_on_main_app.rb +39 -0
  194. data/test/rails_app/app/mongoid/user_without_email.rb +33 -0
  195. data/test/rails_app/app/views/admins/sessions/new.html.erb +1 -1
  196. data/test/rails_app/app/views/home/admin_dashboard.html.erb +1 -1
  197. data/test/rails_app/app/views/home/index.html.erb +1 -1
  198. data/test/rails_app/app/views/home/join.html.erb +1 -1
  199. data/test/rails_app/app/views/home/user_dashboard.html.erb +1 -1
  200. data/test/rails_app/app/views/layouts/application.html.erb +1 -1
  201. data/test/rails_app/app/views/users/edit_form.html.erb +1 -0
  202. data/test/rails_app/bin/bundle +3 -0
  203. data/test/rails_app/bin/rails +4 -0
  204. data/test/rails_app/bin/rake +4 -0
  205. data/test/rails_app/config/application.rb +4 -5
  206. data/test/rails_app/config/boot.rb +9 -3
  207. data/test/rails_app/config/environment.rb +2 -2
  208. data/test/rails_app/config/environments/development.rb +19 -7
  209. data/test/rails_app/config/environments/production.rb +68 -17
  210. data/test/rails_app/config/environments/test.rb +24 -16
  211. data/test/rails_app/config/initializers/devise.rb +22 -20
  212. data/test/rails_app/config/initializers/secret_token.rb +8 -2
  213. data/test/rails_app/config/initializers/session_store.rb +1 -0
  214. data/test/rails_app/config/routes.rb +71 -46
  215. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +9 -12
  216. data/test/rails_app/db/schema.rb +21 -18
  217. data/test/rails_app/lib/shared_admin.rb +7 -4
  218. data/test/rails_app/lib/shared_user.rb +6 -3
  219. data/test/rails_app/lib/shared_user_without_email.rb +26 -0
  220. data/test/rails_app/lib/shared_user_without_omniauth.rb +13 -0
  221. data/test/rails_test.rb +9 -0
  222. data/test/routes_test.rb +94 -78
  223. data/test/support/action_controller/record_identifier.rb +10 -0
  224. data/test/support/assertions.rb +2 -3
  225. data/test/support/helpers.rb +18 -32
  226. data/test/support/integration.rb +17 -16
  227. data/test/support/locale/en.yml +4 -0
  228. data/test/support/mongoid.yml +6 -0
  229. data/test/test_helper.rb +8 -1
  230. data/test/test_helpers_test.rb +64 -20
  231. data/test/test_models.rb +33 -0
  232. data/test/time_helpers.rb +137 -0
  233. metadata +172 -51
  234. data/app/views/devise/_links.erb +0 -3
  235. data/gemfiles/Gemfile.rails-3.1.x +0 -35
  236. data/gemfiles/Gemfile.rails-3.1.x.lock +0 -167
  237. data/lib/devise/models/token_authenticatable.rb +0 -77
  238. data/lib/devise/strategies/token_authenticatable.rb +0 -56
  239. data/test/indifferent_hash.rb +0 -33
  240. data/test/integration/token_authenticatable_test.rb +0 -161
  241. data/test/models/token_authenticatable_test.rb +0 -55
  242. data/test/rails_app/script/rails +0 -10
@@ -1,19 +1,19 @@
1
1
  require 'test_helper'
2
2
 
3
- class ConfirmationTest < ActionController::IntegrationTest
3
+ class ConfirmationTest < ActionDispatch::IntegrationTest
4
4
 
5
5
  def visit_user_confirmation_with_token(confirmation_token)
6
- visit user_confirmation_path(:confirmation_token => confirmation_token)
6
+ visit user_confirmation_path(confirmation_token: confirmation_token)
7
7
  end
8
8
 
9
9
  def resend_confirmation
10
- user = create_user(:confirm => false)
10
+ user = create_user(confirm: false)
11
11
  ActionMailer::Base.deliveries.clear
12
12
 
13
13
  visit new_user_session_path
14
14
  click_link "Didn't receive confirmation instructions?"
15
15
 
16
- fill_in 'email', :with => user.email
16
+ fill_in 'email', with: user.email
17
17
  click_button 'Resend confirmation instructions'
18
18
  end
19
19
 
@@ -21,16 +21,14 @@ class ConfirmationTest < ActionController::IntegrationTest
21
21
  resend_confirmation
22
22
 
23
23
  assert_current_url '/users/sign_in'
24
- assert_contain 'You will receive an email with instructions about how to confirm your account in a few minutes'
24
+ assert_contain 'You will receive an email with instructions for how to confirm your email address in a few minutes'
25
25
  assert_equal 1, ActionMailer::Base.deliveries.size
26
26
  assert_equal ['please-change-me@config-initializers-devise.com'], ActionMailer::Base.deliveries.first.from
27
27
  end
28
28
 
29
29
  test 'user should receive a confirmation from a custom mailer' do
30
30
  User.any_instance.stubs(:devise_mailer).returns(Users::Mailer)
31
-
32
31
  resend_confirmation
33
-
34
32
  assert_equal ['custom@example.com'], ActionMailer::Base.deliveries.first.from
35
33
  end
36
34
 
@@ -40,76 +38,106 @@ class ConfirmationTest < ActionController::IntegrationTest
40
38
  assert_contain /Confirmation token(.*)invalid/
41
39
  end
42
40
 
43
- test 'user with valid confirmation token should be able to confirm an account' do
44
- user = create_user(:confirm => false)
45
- assert_not user.confirmed?
46
- visit_user_confirmation_with_token(user.confirmation_token)
41
+ test 'user with valid confirmation token should not be able to confirm an account after the token has expired' do
42
+ swap Devise, confirm_within: 3.days do
43
+ user = create_user(confirm: false, confirmation_sent_at: 4.days.ago)
44
+ assert_not user.confirmed?
45
+ visit_user_confirmation_with_token(user.raw_confirmation_token)
47
46
 
48
- assert_contain 'Your account was successfully confirmed.'
49
- assert_current_url '/'
50
- assert user.reload.confirmed?
47
+ assert_have_selector '#error_explanation'
48
+ assert_contain /needs to be confirmed within 3 days/
49
+ assert_not user.reload.confirmed?
50
+ assert_current_url "/users/confirmation?confirmation_token=#{user.raw_confirmation_token}"
51
+ end
52
+ end
53
+
54
+ test 'user with valid confirmation token where the token has expired and with application router_name set to a different engine it should raise an error' do
55
+ user = create_user(confirm: false, confirmation_sent_at: 4.days.ago)
56
+
57
+ swap Devise, confirm_within: 3.days, router_name: :fake_engine do
58
+ assert_raise ActionView::Template::Error do
59
+ visit_user_confirmation_with_token(user.raw_confirmation_token)
60
+ end
61
+ end
62
+ end
63
+
64
+ test 'user with valid confirmation token where the token has expired and with application router_name set to a different engine and route overrides back to main it shows the path' do
65
+ user = create_user(confirm: false, confirmation_sent_at: 4.days.ago)
66
+
67
+ swap Devise, confirm_within: 3.days, router_name: :fake_engine do
68
+ visit user_on_main_app_confirmation_path(confirmation_token: user.raw_confirmation_token)
69
+
70
+ assert_current_url "/user_on_main_apps/confirmation?confirmation_token=#{user.raw_confirmation_token}"
71
+ end
72
+ end
73
+
74
+ test 'user with valid confirmation token where the token has expired with router overrides different engine it shows the path' do
75
+ user = create_user(confirm: false, confirmation_sent_at: 4.days.ago)
76
+
77
+ swap Devise, confirm_within: 3.days do
78
+ visit user_on_engine_confirmation_path(confirmation_token: user.raw_confirmation_token)
79
+
80
+ assert_current_url "/user_on_engines/confirmation?confirmation_token=#{user.raw_confirmation_token}"
81
+ end
82
+ end
83
+
84
+ test 'user with valid confirmation token should be able to confirm an account before the token has expired' do
85
+ swap Devise, confirm_within: 3.days do
86
+ user = create_user(confirm: false, confirmation_sent_at: 2.days.ago)
87
+ assert_not user.confirmed?
88
+ visit_user_confirmation_with_token(user.raw_confirmation_token)
89
+
90
+ assert_contain 'Your email address has been successfully confirmed.'
91
+ assert_current_url '/users/sign_in'
92
+ assert user.reload.confirmed?
93
+ end
51
94
  end
52
95
 
53
96
  test 'user should be redirected to a custom path after confirmation' do
54
97
  Devise::ConfirmationsController.any_instance.stubs(:after_confirmation_path_for).returns("/?custom=1")
55
98
 
56
- user = create_user(:confirm => false)
57
- visit_user_confirmation_with_token(user.confirmation_token)
99
+ user = create_user(confirm: false)
100
+ visit_user_confirmation_with_token(user.raw_confirmation_token)
58
101
 
59
102
  assert_current_url "/?custom=1"
60
103
  end
61
104
 
62
105
  test 'already confirmed user should not be able to confirm the account again' do
63
- user = create_user(:confirm => false)
106
+ user = create_user(confirm: false)
64
107
  user.confirmed_at = Time.now
65
108
  user.save
66
- visit_user_confirmation_with_token(user.confirmation_token)
109
+ visit_user_confirmation_with_token(user.raw_confirmation_token)
67
110
 
68
111
  assert_have_selector '#error_explanation'
69
112
  assert_contain 'already confirmed'
70
113
  end
71
114
 
72
115
  test 'already confirmed user should not be able to confirm the account again neither request confirmation' do
73
- user = create_user(:confirm => false)
116
+ user = create_user(confirm: false)
74
117
  user.confirmed_at = Time.now
75
118
  user.save
76
119
 
77
- visit_user_confirmation_with_token(user.confirmation_token)
120
+ visit_user_confirmation_with_token(user.raw_confirmation_token)
78
121
  assert_contain 'already confirmed'
79
122
 
80
- fill_in 'email', :with => user.email
123
+ fill_in 'email', with: user.email
81
124
  click_button 'Resend confirmation instructions'
82
125
  assert_contain 'already confirmed'
83
126
  end
84
127
 
85
- test 'sign in user automatically after confirming its email' do
86
- user = create_user(:confirm => false)
87
- visit_user_confirmation_with_token(user.confirmation_token)
88
-
89
- assert warden.authenticated?(:user)
90
- end
91
-
92
- test 'increases sign count when signed in through confirmation' do
93
- user = create_user(:confirm => false)
94
- visit_user_confirmation_with_token(user.confirmation_token)
95
-
96
- user.reload
97
- assert_equal 1, user.sign_in_count
98
- end
99
-
100
128
  test 'not confirmed user with setup to block without confirmation should not be able to sign in' do
101
- swap Devise, :allow_unconfirmed_access_for => 0.days do
102
- sign_in_as_user(:confirm => false)
129
+ swap Devise, allow_unconfirmed_access_for: 0.days do
130
+ sign_in_as_user(confirm: false)
103
131
 
104
- assert_contain 'You have to confirm your account before continuing'
132
+ assert_contain 'You have to confirm your email address before continuing'
105
133
  assert_not warden.authenticated?(:user)
106
134
  end
107
135
  end
108
136
 
109
137
  test 'not confirmed user should not see confirmation message if invalid credentials are given' do
110
- swap Devise, :allow_unconfirmed_access_for => 0.days do
111
- sign_in_as_user(:confirm => false) do
112
- fill_in 'password', :with => 'invalid'
138
+ swap Devise, allow_unconfirmed_access_for: 0.days do
139
+ sign_in_as_user(confirm: false) do
140
+ fill_in 'password', with: 'invalid'
113
141
  end
114
142
 
115
143
  assert_contain 'Invalid email or password'
@@ -118,138 +146,179 @@ class ConfirmationTest < ActionController::IntegrationTest
118
146
  end
119
147
 
120
148
  test 'not confirmed user but configured with some days to confirm should be able to sign in' do
121
- swap Devise, :allow_unconfirmed_access_for => 1.day do
122
- sign_in_as_user(:confirm => false)
149
+ swap Devise, allow_unconfirmed_access_for: 1.day do
150
+ sign_in_as_user(confirm: false)
123
151
 
124
152
  assert_response :success
125
153
  assert warden.authenticated?(:user)
126
154
  end
127
155
  end
128
156
 
157
+ test 'unconfirmed but signed in user should be redirected to their root path' do
158
+ swap Devise, allow_unconfirmed_access_for: 1.day do
159
+ user = sign_in_as_user(confirm: false)
160
+
161
+ visit_user_confirmation_with_token(user.raw_confirmation_token)
162
+ assert_contain 'Your email address has been successfully confirmed.'
163
+ assert_current_url '/'
164
+ end
165
+ end
166
+
167
+ test 'user should be redirected to sign in page whenever signed in as another resource at same session already' do
168
+ sign_in_as_admin
169
+
170
+ user = create_user(confirm: false)
171
+ visit_user_confirmation_with_token(user.raw_confirmation_token)
172
+
173
+ assert_current_url '/users/sign_in'
174
+ end
175
+
129
176
  test 'error message is configurable by resource name' do
130
- store_translations :en, :devise => {
131
- :failure => { :user => { :unconfirmed => "Not confirmed user" } }
177
+ store_translations :en, devise: {
178
+ failure: { user: { unconfirmed: "Not confirmed user" } }
132
179
  } do
133
- sign_in_as_user(:confirm => false)
180
+ sign_in_as_user(confirm: false)
134
181
  assert_contain 'Not confirmed user'
135
182
  end
136
183
  end
137
184
 
138
185
  test 'resent confirmation token with valid E-Mail in XML format should return valid response' do
139
- user = create_user(:confirm => false)
140
- post user_confirmation_path(:format => 'xml'), :user => { :email => user.email }
186
+ user = create_user(confirm: false)
187
+ post user_confirmation_path(format: 'xml'), user: { email: user.email }
141
188
  assert_response :success
142
189
  assert_equal response.body, {}.to_xml
143
190
  end
144
191
 
145
192
  test 'resent confirmation token with invalid E-Mail in XML format should return invalid response' do
146
- user = create_user(:confirm => false)
147
- post user_confirmation_path(:format => 'xml'), :user => { :email => 'invalid.test@test.com' }
193
+ create_user(confirm: false)
194
+ post user_confirmation_path(format: 'xml'), user: { email: 'invalid.test@test.com' }
148
195
  assert_response :unprocessable_entity
149
196
  assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<errors>)
150
197
  end
151
198
 
152
199
  test 'confirm account with valid confirmation token in XML format should return valid response' do
153
- user = create_user(:confirm => false)
154
- get user_confirmation_path(:confirmation_token => user.confirmation_token, :format => 'xml')
200
+ user = create_user(confirm: false)
201
+ get user_confirmation_path(confirmation_token: user.raw_confirmation_token, format: 'xml')
155
202
  assert_response :success
156
203
  assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>)
157
204
  end
158
205
 
159
206
  test 'confirm account with invalid confirmation token in XML format should return invalid response' do
160
- user = create_user(:confirm => false)
161
- get user_confirmation_path(:confirmation_token => 'invalid_confirmation', :format => 'xml')
207
+ create_user(confirm: false)
208
+ get user_confirmation_path(confirmation_token: 'invalid_confirmation', format: 'xml')
162
209
  assert_response :unprocessable_entity
163
210
  assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<errors>)
164
211
  end
165
212
 
166
213
  test 'request an account confirmation account with JSON, should return an empty JSON' do
167
- user = create_user(:confirm => false)
214
+ user = create_user(confirm: false)
168
215
 
169
- post user_confirmation_path, :user => { :email => user.email }, :format => :json
216
+ post user_confirmation_path, user: { email: user.email }, format: :json
170
217
  assert_response :success
171
218
  assert_equal response.body, {}.to_json
172
219
  end
173
220
 
174
221
  test "when in paranoid mode and with a valid e-mail, should not say that the e-mail is valid" do
175
- swap Devise, :paranoid => true do
176
- user = create_user(:confirm => false)
222
+ swap Devise, paranoid: true do
223
+ user = create_user(confirm: false)
177
224
  visit new_user_session_path
178
225
 
179
226
  click_link "Didn't receive confirmation instructions?"
180
- fill_in 'email', :with => user.email
227
+ fill_in 'email', with: user.email
181
228
  click_button 'Resend confirmation instructions'
182
229
 
183
- assert_contain "If your email address exists in our database, you will receive an email with instructions about how to confirm your account in a few minutes."
230
+ assert_contain "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes."
184
231
  assert_current_url "/users/sign_in"
185
232
  end
186
233
  end
187
234
 
188
235
  test "when in paranoid mode and with a invalid e-mail, should not say that the e-mail is invalid" do
189
- swap Devise, :paranoid => true do
236
+ swap Devise, paranoid: true do
190
237
  visit new_user_session_path
191
238
 
192
239
  click_link "Didn't receive confirmation instructions?"
193
- fill_in 'email', :with => "idonthavethisemail@gmail.com"
240
+ fill_in 'email', with: "idonthavethisemail@gmail.com"
194
241
  click_button 'Resend confirmation instructions'
195
242
 
196
243
  assert_not_contain "1 error prohibited this user from being saved:"
197
244
  assert_not_contain "Email not found"
198
245
 
199
- assert_contain "If your email address exists in our database, you will receive an email with instructions about how to confirm your account in a few minutes."
246
+ assert_contain "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes."
200
247
  assert_current_url "/users/sign_in"
201
248
  end
202
249
  end
203
250
  end
204
251
 
205
- class ConfirmationOnChangeTest < ActionController::IntegrationTest
252
+ class ConfirmationOnChangeTest < ActionDispatch::IntegrationTest
206
253
  def create_second_admin(options={})
207
254
  @admin = nil
208
255
  create_admin(options)
209
256
  end
210
257
 
211
258
  def visit_admin_confirmation_with_token(confirmation_token)
212
- visit admin_confirmation_path(:confirmation_token => confirmation_token)
259
+ visit admin_confirmation_path(confirmation_token: confirmation_token)
213
260
  end
214
261
 
215
262
  test 'admin should be able to request a new confirmation after email changed' do
216
263
  admin = create_admin
217
- admin.update_attributes(:email => 'new_test@example.com')
264
+ admin.update_attributes(email: 'new_test@example.com')
218
265
 
219
266
  visit new_admin_session_path
220
267
  click_link "Didn't receive confirmation instructions?"
221
268
 
222
- fill_in 'email', :with => admin.unconfirmed_email
269
+ fill_in 'email', with: admin.unconfirmed_email
223
270
  assert_difference "ActionMailer::Base.deliveries.size" do
224
271
  click_button 'Resend confirmation instructions'
225
272
  end
226
273
 
227
274
  assert_current_url '/admin_area/sign_in'
228
- assert_contain 'You will receive an email with instructions about how to confirm your account in a few minutes'
275
+ assert_contain 'You will receive an email with instructions for how to confirm your email address in a few minutes'
229
276
  end
230
277
 
231
278
  test 'admin with valid confirmation token should be able to confirm email after email changed' do
232
279
  admin = create_admin
233
- admin.update_attributes(:email => 'new_test@example.com')
280
+ admin.update_attributes(email: 'new_test@example.com')
234
281
  assert_equal 'new_test@example.com', admin.unconfirmed_email
235
- visit_admin_confirmation_with_token(admin.confirmation_token)
282
+ visit_admin_confirmation_with_token(admin.raw_confirmation_token)
236
283
 
237
- assert_contain 'Your account was successfully confirmed.'
238
- assert_current_url '/admin_area/home'
284
+ assert_contain 'Your email address has been successfully confirmed.'
285
+ assert_current_url '/admin_area/sign_in'
286
+ assert admin.reload.confirmed?
287
+ assert_not admin.reload.pending_reconfirmation?
288
+ end
289
+
290
+ test 'admin with previously valid confirmation token should not be able to confirm email after email changed again' do
291
+ admin = create_admin
292
+ admin.update_attributes(email: 'first_test@example.com')
293
+ assert_equal 'first_test@example.com', admin.unconfirmed_email
294
+
295
+ raw_confirmation_token = admin.raw_confirmation_token
296
+ admin = Admin.find(admin.id)
297
+
298
+ admin.update_attributes(email: 'second_test@example.com')
299
+ assert_equal 'second_test@example.com', admin.unconfirmed_email
300
+
301
+ visit_admin_confirmation_with_token(raw_confirmation_token)
302
+ assert_have_selector '#error_explanation'
303
+ assert_contain(/Confirmation token(.*)invalid/)
304
+
305
+ visit_admin_confirmation_with_token(admin.raw_confirmation_token)
306
+ assert_contain 'Your email address has been successfully confirmed.'
307
+ assert_current_url '/admin_area/sign_in'
239
308
  assert admin.reload.confirmed?
240
309
  assert_not admin.reload.pending_reconfirmation?
241
310
  end
242
311
 
243
312
  test 'admin email should be unique also within unconfirmed_email' do
244
313
  admin = create_admin
245
- admin.update_attributes(:email => 'new_admin_test@example.com')
314
+ admin.update_attributes(email: 'new_admin_test@example.com')
246
315
  assert_equal 'new_admin_test@example.com', admin.unconfirmed_email
247
316
 
248
- create_second_admin(:email => "new_admin_test@example.com")
317
+ create_second_admin(email: "new_admin_test@example.com")
249
318
 
250
- visit_admin_confirmation_with_token(admin.confirmation_token)
319
+ visit_admin_confirmation_with_token(admin.raw_confirmation_token)
251
320
  assert_have_selector '#error_explanation'
252
- assert_contain /Email.*already.*taken/
321
+ assert_contain(/Email.*already.*taken/)
253
322
  assert admin.reload.pending_reconfirmation?
254
323
  end
255
324
  end
@@ -1,69 +1,71 @@
1
1
  require 'test_helper'
2
2
 
3
- class DatabaseAuthenticationTest < ActionController::IntegrationTest
3
+ class DatabaseAuthenticationTest < ActionDispatch::IntegrationTest
4
4
  test 'sign in with email of different case should succeed when email is in the list of case insensitive keys' do
5
- create_user(:email => 'Foo@Bar.com')
6
-
5
+ create_user(email: 'Foo@Bar.com')
6
+
7
7
  sign_in_as_user do
8
- fill_in 'email', :with => 'foo@bar.com'
8
+ fill_in 'email', with: 'foo@bar.com'
9
9
  end
10
-
10
+
11
11
  assert warden.authenticated?(:user)
12
12
  end
13
13
 
14
14
  test 'sign in with email of different case should fail when email is NOT the list of case insensitive keys' do
15
- swap Devise, :case_insensitive_keys => [] do
16
- create_user(:email => 'Foo@Bar.com')
17
-
15
+ swap Devise, case_insensitive_keys: [] do
16
+ create_user(email: 'Foo@Bar.com')
17
+
18
18
  sign_in_as_user do
19
- fill_in 'email', :with => 'foo@bar.com'
19
+ fill_in 'email', with: 'foo@bar.com'
20
20
  end
21
-
21
+
22
22
  assert_not warden.authenticated?(:user)
23
23
  end
24
24
  end
25
-
25
+
26
26
  test 'sign in with email including extra spaces should succeed when email is in the list of strip whitespace keys' do
27
- create_user(:email => ' foo@bar.com ')
28
-
27
+ create_user(email: ' foo@bar.com ')
28
+
29
29
  sign_in_as_user do
30
- fill_in 'email', :with => 'foo@bar.com'
30
+ fill_in 'email', with: 'foo@bar.com'
31
31
  end
32
-
32
+
33
33
  assert warden.authenticated?(:user)
34
34
  end
35
35
 
36
36
  test 'sign in with email including extra spaces should fail when email is NOT the list of strip whitespace keys' do
37
- swap Devise, :strip_whitespace_keys => [] do
38
- create_user(:email => 'foo@bar.com')
39
-
37
+ swap Devise, strip_whitespace_keys: [] do
38
+ create_user(email: 'foo@bar.com')
39
+
40
40
  sign_in_as_user do
41
- fill_in 'email', :with => ' foo@bar.com '
41
+ fill_in 'email', with: ' foo@bar.com '
42
42
  end
43
-
43
+
44
44
  assert_not warden.authenticated?(:user)
45
45
  end
46
46
  end
47
47
 
48
48
  test 'sign in should not authenticate if not using proper authentication keys' do
49
- swap Devise, :authentication_keys => [:username] do
49
+ swap Devise, authentication_keys: [:username] do
50
50
  sign_in_as_user
51
51
  assert_not warden.authenticated?(:user)
52
52
  end
53
53
  end
54
54
 
55
55
  test 'sign in with invalid email should return to sign in form with error message' do
56
- sign_in_as_admin do
57
- fill_in 'email', :with => 'wrongemail@test.com'
58
- end
56
+ store_translations :en, devise: { failure: { admin: { not_found_in_database: 'Invalid email address' } } } do
57
+ sign_in_as_admin do
58
+ fill_in 'email', with: 'wrongemail@test.com'
59
+ end
59
60
 
60
- assert_contain 'Invalid email or password'
61
- assert_not warden.authenticated?(:admin)
61
+ assert_contain 'Invalid email address'
62
+ assert_not warden.authenticated?(:admin)
63
+ end
62
64
  end
63
65
 
64
66
  test 'sign in with invalid pasword should return to sign in form with error message' do
65
67
  sign_in_as_admin do
66
- fill_in 'password', :with => 'abcdef'
68
+ fill_in 'password', with: 'abcdef'
67
69
  end
68
70
 
69
71
  assert_contain 'Invalid email or password'
@@ -71,12 +73,23 @@ class DatabaseAuthenticationTest < ActionController::IntegrationTest
71
73
  end
72
74
 
73
75
  test 'error message is configurable by resource name' do
74
- store_translations :en, :devise => { :failure => { :admin => { :invalid => "Invalid credentials" } } } do
76
+ store_translations :en, devise: { failure: { admin: { invalid: "Invalid credentials" } } } do
75
77
  sign_in_as_admin do
76
- fill_in 'password', :with => 'abcdef'
78
+ fill_in 'password', with: 'abcdef'
77
79
  end
78
80
 
79
81
  assert_contain 'Invalid credentials'
80
82
  end
81
83
  end
82
- end
84
+
85
+ test 'valid sign in calls after_database_authentication callback' do
86
+ user = create_user(email: ' foo@bar.com ')
87
+
88
+ User.expects(:find_for_database_authentication).returns user
89
+ user.expects :after_database_authentication
90
+
91
+ sign_in_as_user do
92
+ fill_in 'email', with: 'foo@bar.com'
93
+ end
94
+ end
95
+ end