deviseOne 1.0.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 (246) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.travis.yml +38 -0
  4. data/.yardopts +9 -0
  5. data/CHANGELOG.md +1117 -0
  6. data/CONTRIBUTING.md +14 -0
  7. data/Gemfile +29 -0
  8. data/Gemfile.lock +199 -0
  9. data/MIT-LICENSE +20 -0
  10. data/README.md +529 -0
  11. data/Rakefile +35 -0
  12. data/app/controllers/devise/confirmations_controller.rb +47 -0
  13. data/app/controllers/devise/omniauth_callbacks_controller.rb +30 -0
  14. data/app/controllers/devise/passwords_controller.rb +71 -0
  15. data/app/controllers/devise/registrations_controller.rb +143 -0
  16. data/app/controllers/devise/sessions_controller.rb +166 -0
  17. data/app/controllers/devise/unlocks_controller.rb +46 -0
  18. data/app/controllers/devise_controller.rb +193 -0
  19. data/app/helpers/devise_helper.rb +25 -0
  20. data/app/mailers/devise/mailer.rb +20 -0
  21. data/app/views/devise/confirmations/new.html.erb +16 -0
  22. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  23. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  24. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  25. data/app/views/devise/passwords/edit.html.erb +25 -0
  26. data/app/views/devise/passwords/new.html.erb +16 -0
  27. data/app/views/devise/registrations/edit.html.erb +39 -0
  28. data/app/views/devise/registrations/new.html.erb +29 -0
  29. data/app/views/devise/sessions/new.html.erb +27 -0
  30. data/app/views/devise/shared/_links.html.erb +21 -0
  31. data/app/views/devise/unlocks/new.html.erb +16 -0
  32. data/config/locales/en.yml +70 -0
  33. data/devise.gemspec +33 -0
  34. data/devise.png +0 -0
  35. data/gemfiles/Gemfile.rails-3.2-stable +29 -0
  36. data/gemfiles/Gemfile.rails-3.2-stable.lock +169 -0
  37. data/gemfiles/Gemfile.rails-4.0-stable +29 -0
  38. data/gemfiles/Gemfile.rails-4.0-stable.lock +165 -0
  39. data/gemfiles/Gemfile.rails-4.1-stable +29 -0
  40. data/gemfiles/Gemfile.rails-4.1-stable.lock +170 -0
  41. data/lib/devise.rb +499 -0
  42. data/lib/devise/controllers/helpers.rb +284 -0
  43. data/lib/devise/controllers/rememberable.rb +47 -0
  44. data/lib/devise/controllers/scoped_views.rb +17 -0
  45. data/lib/devise/controllers/sign_in_out.rb +102 -0
  46. data/lib/devise/controllers/store_location.rb +58 -0
  47. data/lib/devise/controllers/url_helpers.rb +69 -0
  48. data/lib/devise/delegator.rb +16 -0
  49. data/lib/devise/failure_app.rb +212 -0
  50. data/lib/devise/hooks/activatable.rb +10 -0
  51. data/lib/devise/hooks/csrf_cleaner.rb +7 -0
  52. data/lib/devise/hooks/forgetable.rb +9 -0
  53. data/lib/devise/hooks/lockable.rb +7 -0
  54. data/lib/devise/hooks/proxy.rb +21 -0
  55. data/lib/devise/hooks/rememberable.rb +7 -0
  56. data/lib/devise/hooks/timeoutable.rb +35 -0
  57. data/lib/devise/hooks/trackable.rb +9 -0
  58. data/lib/devise/mailers/helpers.rb +90 -0
  59. data/lib/devise/mapping.rb +175 -0
  60. data/lib/devise/models.rb +119 -0
  61. data/lib/devise/models/authenticatable.rb +290 -0
  62. data/lib/devise/models/confirmable.rb +305 -0
  63. data/lib/devise/models/database_authenticatable.rb +164 -0
  64. data/lib/devise/models/lockable.rb +196 -0
  65. data/lib/devise/models/omniauthable.rb +27 -0
  66. data/lib/devise/models/recoverable.rb +157 -0
  67. data/lib/devise/models/registerable.rb +25 -0
  68. data/lib/devise/models/rememberable.rb +142 -0
  69. data/lib/devise/models/timeoutable.rb +49 -0
  70. data/lib/devise/models/trackable.rb +38 -0
  71. data/lib/devise/models/validatable.rb +66 -0
  72. data/lib/devise/modules.rb +28 -0
  73. data/lib/devise/omniauth.rb +28 -0
  74. data/lib/devise/omniauth/config.rb +45 -0
  75. data/lib/devise/omniauth/url_helpers.rb +18 -0
  76. data/lib/devise/orm/active_record.rb +3 -0
  77. data/lib/devise/orm/mongoid.rb +3 -0
  78. data/lib/devise/parameter_filter.rb +40 -0
  79. data/lib/devise/parameter_sanitizer.rb +99 -0
  80. data/lib/devise/rails.rb +56 -0
  81. data/lib/devise/rails/routes.rb +495 -0
  82. data/lib/devise/rails/warden_compat.rb +22 -0
  83. data/lib/devise/strategies/authenticatable.rb +173 -0
  84. data/lib/devise/strategies/base.rb +20 -0
  85. data/lib/devise/strategies/database_authenticatable.rb +24 -0
  86. data/lib/devise/strategies/rememberable.rb +59 -0
  87. data/lib/devise/test_helpers.rb +132 -0
  88. data/lib/devise/time_inflector.rb +14 -0
  89. data/lib/devise/token_generator.rb +70 -0
  90. data/lib/devise/version.rb +3 -0
  91. data/lib/generators/active_record/devise_generator.rb +91 -0
  92. data/lib/generators/active_record/templates/migration.rb +18 -0
  93. data/lib/generators/active_record/templates/migration_existing.rb +25 -0
  94. data/lib/generators/devise/controllers_generator.rb +44 -0
  95. data/lib/generators/devise/devise_generator.rb +26 -0
  96. data/lib/generators/devise/install_generator.rb +29 -0
  97. data/lib/generators/devise/orm_helpers.rb +51 -0
  98. data/lib/generators/devise/views_generator.rb +135 -0
  99. data/lib/generators/mongoid/devise_generator.rb +55 -0
  100. data/lib/generators/templates/README +35 -0
  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 +263 -0
  109. data/lib/generators/templates/markerb/confirmation_instructions.markerb +5 -0
  110. data/lib/generators/templates/markerb/reset_password_instructions.markerb +8 -0
  111. data/lib/generators/templates/markerb/unlock_instructions.markerb +7 -0
  112. data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +16 -0
  113. data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +19 -0
  114. data/lib/generators/templates/simple_form_for/passwords/new.html.erb +15 -0
  115. data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +27 -0
  116. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +17 -0
  117. data/lib/generators/templates/simple_form_for/sessions/new.html.erb +15 -0
  118. data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +16 -0
  119. data/script/cached-bundle +49 -0
  120. data/script/s3-put +71 -0
  121. data/test/controllers/custom_registrations_controller_test.rb +35 -0
  122. data/test/controllers/custom_strategy_test.rb +62 -0
  123. data/test/controllers/helpers_test.rb +316 -0
  124. data/test/controllers/internal_helpers_test.rb +129 -0
  125. data/test/controllers/load_hooks_controller_test.rb +19 -0
  126. data/test/controllers/passwords_controller_test.rb +31 -0
  127. data/test/controllers/sessions_controller_test.rb +102 -0
  128. data/test/controllers/url_helpers_test.rb +65 -0
  129. data/test/delegator_test.rb +19 -0
  130. data/test/devise_test.rb +107 -0
  131. data/test/failure_app_test.rb +275 -0
  132. data/test/generators/active_record_generator_test.rb +109 -0
  133. data/test/generators/controllers_generator_test.rb +48 -0
  134. data/test/generators/devise_generator_test.rb +39 -0
  135. data/test/generators/install_generator_test.rb +13 -0
  136. data/test/generators/mongoid_generator_test.rb +23 -0
  137. data/test/generators/views_generator_test.rb +96 -0
  138. data/test/helpers/devise_helper_test.rb +49 -0
  139. data/test/integration/authenticatable_test.rb +731 -0
  140. data/test/integration/confirmable_test.rb +324 -0
  141. data/test/integration/database_authenticatable_test.rb +94 -0
  142. data/test/integration/http_authenticatable_test.rb +105 -0
  143. data/test/integration/lockable_test.rb +239 -0
  144. data/test/integration/omniauthable_test.rb +133 -0
  145. data/test/integration/recoverable_test.rb +334 -0
  146. data/test/integration/registerable_test.rb +361 -0
  147. data/test/integration/rememberable_test.rb +176 -0
  148. data/test/integration/timeoutable_test.rb +189 -0
  149. data/test/integration/trackable_test.rb +92 -0
  150. data/test/mailers/confirmation_instructions_test.rb +115 -0
  151. data/test/mailers/reset_password_instructions_test.rb +96 -0
  152. data/test/mailers/unlock_instructions_test.rb +91 -0
  153. data/test/mapping_test.rb +128 -0
  154. data/test/models/authenticatable_test.rb +23 -0
  155. data/test/models/confirmable_test.rb +461 -0
  156. data/test/models/database_authenticatable_test.rb +249 -0
  157. data/test/models/lockable_test.rb +328 -0
  158. data/test/models/omniauthable_test.rb +7 -0
  159. data/test/models/recoverable_test.rb +205 -0
  160. data/test/models/registerable_test.rb +7 -0
  161. data/test/models/rememberable_test.rb +198 -0
  162. data/test/models/serializable_test.rb +49 -0
  163. data/test/models/timeoutable_test.rb +51 -0
  164. data/test/models/trackable_test.rb +41 -0
  165. data/test/models/validatable_test.rb +127 -0
  166. data/test/models_test.rb +144 -0
  167. data/test/omniauth/config_test.rb +57 -0
  168. data/test/omniauth/url_helpers_test.rb +54 -0
  169. data/test/orm/active_record.rb +10 -0
  170. data/test/orm/mongoid.rb +13 -0
  171. data/test/parameter_sanitizer_test.rb +81 -0
  172. data/test/rails_app/Rakefile +6 -0
  173. data/test/rails_app/app/active_record/admin.rb +6 -0
  174. data/test/rails_app/app/active_record/shim.rb +2 -0
  175. data/test/rails_app/app/active_record/user.rb +6 -0
  176. data/test/rails_app/app/active_record/user_on_engine.rb +7 -0
  177. data/test/rails_app/app/active_record/user_on_main_app.rb +7 -0
  178. data/test/rails_app/app/controllers/admins/sessions_controller.rb +6 -0
  179. data/test/rails_app/app/controllers/admins_controller.rb +11 -0
  180. data/test/rails_app/app/controllers/application_controller.rb +12 -0
  181. data/test/rails_app/app/controllers/application_with_fake_engine.rb +30 -0
  182. data/test/rails_app/app/controllers/custom/registrations_controller.rb +21 -0
  183. data/test/rails_app/app/controllers/home_controller.rb +25 -0
  184. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +2 -0
  185. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +2 -0
  186. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +14 -0
  187. data/test/rails_app/app/controllers/users_controller.rb +31 -0
  188. data/test/rails_app/app/helpers/application_helper.rb +3 -0
  189. data/test/rails_app/app/mailers/users/from_proc_mailer.rb +3 -0
  190. data/test/rails_app/app/mailers/users/mailer.rb +3 -0
  191. data/test/rails_app/app/mailers/users/reply_to_mailer.rb +4 -0
  192. data/test/rails_app/app/mongoid/admin.rb +29 -0
  193. data/test/rails_app/app/mongoid/shim.rb +23 -0
  194. data/test/rails_app/app/mongoid/user.rb +39 -0
  195. data/test/rails_app/app/mongoid/user_on_engine.rb +39 -0
  196. data/test/rails_app/app/mongoid/user_on_main_app.rb +39 -0
  197. data/test/rails_app/app/views/admins/index.html.erb +1 -0
  198. data/test/rails_app/app/views/admins/sessions/new.html.erb +2 -0
  199. data/test/rails_app/app/views/home/admin_dashboard.html.erb +1 -0
  200. data/test/rails_app/app/views/home/index.html.erb +1 -0
  201. data/test/rails_app/app/views/home/join.html.erb +1 -0
  202. data/test/rails_app/app/views/home/private.html.erb +1 -0
  203. data/test/rails_app/app/views/home/user_dashboard.html.erb +1 -0
  204. data/test/rails_app/app/views/layouts/application.html.erb +24 -0
  205. data/test/rails_app/app/views/users/edit_form.html.erb +1 -0
  206. data/test/rails_app/app/views/users/index.html.erb +1 -0
  207. data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +1 -0
  208. data/test/rails_app/app/views/users/sessions/new.html.erb +1 -0
  209. data/test/rails_app/bin/bundle +3 -0
  210. data/test/rails_app/bin/rails +4 -0
  211. data/test/rails_app/bin/rake +4 -0
  212. data/test/rails_app/config.ru +4 -0
  213. data/test/rails_app/config/application.rb +40 -0
  214. data/test/rails_app/config/boot.rb +14 -0
  215. data/test/rails_app/config/database.yml +18 -0
  216. data/test/rails_app/config/environment.rb +5 -0
  217. data/test/rails_app/config/environments/development.rb +30 -0
  218. data/test/rails_app/config/environments/production.rb +80 -0
  219. data/test/rails_app/config/environments/test.rb +36 -0
  220. data/test/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  221. data/test/rails_app/config/initializers/devise.rb +180 -0
  222. data/test/rails_app/config/initializers/inflections.rb +2 -0
  223. data/test/rails_app/config/initializers/secret_token.rb +8 -0
  224. data/test/rails_app/config/initializers/session_store.rb +1 -0
  225. data/test/rails_app/config/routes.rb +122 -0
  226. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +71 -0
  227. data/test/rails_app/db/schema.rb +55 -0
  228. data/test/rails_app/lib/shared_admin.rb +17 -0
  229. data/test/rails_app/lib/shared_user.rb +29 -0
  230. data/test/rails_app/lib/shared_user_without_omniauth.rb +13 -0
  231. data/test/rails_app/public/404.html +26 -0
  232. data/test/rails_app/public/422.html +26 -0
  233. data/test/rails_app/public/500.html +26 -0
  234. data/test/rails_app/public/favicon.ico +0 -0
  235. data/test/routes_test.rb +264 -0
  236. data/test/support/action_controller/record_identifier.rb +10 -0
  237. data/test/support/assertions.rb +39 -0
  238. data/test/support/helpers.rb +73 -0
  239. data/test/support/integration.rb +92 -0
  240. data/test/support/locale/en.yml +8 -0
  241. data/test/support/mongoid.yml +6 -0
  242. data/test/support/webrat/integrations/rails.rb +24 -0
  243. data/test/test_helper.rb +34 -0
  244. data/test/test_helpers_test.rb +163 -0
  245. data/test/test_models.rb +33 -0
  246. metadata +531 -0
@@ -0,0 +1,361 @@
1
+ require 'test_helper'
2
+
3
+ class RegistrationTest < ActionDispatch::IntegrationTest
4
+ =begin
5
+
6
+ test 'a guest admin should be able to sign in successfully' do
7
+ get new_admin_session_path
8
+ click_link 'Sign up'
9
+
10
+ assert_template 'registrations/new'
11
+
12
+ fill_in 'email', with: 'new_user@test.com'
13
+ fill_in 'password', with: 'new_user123'
14
+ fill_in 'password confirmation', with: 'new_user123'
15
+ click_button 'Sign up'
16
+
17
+ assert_contain 'You have signed up successfully'
18
+ assert warden.authenticated?(:admin)
19
+ assert_current_url "/admin_area/home"
20
+
21
+ admin = Admin.to_adapter.find_first(order: [:id, :desc])
22
+ assert_equal admin.email, 'new_user@test.com'
23
+ end
24
+
25
+ test 'a guest admin should be able to sign in and be redirected to a custom location' do
26
+ Devise::RegistrationsController.any_instance.stubs(:after_sign_up_path_for).returns("/?custom=1")
27
+ get new_admin_session_path
28
+ click_link 'Sign up'
29
+
30
+ fill_in 'email', with: 'new_user@test.com'
31
+ fill_in 'password', with: 'new_user123'
32
+ fill_in 'password confirmation', with: 'new_user123'
33
+ click_button 'Sign up'
34
+
35
+ assert_contain 'Welcome! You have signed up successfully.'
36
+ assert warden.authenticated?(:admin)
37
+ assert_current_url "/?custom=1"
38
+ end
39
+
40
+ test 'a guest admin should not see a warning about minimum password length' do
41
+ get new_admin_session_path
42
+ assert_not_contain 'characters minimum'
43
+ end
44
+
45
+ def user_sign_up
46
+ ActionMailer::Base.deliveries.clear
47
+
48
+ get new_user_registration_path
49
+
50
+ fill_in 'email', with: 'new_user@test.com'
51
+ fill_in 'password', with: 'new_user123'
52
+ fill_in 'password confirmation', with: 'new_user123'
53
+ click_button 'Sign up'
54
+ end
55
+
56
+ test 'a guest user should see a warning about minimum password length' do
57
+ get new_user_registration_path
58
+ assert_contain '7 characters minimum'
59
+ end
60
+
61
+ test 'a guest user should be able to sign up successfully and be blocked by confirmation' do
62
+ user_sign_up
63
+
64
+ assert_contain 'A message with a confirmation link has been sent to your email address. Please follow the link to activate your account.'
65
+ assert_not_contain 'You have to confirm your account before continuing'
66
+ assert_current_url "/"
67
+
68
+ assert_not warden.authenticated?(:user)
69
+
70
+ user = User.to_adapter.find_first(order: [:id, :desc])
71
+ assert_equal user.email, 'new_user@test.com'
72
+ assert_not user.confirmed?
73
+ end
74
+
75
+ test 'a guest user should receive the confirmation instructions from the default mailer' do
76
+ user_sign_up
77
+ assert_equal ['please-change-me@config-initializers-devise.com'], ActionMailer::Base.deliveries.first.from
78
+ end
79
+
80
+ test 'a guest user should receive the confirmation instructions from a custom mailer' do
81
+ User.any_instance.stubs(:devise_mailer).returns(Users::Mailer)
82
+ user_sign_up
83
+ assert_equal ['custom@example.com'], ActionMailer::Base.deliveries.first.from
84
+ end
85
+
86
+ test 'a guest user should be blocked by confirmation and redirected to a custom path' do
87
+ Devise::RegistrationsController.any_instance.stubs(:after_inactive_sign_up_path_for).returns("/?custom=1")
88
+ get new_user_registration_path
89
+
90
+ fill_in 'email', with: 'new_user@test.com'
91
+ fill_in 'password', with: 'new_user123'
92
+ fill_in 'password confirmation', with: 'new_user123'
93
+ click_button 'Sign up'
94
+
95
+ assert_current_url "/?custom=1"
96
+ assert_not warden.authenticated?(:user)
97
+ end
98
+
99
+ test 'a guest user cannot sign up with invalid information' do
100
+ # Dirty tracking behavior prevents email validations from being applied:
101
+ # https://github.com/mongoid/mongoid/issues/756
102
+ (pending "Fails on Mongoid < 2.1"; break) if defined?(Mongoid) && Mongoid::VERSION.to_f < 2.1
103
+
104
+ get new_user_registration_path
105
+
106
+ fill_in 'email', with: 'invalid_email'
107
+ fill_in 'password', with: 'new_user123'
108
+ fill_in 'password confirmation', with: 'new_user321'
109
+ click_button 'Sign up'
110
+
111
+ assert_template 'registrations/new'
112
+ assert_have_selector '#error_explanation'
113
+ assert_contain "Email is invalid"
114
+ assert_contain Devise.rails4? ?
115
+ "Password confirmation doesn't match Password" : "Password doesn't match confirmation"
116
+ assert_contain "2 errors prohibited"
117
+ assert_nil User.to_adapter.find_first
118
+
119
+ assert_not warden.authenticated?(:user)
120
+ end
121
+
122
+ test 'a guest should not sign up with email/password that already exists' do
123
+ # Dirty tracking behavior prevents email validations from being applied:
124
+ # https://github.com/mongoid/mongoid/issues/756
125
+ (pending "Fails on Mongoid < 2.1"; break) if defined?(Mongoid) && Mongoid::VERSION.to_f < 2.1
126
+
127
+ create_user
128
+ get new_user_registration_path
129
+
130
+ fill_in 'email', with: 'user@test.com'
131
+ fill_in 'password', with: '123456'
132
+ fill_in 'password confirmation', with: '123456'
133
+ click_button 'Sign up'
134
+
135
+ assert_current_url '/users'
136
+ assert_contain(/Email.*already.*taken/)
137
+
138
+ assert_not warden.authenticated?(:user)
139
+ end
140
+
141
+ test 'a guest should not be able to change account' do
142
+ get edit_user_registration_path
143
+ assert_redirected_to new_user_session_path
144
+ follow_redirect!
145
+ assert_contain 'You need to sign in or sign up before continuing.'
146
+ end
147
+
148
+ test 'a signed in user should not be able to access sign up' do
149
+ sign_in_as_user
150
+ get new_user_registration_path
151
+ assert_redirected_to root_path
152
+ end
153
+
154
+ test 'a signed in user should be able to edit their account' do
155
+ sign_in_as_user
156
+ get edit_user_registration_path
157
+
158
+ fill_in 'email', with: 'user.new@example.com'
159
+ fill_in 'current password', with: '12345678'
160
+ click_button 'Update'
161
+
162
+ assert_current_url '/'
163
+ assert_contain 'Your account has been updated successfully.'
164
+
165
+ assert_equal "user.new@example.com", User.to_adapter.find_first.email
166
+ end
167
+
168
+ test 'a signed in user should still be able to use the website after changing their password' do
169
+ sign_in_as_user
170
+ get edit_user_registration_path
171
+
172
+ fill_in 'password', with: '1234567890'
173
+ fill_in 'password confirmation', with: '1234567890'
174
+ fill_in 'current password', with: '12345678'
175
+ click_button 'Update'
176
+
177
+ assert_contain 'Your account has been updated successfully.'
178
+ get users_path
179
+ assert warden.authenticated?(:user)
180
+ end
181
+
182
+ test 'a signed in user should not change their current user with invalid password' do
183
+ sign_in_as_user
184
+ get edit_user_registration_path
185
+
186
+ fill_in 'email', with: 'user.new@example.com'
187
+ fill_in 'current password', with: 'invalid'
188
+ click_button 'Update'
189
+
190
+ assert_template 'registrations/edit'
191
+ assert_contain 'user@test.com'
192
+ assert_have_selector 'form input[value="user.new@example.com"]'
193
+
194
+ assert_equal "user@test.com", User.to_adapter.find_first.email
195
+ end
196
+
197
+ test 'a signed in user should be able to edit their password' do
198
+ sign_in_as_user
199
+ get edit_user_registration_path
200
+
201
+ fill_in 'password', with: 'pass1234'
202
+ fill_in 'password confirmation', with: 'pass1234'
203
+ fill_in 'current password', with: '12345678'
204
+ click_button 'Update'
205
+
206
+ assert_current_url '/'
207
+ assert_contain 'Your account has been updated successfully.'
208
+
209
+ assert User.to_adapter.find_first.valid_password?('pass1234')
210
+ end
211
+
212
+ test 'a signed in user should not be able to edit their password with invalid confirmation' do
213
+ sign_in_as_user
214
+ get edit_user_registration_path
215
+
216
+ fill_in 'password', with: 'pas123'
217
+ fill_in 'password confirmation', with: ''
218
+ fill_in 'current password', with: '12345678'
219
+ click_button 'Update'
220
+
221
+ assert_contain Devise.rails4? ?
222
+ "Password confirmation doesn't match Password" : "Password doesn't match confirmation"
223
+ assert_not User.to_adapter.find_first.valid_password?('pas123')
224
+ end
225
+
226
+ test 'a signed in user should be able to cancel their account' do
227
+ sign_in_as_user
228
+ get edit_user_registration_path
229
+
230
+ click_button "Cancel my account"
231
+ assert_contain "Bye! Your account has been successfully cancelled. We hope to see you again soon."
232
+
233
+ assert User.to_adapter.find_all.empty?
234
+ end
235
+
236
+ test 'a user should be able to cancel sign up by deleting data in the session' do
237
+ get "/set"
238
+ assert_equal "something", @request.session["devise.foo_bar"]
239
+
240
+ get "/users/sign_up"
241
+ assert_equal "something", @request.session["devise.foo_bar"]
242
+
243
+ get "/users/cancel"
244
+ assert_nil @request.session["devise.foo_bar"]
245
+ assert_redirected_to new_user_registration_path
246
+ end
247
+
248
+ test 'a user with XML sign up stub' do
249
+ get new_user_registration_path(format: 'xml')
250
+ assert_response :success
251
+ assert_match %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>), response.body
252
+ assert_no_match(/<confirmation-token/, response.body)
253
+ end
254
+
255
+ test 'a user with JSON sign up stub' do
256
+ get new_user_registration_path(format: 'json')
257
+ assert_response :success
258
+ assert_match %({"user":), response.body
259
+ assert_no_match(/"confirmation_token"/, response.body)
260
+ end
261
+
262
+ test 'an admin sign up with valid information in XML format should return valid response' do
263
+ post admin_registration_path(format: 'xml'), admin: { email: 'new_user@test.com', password: 'new_user123', password_confirmation: 'new_user123' }
264
+ assert_response :success
265
+ assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<admin>)
266
+
267
+ admin = Admin.to_adapter.find_first(order: [:id, :desc])
268
+ assert_equal admin.email, 'new_user@test.com'
269
+ end
270
+
271
+ test 'a user sign up with valid information in XML format should return valid response' do
272
+ post user_registration_path(format: 'xml'), user: { email: 'new_user@test.com', password: 'new_user123', password_confirmation: 'new_user123' }
273
+ assert_response :success
274
+ assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>)
275
+
276
+ user = User.to_adapter.find_first(order: [:id, :desc])
277
+ assert_equal user.email, 'new_user@test.com'
278
+ end
279
+
280
+ test 'a user sign up with invalid information in XML format should return invalid response' do
281
+ post user_registration_path(format: 'xml'), user: { email: 'new_user@test.com', password: 'new_user123', password_confirmation: 'invalid' }
282
+ assert_response :unprocessable_entity
283
+ assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<errors>)
284
+ end
285
+
286
+ test 'a user update information with valid data in XML format should return valid response' do
287
+ user = sign_in_as_user
288
+ put user_registration_path(format: 'xml'), user: { current_password: '12345678', email: 'user.new@test.com' }
289
+ assert_response :success
290
+ assert_equal user.reload.email, 'user.new@test.com'
291
+ end
292
+
293
+ test 'a user update information with invalid data in XML format should return invalid response' do
294
+ user = sign_in_as_user
295
+ put user_registration_path(format: 'xml'), user: { current_password: 'invalid', email: 'user.new@test.com' }
296
+ assert_response :unprocessable_entity
297
+ assert_equal user.reload.email, 'user@test.com'
298
+ end
299
+
300
+ test 'a user cancel their account in XML format should return valid response' do
301
+ sign_in_as_user
302
+ delete user_registration_path(format: 'xml')
303
+ assert_response :success
304
+ assert_equal User.to_adapter.find_all.size, 0
305
+ end
306
+ end
307
+
308
+ class ReconfirmableRegistrationTest < ActionDispatch::IntegrationTest
309
+ test 'a signed in admin should see a more appropriate flash message when editing their account if reconfirmable is enabled' do
310
+ sign_in_as_admin
311
+ get edit_admin_registration_path
312
+
313
+ fill_in 'email', with: 'admin.new@example.com'
314
+ fill_in 'current password', with: '123456'
315
+ click_button 'Update'
316
+
317
+ assert_current_url '/admin_area/home'
318
+ assert_contain 'but we need to verify your new email address'
319
+ assert_equal 'admin.new@example.com', Admin.to_adapter.find_first.unconfirmed_email
320
+
321
+ get edit_admin_registration_path
322
+ assert_contain 'Currently waiting confirmation for: admin.new@example.com'
323
+ end
324
+
325
+ test 'a signed in admin should not see a reconfirmation message if they did not change their password' do
326
+ sign_in_as_admin
327
+ get edit_admin_registration_path
328
+
329
+ fill_in 'password', with: 'pas123'
330
+ fill_in 'password confirmation', with: 'pas123'
331
+ fill_in 'current password', with: '123456'
332
+ click_button 'Update'
333
+
334
+ assert_current_url '/admin_area/home'
335
+ assert_contain 'Your account has been updated successfully.'
336
+
337
+ assert Admin.to_adapter.find_first.valid_password?('pas123')
338
+ end
339
+
340
+ test 'a signed in admin should not see a reconfirmation message if they did not change their email, despite having an unconfirmed email' do
341
+ sign_in_as_admin
342
+
343
+ get edit_admin_registration_path
344
+ fill_in 'email', with: 'admin.new@example.com'
345
+ fill_in 'current password', with: '123456'
346
+ click_button 'Update'
347
+
348
+ get edit_admin_registration_path
349
+ fill_in 'password', with: 'pas123'
350
+ fill_in 'password confirmation', with: 'pas123'
351
+ fill_in 'current password', with: '123456'
352
+ click_button 'Update'
353
+
354
+ assert_current_url '/admin_area/home'
355
+ assert_contain 'Your account has been updated successfully.'
356
+
357
+ assert_equal "admin.new@example.com", Admin.to_adapter.find_first.unconfirmed_email
358
+ assert Admin.to_adapter.find_first.valid_password?('pas123')
359
+ end
360
+ =end
361
+ end
@@ -0,0 +1,176 @@
1
+ require 'test_helper'
2
+
3
+ class RememberMeTest < ActionDispatch::IntegrationTest
4
+ def create_user_and_remember(add_to_token='')
5
+ user = create_user
6
+ user.remember_me!
7
+ raw_cookie = User.serialize_into_cookie(user).tap { |a| a.last << add_to_token }
8
+ cookies['remember_user_token'] = generate_signed_cookie(raw_cookie)
9
+ user
10
+ end
11
+
12
+ def generate_signed_cookie(raw_cookie)
13
+ request = ActionDispatch::TestRequest.new
14
+ request.cookie_jar.signed['raw_cookie'] = raw_cookie
15
+ request.cookie_jar['raw_cookie']
16
+ end
17
+
18
+ def signed_cookie(key)
19
+ controller.send(:cookies).signed[key]
20
+ end
21
+
22
+ def cookie_expires(key)
23
+ cookie = response.headers["Set-Cookie"].split("\n").grep(/^#{key}/).first
24
+ expires = cookie.split(";").map(&:strip).grep(/^expires=/).first
25
+ Time.parse(expires).utc
26
+ end
27
+
28
+ test 'do not remember the user if they have not checked remember me option' do
29
+ sign_in_as_user
30
+ assert_nil request.cookies["remember_user_cookie"]
31
+ end
32
+
33
+ test 'handle unverified requests gets rid of caches' do
34
+ swap ApplicationController, allow_forgery_protection: true do
35
+ post exhibit_user_url(1)
36
+ assert_not warden.authenticated?(:user)
37
+
38
+ create_user_and_remember
39
+ post exhibit_user_url(1)
40
+ assert_equal "User is not authenticated", response.body
41
+ assert_not warden.authenticated?(:user)
42
+ end
43
+ end
44
+
45
+ test 'handle unverified requests does not create cookies on sign in' do
46
+ swap ApplicationController, allow_forgery_protection: true do
47
+ get new_user_session_path
48
+ assert request.session[:_csrf_token]
49
+
50
+ post user_session_path, authenticity_token: "oops", user:
51
+ { email: "jose.valim@gmail.com", password: "123456", remember_me: "1" }
52
+ assert_not warden.authenticated?(:user)
53
+ assert_not request.cookies['remember_user_token']
54
+ end
55
+ end
56
+
57
+ test 'generate remember token after sign in' do
58
+ sign_in_as_user remember_me: true
59
+ assert request.cookies['remember_user_token']
60
+ end
61
+
62
+ test 'generate remember token after sign in setting cookie options' do
63
+ # We test this by asserting the cookie is not sent after the redirect
64
+ # since we changed the domain. This is the only difference with the
65
+ # previous test.
66
+ swap Devise, rememberable_options: { domain: "omg.somewhere.com" } do
67
+ sign_in_as_user remember_me: true
68
+ assert_nil request.cookies["remember_user_token"]
69
+ end
70
+ end
71
+
72
+ test 'generate remember token with a custom key' do
73
+ swap Devise, rememberable_options: { key: "v1lat_token" } do
74
+ sign_in_as_user remember_me: true
75
+ assert request.cookies["v1lat_token"]
76
+ end
77
+ end
78
+
79
+ test 'generate remember token after sign in setting session options' do
80
+ begin
81
+ Rails.configuration.session_options[:domain] = "omg.somewhere.com"
82
+ sign_in_as_user remember_me: true
83
+ assert_nil request.cookies["remember_user_token"]
84
+ ensure
85
+ Rails.configuration.session_options.delete(:domain)
86
+ end
87
+ end
88
+
89
+ test 'remember the user before sign in' do
90
+ user = create_user_and_remember
91
+ get users_path
92
+ assert_response :success
93
+ assert warden.authenticated?(:user)
94
+ assert warden.user(:user) == user
95
+ assert_match /remember_user_token[^\n]*HttpOnly/, response.headers["Set-Cookie"], "Expected Set-Cookie header in response to set HttpOnly flag on remember_user_token cookie."
96
+ end
97
+
98
+ test 'remember the user before sign up and redirect them to their home' do
99
+ create_user_and_remember
100
+ get new_user_registration_path
101
+ assert warden.authenticated?(:user)
102
+ assert_redirected_to root_path
103
+ end
104
+
105
+ test 'does not extend remember period through sign in' do
106
+ swap Devise, extend_remember_period: true, remember_for: 1.year do
107
+ user = create_user
108
+ user.remember_me!
109
+
110
+ user.remember_created_at = old = 10.days.ago
111
+ user.save
112
+
113
+ sign_in_as_user remember_me: true
114
+ user.reload
115
+
116
+ assert warden.user(:user) == user
117
+ assert_equal old.to_i, user.remember_created_at.to_i
118
+ end
119
+ end
120
+
121
+ test 'do not remember other scopes' do
122
+ create_user_and_remember
123
+ get root_path
124
+ assert_response :success
125
+ assert warden.authenticated?(:user)
126
+ assert_not warden.authenticated?(:admin)
127
+ end
128
+
129
+ test 'do not remember with invalid token' do
130
+ create_user_and_remember('add')
131
+ get users_path
132
+ assert_not warden.authenticated?(:user)
133
+ assert_redirected_to new_user_session_path
134
+ end
135
+
136
+ test 'do not remember with expired token' do
137
+ create_user_and_remember
138
+ swap Devise, remember_for: 0 do
139
+ get users_path
140
+ assert_not warden.authenticated?(:user)
141
+ assert_redirected_to new_user_session_path
142
+ end
143
+ end
144
+
145
+ test 'do not remember the user anymore after forget' do
146
+ create_user_and_remember
147
+ get users_path
148
+ assert warden.authenticated?(:user)
149
+
150
+ get destroy_user_session_path
151
+ assert_not warden.authenticated?(:user)
152
+ assert_nil warden.cookies['remember_user_token']
153
+
154
+ get users_path
155
+ assert_not warden.authenticated?(:user)
156
+ end
157
+
158
+ test 'changing user password expires remember me token' do
159
+ user = create_user_and_remember
160
+ user.password = "another_password"
161
+ user.password_confirmation = "another_password"
162
+ user.save!
163
+
164
+ get users_path
165
+ assert_not warden.authenticated?(:user)
166
+ end
167
+
168
+ test 'valid sign in calls after_remembered callback' do
169
+ user = create_user_and_remember
170
+
171
+ User.expects(:serialize_from_cookie).returns user
172
+ user.expects :after_remembered
173
+
174
+ get new_user_registration_path
175
+ end
176
+ end