af-devise 2.1.2

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 (207) hide show
  1. data/.gitignore +10 -0
  2. data/.travis.yml +15 -0
  3. data/CHANGELOG.rdoc +885 -0
  4. data/CONTRIBUTING.md +14 -0
  5. data/Gemfile +29 -0
  6. data/Gemfile.lock +155 -0
  7. data/MIT-LICENSE +20 -0
  8. data/README.md +394 -0
  9. data/Rakefile +34 -0
  10. data/app/controllers/devise/confirmations_controller.rb +43 -0
  11. data/app/controllers/devise/omniauth_callbacks_controller.rb +30 -0
  12. data/app/controllers/devise/passwords_controller.rb +65 -0
  13. data/app/controllers/devise/registrations_controller.rb +119 -0
  14. data/app/controllers/devise/sessions_controller.rb +50 -0
  15. data/app/controllers/devise/unlocks_controller.rb +44 -0
  16. data/app/controllers/devise_controller.rb +184 -0
  17. data/app/helpers/devise_helper.rb +25 -0
  18. data/app/mailers/devise/mailer.rb +15 -0
  19. data/app/views/devise/_links.erb +3 -0
  20. data/app/views/devise/confirmations/new.html.erb +12 -0
  21. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  22. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  23. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  24. data/app/views/devise/passwords/edit.html.erb +16 -0
  25. data/app/views/devise/passwords/new.html.erb +12 -0
  26. data/app/views/devise/registrations/edit.html.erb +25 -0
  27. data/app/views/devise/registrations/new.html.erb +18 -0
  28. data/app/views/devise/sessions/new.html.erb +17 -0
  29. data/app/views/devise/shared/_links.erb +25 -0
  30. data/app/views/devise/unlocks/new.html.erb +12 -0
  31. data/config/locales/en.yml +59 -0
  32. data/devise.gemspec +25 -0
  33. data/gemfiles/Gemfile.rails-3.1.x +35 -0
  34. data/gemfiles/Gemfile.rails-3.1.x.lock +167 -0
  35. data/lib/devise.rb +444 -0
  36. data/lib/devise/controllers/helpers.rb +285 -0
  37. data/lib/devise/controllers/rememberable.rb +52 -0
  38. data/lib/devise/controllers/scoped_views.rb +17 -0
  39. data/lib/devise/controllers/url_helpers.rb +67 -0
  40. data/lib/devise/delegator.rb +16 -0
  41. data/lib/devise/failure_app.rb +187 -0
  42. data/lib/devise/hooks/activatable.rb +11 -0
  43. data/lib/devise/hooks/forgetable.rb +9 -0
  44. data/lib/devise/hooks/lockable.rb +7 -0
  45. data/lib/devise/hooks/rememberable.rb +6 -0
  46. data/lib/devise/hooks/timeoutable.rb +25 -0
  47. data/lib/devise/hooks/trackable.rb +9 -0
  48. data/lib/devise/mailers/helpers.rb +91 -0
  49. data/lib/devise/mapping.rb +172 -0
  50. data/lib/devise/models.rb +128 -0
  51. data/lib/devise/models/authenticatable.rb +268 -0
  52. data/lib/devise/models/confirmable.rb +270 -0
  53. data/lib/devise/models/database_authenticatable.rb +127 -0
  54. data/lib/devise/models/lockable.rb +193 -0
  55. data/lib/devise/models/omniauthable.rb +27 -0
  56. data/lib/devise/models/recoverable.rb +140 -0
  57. data/lib/devise/models/registerable.rb +25 -0
  58. data/lib/devise/models/rememberable.rb +125 -0
  59. data/lib/devise/models/timeoutable.rb +49 -0
  60. data/lib/devise/models/token_authenticatable.rb +89 -0
  61. data/lib/devise/models/trackable.rb +35 -0
  62. data/lib/devise/models/validatable.rb +66 -0
  63. data/lib/devise/modules.rb +29 -0
  64. data/lib/devise/omniauth.rb +28 -0
  65. data/lib/devise/omniauth/config.rb +45 -0
  66. data/lib/devise/omniauth/url_helpers.rb +18 -0
  67. data/lib/devise/orm/active_record.rb +3 -0
  68. data/lib/devise/orm/mongoid.rb +3 -0
  69. data/lib/devise/param_filter.rb +41 -0
  70. data/lib/devise/rails.rb +54 -0
  71. data/lib/devise/rails/routes.rb +446 -0
  72. data/lib/devise/rails/warden_compat.rb +43 -0
  73. data/lib/devise/strategies/authenticatable.rb +176 -0
  74. data/lib/devise/strategies/base.rb +20 -0
  75. data/lib/devise/strategies/database_authenticatable.rb +20 -0
  76. data/lib/devise/strategies/rememberable.rb +55 -0
  77. data/lib/devise/strategies/token_authenticatable.rb +56 -0
  78. data/lib/devise/test_helpers.rb +131 -0
  79. data/lib/devise/time_inflector.rb +14 -0
  80. data/lib/devise/version.rb +3 -0
  81. data/lib/generators/active_record/devise_generator.rb +79 -0
  82. data/lib/generators/active_record/templates/migration.rb +19 -0
  83. data/lib/generators/active_record/templates/migration_existing.rb +26 -0
  84. data/lib/generators/devise/devise_generator.rb +24 -0
  85. data/lib/generators/devise/install_generator.rb +24 -0
  86. data/lib/generators/devise/orm_helpers.rb +32 -0
  87. data/lib/generators/devise/views_generator.rb +116 -0
  88. data/lib/generators/mongoid/devise_generator.rb +57 -0
  89. data/lib/generators/templates/README +35 -0
  90. data/lib/generators/templates/devise.rb +240 -0
  91. data/lib/generators/templates/markerb/confirmation_instructions.markerb +5 -0
  92. data/lib/generators/templates/markerb/reset_password_instructions.markerb +8 -0
  93. data/lib/generators/templates/markerb/unlock_instructions.markerb +7 -0
  94. data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +15 -0
  95. data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +19 -0
  96. data/lib/generators/templates/simple_form_for/passwords/new.html.erb +15 -0
  97. data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +22 -0
  98. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +17 -0
  99. data/lib/generators/templates/simple_form_for/sessions/new.html.erb +15 -0
  100. data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +15 -0
  101. data/test/controllers/custom_strategy_test.rb +62 -0
  102. data/test/controllers/helpers_test.rb +253 -0
  103. data/test/controllers/internal_helpers_test.rb +110 -0
  104. data/test/controllers/sessions_controller_test.rb +85 -0
  105. data/test/controllers/url_helpers_test.rb +59 -0
  106. data/test/delegator_test.rb +19 -0
  107. data/test/devise_test.rb +72 -0
  108. data/test/failure_app_test.rb +221 -0
  109. data/test/generators/active_record_generator_test.rb +75 -0
  110. data/test/generators/devise_generator_test.rb +39 -0
  111. data/test/generators/install_generator_test.rb +13 -0
  112. data/test/generators/mongoid_generator_test.rb +23 -0
  113. data/test/generators/views_generator_test.rb +52 -0
  114. data/test/helpers/devise_helper_test.rb +51 -0
  115. data/test/integration/authenticatable_test.rb +633 -0
  116. data/test/integration/confirmable_test.rb +298 -0
  117. data/test/integration/database_authenticatable_test.rb +82 -0
  118. data/test/integration/http_authenticatable_test.rb +97 -0
  119. data/test/integration/lockable_test.rb +242 -0
  120. data/test/integration/omniauthable_test.rb +133 -0
  121. data/test/integration/recoverable_test.rb +334 -0
  122. data/test/integration/registerable_test.rb +345 -0
  123. data/test/integration/rememberable_test.rb +158 -0
  124. data/test/integration/timeoutable_test.rb +140 -0
  125. data/test/integration/token_authenticatable_test.rb +161 -0
  126. data/test/integration/trackable_test.rb +92 -0
  127. data/test/mailers/confirmation_instructions_test.rb +102 -0
  128. data/test/mailers/reset_password_instructions_test.rb +83 -0
  129. data/test/mailers/unlock_instructions_test.rb +77 -0
  130. data/test/mapping_test.rb +127 -0
  131. data/test/models/authenticatable_test.rb +7 -0
  132. data/test/models/confirmable_test.rb +391 -0
  133. data/test/models/database_authenticatable_test.rb +196 -0
  134. data/test/models/lockable_test.rb +273 -0
  135. data/test/models/omniauthable_test.rb +7 -0
  136. data/test/models/recoverable_test.rb +205 -0
  137. data/test/models/registerable_test.rb +7 -0
  138. data/test/models/rememberable_test.rb +174 -0
  139. data/test/models/serializable_test.rb +49 -0
  140. data/test/models/timeoutable_test.rb +46 -0
  141. data/test/models/token_authenticatable_test.rb +55 -0
  142. data/test/models/trackable_test.rb +13 -0
  143. data/test/models/validatable_test.rb +117 -0
  144. data/test/models_test.rb +179 -0
  145. data/test/omniauth/config_test.rb +57 -0
  146. data/test/omniauth/url_helpers_test.rb +51 -0
  147. data/test/orm/active_record.rb +9 -0
  148. data/test/orm/mongoid.rb +13 -0
  149. data/test/rails_app/Rakefile +10 -0
  150. data/test/rails_app/app/active_record/admin.rb +6 -0
  151. data/test/rails_app/app/active_record/shim.rb +2 -0
  152. data/test/rails_app/app/active_record/user.rb +6 -0
  153. data/test/rails_app/app/controllers/admins/sessions_controller.rb +6 -0
  154. data/test/rails_app/app/controllers/admins_controller.rb +11 -0
  155. data/test/rails_app/app/controllers/application_controller.rb +8 -0
  156. data/test/rails_app/app/controllers/home_controller.rb +25 -0
  157. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +2 -0
  158. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +2 -0
  159. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +14 -0
  160. data/test/rails_app/app/controllers/users_controller.rb +23 -0
  161. data/test/rails_app/app/helpers/application_helper.rb +3 -0
  162. data/test/rails_app/app/mailers/users/mailer.rb +8 -0
  163. data/test/rails_app/app/mongoid/admin.rb +29 -0
  164. data/test/rails_app/app/mongoid/shim.rb +24 -0
  165. data/test/rails_app/app/mongoid/user.rb +42 -0
  166. data/test/rails_app/app/views/admins/index.html.erb +1 -0
  167. data/test/rails_app/app/views/admins/sessions/new.html.erb +2 -0
  168. data/test/rails_app/app/views/home/admin_dashboard.html.erb +1 -0
  169. data/test/rails_app/app/views/home/index.html.erb +1 -0
  170. data/test/rails_app/app/views/home/join.html.erb +1 -0
  171. data/test/rails_app/app/views/home/private.html.erb +1 -0
  172. data/test/rails_app/app/views/home/user_dashboard.html.erb +1 -0
  173. data/test/rails_app/app/views/layouts/application.html.erb +24 -0
  174. data/test/rails_app/app/views/users/index.html.erb +1 -0
  175. data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +1 -0
  176. data/test/rails_app/app/views/users/sessions/new.html.erb +1 -0
  177. data/test/rails_app/config.ru +4 -0
  178. data/test/rails_app/config/application.rb +41 -0
  179. data/test/rails_app/config/boot.rb +8 -0
  180. data/test/rails_app/config/database.yml +18 -0
  181. data/test/rails_app/config/environment.rb +5 -0
  182. data/test/rails_app/config/environments/development.rb +18 -0
  183. data/test/rails_app/config/environments/production.rb +33 -0
  184. data/test/rails_app/config/environments/test.rb +33 -0
  185. data/test/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  186. data/test/rails_app/config/initializers/devise.rb +178 -0
  187. data/test/rails_app/config/initializers/inflections.rb +2 -0
  188. data/test/rails_app/config/initializers/secret_token.rb +2 -0
  189. data/test/rails_app/config/routes.rb +100 -0
  190. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +74 -0
  191. data/test/rails_app/db/schema.rb +52 -0
  192. data/test/rails_app/lib/shared_admin.rb +14 -0
  193. data/test/rails_app/lib/shared_user.rb +26 -0
  194. data/test/rails_app/public/404.html +26 -0
  195. data/test/rails_app/public/422.html +26 -0
  196. data/test/rails_app/public/500.html +26 -0
  197. data/test/rails_app/public/favicon.ico +0 -0
  198. data/test/rails_app/script/rails +10 -0
  199. data/test/routes_test.rb +248 -0
  200. data/test/support/assertions.rb +40 -0
  201. data/test/support/helpers.rb +91 -0
  202. data/test/support/integration.rb +92 -0
  203. data/test/support/locale/en.yml +4 -0
  204. data/test/support/webrat/integrations/rails.rb +24 -0
  205. data/test/test_helper.rb +27 -0
  206. data/test/test_helpers_test.rb +151 -0
  207. metadata +421 -0
@@ -0,0 +1,83 @@
1
+ require 'test_helper'
2
+
3
+ class ResetPasswordInstructionsTest < ActionMailer::TestCase
4
+
5
+ def setup
6
+ setup_mailer
7
+ Devise.mailer = 'Devise::Mailer'
8
+ Devise.mailer_sender = 'test@example.com'
9
+ end
10
+
11
+ def teardown
12
+ Devise.mailer = 'Devise::Mailer'
13
+ Devise.mailer_sender = 'please-change-me@config-initializers-devise.com'
14
+ end
15
+
16
+ def user
17
+ @user ||= begin
18
+ user = create_user
19
+ user.send_reset_password_instructions
20
+ user
21
+ end
22
+ end
23
+
24
+ def mail
25
+ @mail ||= begin
26
+ user
27
+ ActionMailer::Base.deliveries.last
28
+ end
29
+ end
30
+
31
+ test 'email sent after reseting the user password' do
32
+ assert_not_nil mail
33
+ end
34
+
35
+ test 'content type should be set to html' do
36
+ assert mail.content_type.include?('text/html')
37
+ end
38
+
39
+ test 'send confirmation instructions to the user email' do
40
+ assert_equal [user.email], mail.to
41
+ end
42
+
43
+ test 'setup sender from configuration' do
44
+ assert_equal ['test@example.com'], mail.from
45
+ end
46
+
47
+ test 'setup sender from custom mailer defaults' do
48
+ Devise.mailer = 'Users::Mailer'
49
+ assert_equal ['custom@example.com'], mail.from
50
+ end
51
+
52
+ test 'setup reply to as copy from sender' do
53
+ assert_equal ['test@example.com'], mail.reply_to
54
+ end
55
+
56
+ test 'setup subject from I18n' do
57
+ store_translations :en, :devise => { :mailer => { :reset_password_instructions => { :subject => 'Reset instructions' } } } do
58
+ assert_equal 'Reset instructions', mail.subject
59
+ end
60
+ end
61
+
62
+ test 'subject namespaced by model' do
63
+ store_translations :en, :devise => { :mailer => { :reset_password_instructions => { :user_subject => 'User Reset Instructions' } } } do
64
+ assert_equal 'User Reset Instructions', mail.subject
65
+ end
66
+ end
67
+
68
+ test 'body should have user info' do
69
+ assert_match(/#{user.email}/, mail.body.encoded)
70
+ end
71
+
72
+ test 'body should have link to confirm the account' do
73
+ host = ActionMailer::Base.default_url_options[:host]
74
+ reset_url_regexp = %r{<a href=\"http://#{host}/users/password/edit\?reset_password_token=#{user.reset_password_token}">}
75
+ assert_match reset_url_regexp, mail.body.encoded
76
+ end
77
+
78
+ test 'mailer sender accepts a proc' do
79
+ swap Devise, :mailer_sender => proc { "another@example.com" } do
80
+ assert_equal ['another@example.com'], mail.from
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,77 @@
1
+ require 'test_helper'
2
+
3
+ class UnlockInstructionsTest < ActionMailer::TestCase
4
+
5
+ def setup
6
+ setup_mailer
7
+ Devise.mailer = 'Devise::Mailer'
8
+ Devise.mailer_sender = 'test@example.com'
9
+ end
10
+
11
+ def teardown
12
+ Devise.mailer = 'Devise::Mailer'
13
+ Devise.mailer_sender = 'please-change-me@config-initializers-devise.com'
14
+ end
15
+
16
+ def user
17
+ @user ||= begin
18
+ user = create_user
19
+ user.lock_access!
20
+ user
21
+ end
22
+ end
23
+
24
+ def mail
25
+ @mail ||= begin
26
+ user
27
+ ActionMailer::Base.deliveries.last
28
+ end
29
+ end
30
+
31
+ test 'email sent after locking the user' do
32
+ assert_not_nil mail
33
+ end
34
+
35
+ test 'content type should be set to html' do
36
+ assert mail.content_type.include?('text/html')
37
+ end
38
+
39
+ test 'send unlock instructions to the user email' do
40
+ assert_equal [user.email], mail.to
41
+ end
42
+
43
+ test 'setup sender from configuration' do
44
+ assert_equal ['test@example.com'], mail.from
45
+ end
46
+
47
+ test 'setup sender from custom mailer defaults' do
48
+ Devise.mailer = 'Users::Mailer'
49
+ assert_equal ['custom@example.com'], mail.from
50
+ end
51
+
52
+ test 'setup reply to as copy from sender' do
53
+ assert_equal ['test@example.com'], mail.reply_to
54
+ end
55
+
56
+ test 'setup subject from I18n' do
57
+ store_translations :en, :devise => { :mailer => { :unlock_instructions => { :subject => 'Yo unlock instructions' } } } do
58
+ assert_equal 'Yo unlock instructions', mail.subject
59
+ end
60
+ end
61
+
62
+ test 'subject namespaced by model' do
63
+ store_translations :en, :devise => { :mailer => { :unlock_instructions => { :user_subject => 'User Unlock Instructions' } } } do
64
+ assert_equal 'User Unlock Instructions', mail.subject
65
+ end
66
+ end
67
+
68
+ test 'body should have user info' do
69
+ assert_match(/#{user.email}/, mail.body.encoded)
70
+ end
71
+
72
+ test 'body should have link to unlock the account' do
73
+ host = ActionMailer::Base.default_url_options[:host]
74
+ unlock_url_regexp = %r{<a href=\"http://#{host}/users/unlock\?unlock_token=#{user.unlock_token}">}
75
+ assert_match unlock_url_regexp, mail.body.encoded
76
+ end
77
+ end
@@ -0,0 +1,127 @@
1
+ require 'test_helper'
2
+
3
+ class FakeRequest < Struct.new(:path_info, :params)
4
+ end
5
+
6
+ class MappingTest < ActiveSupport::TestCase
7
+ def fake_request(path, params={})
8
+ FakeRequest.new(path, params)
9
+ end
10
+
11
+ test 'store options' do
12
+ mapping = Devise.mappings[:user]
13
+ assert_equal User, mapping.to
14
+ assert_equal User.devise_modules, mapping.modules
15
+ assert_equal "users", mapping.scoped_path
16
+ assert_equal :user, mapping.singular
17
+ assert_equal "users", mapping.path
18
+ assert_equal "/users", mapping.fullpath
19
+ end
20
+
21
+ test 'store options with namespace' do
22
+ mapping = Devise.mappings[:publisher_account]
23
+ assert_equal Admin, mapping.to
24
+ assert_equal "publisher/accounts", mapping.scoped_path
25
+ assert_equal :publisher_account, mapping.singular
26
+ assert_equal "accounts", mapping.path
27
+ assert_equal "/publisher/accounts", mapping.fullpath
28
+ end
29
+
30
+ test 'allows path to be given' do
31
+ assert_equal "admin_area", Devise.mappings[:admin].path
32
+ end
33
+
34
+ test 'allows to skip all routes' do
35
+ assert_equal [], Devise.mappings[:skip_admin].used_routes
36
+ end
37
+
38
+ test 'sign_out_via defaults to :get' do
39
+ assert_equal :get, Devise.mappings[:user].sign_out_via
40
+ end
41
+
42
+ test 'allows custom sign_out_via to be given' do
43
+ assert_equal :delete, Devise.mappings[:sign_out_via_delete].sign_out_via
44
+ assert_equal :post, Devise.mappings[:sign_out_via_post].sign_out_via
45
+ assert_equal [:delete, :post], Devise.mappings[:sign_out_via_delete_or_post].sign_out_via
46
+ end
47
+
48
+ test 'allows custom singular to be given' do
49
+ assert_equal "accounts", Devise.mappings[:manager].path
50
+ end
51
+
52
+ test 'has strategies depending on the model declaration' do
53
+ assert_equal [:rememberable, :token_authenticatable, :database_authenticatable], Devise.mappings[:user].strategies
54
+ assert_equal [:database_authenticatable], Devise.mappings[:admin].strategies
55
+ end
56
+
57
+ test 'has no input strategies depending on the model declaration' do
58
+ assert_equal [:rememberable, :token_authenticatable], Devise.mappings[:user].no_input_strategies
59
+ assert_equal [], Devise.mappings[:admin].no_input_strategies
60
+ end
61
+
62
+ test 'find scope for a given object' do
63
+ assert_equal :user, Devise::Mapping.find_scope!(User)
64
+ assert_equal :user, Devise::Mapping.find_scope!(:user)
65
+ assert_equal :user, Devise::Mapping.find_scope!(User.new)
66
+ end
67
+
68
+ test 'find scope works with single table inheritance' do
69
+ assert_equal :user, Devise::Mapping.find_scope!(Class.new(User))
70
+ assert_equal :user, Devise::Mapping.find_scope!(Class.new(User).new)
71
+ end
72
+
73
+ test 'find scope raises an error if cannot be found' do
74
+ assert_raise RuntimeError do
75
+ Devise::Mapping.find_scope!(String)
76
+ end
77
+ end
78
+
79
+ test 'return default path names' do
80
+ mapping = Devise.mappings[:user]
81
+ assert_equal 'sign_in', mapping.path_names[:sign_in]
82
+ assert_equal 'sign_out', mapping.path_names[:sign_out]
83
+ assert_equal 'password', mapping.path_names[:password]
84
+ assert_equal 'confirmation', mapping.path_names[:confirmation]
85
+ assert_equal 'sign_up', mapping.path_names[:sign_up]
86
+ assert_equal 'unlock', mapping.path_names[:unlock]
87
+ end
88
+
89
+ test 'allow custom path names to be given' do
90
+ mapping = Devise.mappings[:manager]
91
+ assert_equal 'login', mapping.path_names[:sign_in]
92
+ assert_equal 'logout', mapping.path_names[:sign_out]
93
+ assert_equal 'secret', mapping.path_names[:password]
94
+ assert_equal 'verification', mapping.path_names[:confirmation]
95
+ assert_equal 'register', mapping.path_names[:sign_up]
96
+ assert_equal 'unblock', mapping.path_names[:unlock]
97
+ end
98
+
99
+ test 'magic predicates' do
100
+ mapping = Devise.mappings[:user]
101
+ assert mapping.authenticatable?
102
+ assert mapping.confirmable?
103
+ assert mapping.recoverable?
104
+ assert mapping.rememberable?
105
+ assert mapping.registerable?
106
+
107
+ mapping = Devise.mappings[:admin]
108
+ assert mapping.authenticatable?
109
+ assert mapping.recoverable?
110
+ assert mapping.lockable?
111
+ assert_not mapping.omniauthable?
112
+ end
113
+
114
+ test 'find mapping by path' do
115
+ assert_raise RuntimeError do
116
+ Devise::Mapping.find_by_path!('/accounts/facebook/callback')
117
+ end
118
+
119
+ assert_nothing_raised do
120
+ Devise::Mapping.find_by_path!('/:locale/accounts/login')
121
+ end
122
+
123
+ assert_nothing_raised do
124
+ Devise::Mapping.find_by_path!('/accounts/facebook/callback', :path)
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ class AuthenticatableTest < ActiveSupport::TestCase
4
+ test 'required_fields should be an empty array' do
5
+ assert_equal Devise::Models::Validatable.required_fields(User), []
6
+ end
7
+ end
@@ -0,0 +1,391 @@
1
+ require 'test_helper'
2
+
3
+ class ConfirmableTest < ActiveSupport::TestCase
4
+
5
+ def setup
6
+ setup_mailer
7
+ end
8
+
9
+ test 'should generate confirmation token after creating a record' do
10
+ assert_nil new_user.confirmation_token
11
+ assert_not_nil create_user.confirmation_token
12
+ end
13
+
14
+ test 'should never generate the same confirmation token for different users' do
15
+ confirmation_tokens = []
16
+ 3.times do
17
+ token = create_user.confirmation_token
18
+ assert !confirmation_tokens.include?(token)
19
+ confirmation_tokens << token
20
+ end
21
+ end
22
+
23
+ test 'should confirm a user by updating confirmed at' do
24
+ user = create_user
25
+ assert_nil user.confirmed_at
26
+ assert user.confirm!
27
+ assert_not_nil user.confirmed_at
28
+ end
29
+
30
+ test 'should clear confirmation token while confirming a user' do
31
+ user = create_user
32
+ assert_present user.confirmation_token
33
+ user.confirm!
34
+ assert_nil user.confirmation_token
35
+ end
36
+
37
+ test 'should verify whether a user is confirmed or not' do
38
+ assert_not new_user.confirmed?
39
+ user = create_user
40
+ assert_not user.confirmed?
41
+ user.confirm!
42
+ assert user.confirmed?
43
+ end
44
+
45
+ test 'should not confirm a user already confirmed' do
46
+ user = create_user
47
+ assert user.confirm!
48
+ assert_blank user.errors[:email]
49
+
50
+ assert_not user.confirm!
51
+ assert_equal "was already confirmed, please try signing in", user.errors[:email].join
52
+ end
53
+
54
+ test 'should find and confirm a user automatically' do
55
+ user = create_user
56
+ confirmed_user = User.confirm_by_token(user.confirmation_token)
57
+ assert_equal confirmed_user, user
58
+ assert user.reload.confirmed?
59
+ end
60
+
61
+ test 'should return a new record with errors when a invalid token is given' do
62
+ confirmed_user = User.confirm_by_token('invalid_confirmation_token')
63
+ assert_not confirmed_user.persisted?
64
+ assert_equal "is invalid", confirmed_user.errors[:confirmation_token].join
65
+ end
66
+
67
+ test 'should return a new record with errors when a blank token is given' do
68
+ confirmed_user = User.confirm_by_token('')
69
+ assert_not confirmed_user.persisted?
70
+ assert_equal "can't be blank", confirmed_user.errors[:confirmation_token].join
71
+ end
72
+
73
+ test 'should generate errors for a user email if user is already confirmed' do
74
+ user = create_user
75
+ user.confirmed_at = Time.now
76
+ user.save
77
+ confirmed_user = User.confirm_by_token(user.confirmation_token)
78
+ assert confirmed_user.confirmed?
79
+ assert_equal "was already confirmed, please try signing in", confirmed_user.errors[:email].join
80
+ end
81
+
82
+ test 'should send confirmation instructions by email' do
83
+ assert_email_sent "mynewuser@example.com" do
84
+ create_user :email => "mynewuser@example.com"
85
+ end
86
+ end
87
+
88
+ test 'should not send confirmation when trying to save an invalid user' do
89
+ assert_email_not_sent do
90
+ user = new_user
91
+ user.stubs(:valid?).returns(false)
92
+ user.save
93
+ end
94
+ end
95
+
96
+ test 'should not generate a new token neither send e-mail if skip_confirmation! is invoked' do
97
+ user = new_user
98
+ user.skip_confirmation!
99
+
100
+ assert_email_not_sent do
101
+ user.save!
102
+ assert_nil user.confirmation_token
103
+ assert_not_nil user.confirmed_at
104
+ end
105
+ end
106
+
107
+ test 'should find a user to send confirmation instructions' do
108
+ user = create_user
109
+ confirmation_user = User.send_confirmation_instructions(:email => user.email)
110
+ assert_equal confirmation_user, user
111
+ end
112
+
113
+ test 'should return a new user if no email was found' do
114
+ confirmation_user = User.send_confirmation_instructions(:email => "invalid@example.com")
115
+ assert_not confirmation_user.persisted?
116
+ end
117
+
118
+ test 'should add error to new user email if no email was found' do
119
+ confirmation_user = User.send_confirmation_instructions(:email => "invalid@example.com")
120
+ assert confirmation_user.errors[:email]
121
+ assert_equal "not found", confirmation_user.errors[:email].join
122
+ end
123
+
124
+ test 'should send email instructions for the user confirm its email' do
125
+ user = create_user
126
+ assert_email_sent user.email do
127
+ User.send_confirmation_instructions(:email => user.email)
128
+ end
129
+ end
130
+
131
+ test 'should always have confirmation token when email is sent' do
132
+ user = new_user
133
+ user.instance_eval { def confirmation_required?; false end }
134
+ user.save
135
+ user.send_confirmation_instructions
136
+ assert_not_nil user.reload.confirmation_token
137
+ end
138
+
139
+ test 'should not resend email instructions if the user change his email' do
140
+ user = create_user
141
+ user.email = 'new_test@example.com'
142
+ assert_email_not_sent do
143
+ user.save!
144
+ end
145
+ end
146
+
147
+ test 'should not reset confirmation status or token when updating email' do
148
+ user = create_user
149
+ user.confirm!
150
+ user.email = 'new_test@example.com'
151
+ user.save!
152
+
153
+ user.reload
154
+ assert user.confirmed?
155
+ assert_nil user.confirmation_token
156
+ end
157
+
158
+ test 'should not be able to send instructions if the user is already confirmed' do
159
+ user = create_user
160
+ user.confirm!
161
+ assert_not user.resend_confirmation_token
162
+ assert user.confirmed?
163
+ assert_equal 'was already confirmed, please try signing in', user.errors[:email].join
164
+ end
165
+
166
+ test 'confirm time should fallback to devise confirm in default configuration' do
167
+ swap Devise, :allow_unconfirmed_access_for => 1.day do
168
+ user = new_user
169
+ user.confirmation_sent_at = 2.days.ago
170
+ assert_not user.active_for_authentication?
171
+
172
+ Devise.allow_unconfirmed_access_for = 3.days
173
+ assert user.active_for_authentication?
174
+ end
175
+ end
176
+
177
+ test 'should be active when confirmation sent at is not overpast' do
178
+ swap Devise, :allow_unconfirmed_access_for => 5.days do
179
+ Devise.allow_unconfirmed_access_for = 5.days
180
+ user = create_user
181
+
182
+ user.confirmation_sent_at = 4.days.ago
183
+ assert user.active_for_authentication?
184
+
185
+ user.confirmation_sent_at = 5.days.ago
186
+ assert_not user.active_for_authentication?
187
+ end
188
+ end
189
+
190
+ test 'should be active when already confirmed' do
191
+ user = create_user
192
+ assert_not user.confirmed?
193
+ assert_not user.active_for_authentication?
194
+
195
+ user.confirm!
196
+ assert user.confirmed?
197
+ assert user.active_for_authentication?
198
+ end
199
+
200
+ test 'should not be active when confirm in is zero' do
201
+ Devise.allow_unconfirmed_access_for = 0.days
202
+ user = create_user
203
+ user.confirmation_sent_at = Date.today
204
+ assert_not user.active_for_authentication?
205
+ end
206
+
207
+ test 'should not be active without confirmation' do
208
+ user = create_user
209
+ user.confirmation_sent_at = nil
210
+ user.save
211
+ assert_not user.reload.active_for_authentication?
212
+ end
213
+
214
+ test 'should be active without confirmation when confirmation is not required' do
215
+ user = create_user
216
+ user.instance_eval { def confirmation_required?; false end }
217
+ user.confirmation_sent_at = nil
218
+ user.save
219
+ assert user.reload.active_for_authentication?
220
+ end
221
+
222
+ test 'should find a user to send email instructions for the user confirm its email by authentication_keys' do
223
+ swap Devise, :authentication_keys => [:username, :email] do
224
+ user = create_user
225
+ confirm_user = User.send_confirmation_instructions(:email => user.email, :username => user.username)
226
+ assert_equal confirm_user, user
227
+ end
228
+ end
229
+
230
+ test 'should require all confirmation_keys' do
231
+ swap Devise, :confirmation_keys => [:username, :email] do
232
+ user = create_user
233
+ confirm_user = User.send_confirmation_instructions(:email => user.email)
234
+ assert_not confirm_user.persisted?
235
+ assert_equal "can't be blank", confirm_user.errors[:username].join
236
+ end
237
+ end
238
+
239
+ def confirm_user_by_token_with_confirmation_sent_at(confirmation_sent_at)
240
+ user = create_user
241
+ user.update_attribute(:confirmation_sent_at, confirmation_sent_at)
242
+ confirmed_user = User.confirm_by_token(user.confirmation_token)
243
+ assert_equal confirmed_user, user
244
+ user.reload.confirmed?
245
+ end
246
+
247
+ test 'should accept confirmation email token even after 5 years when no expiration is set' do
248
+ assert confirm_user_by_token_with_confirmation_sent_at(5.years.ago)
249
+ end
250
+
251
+ test 'should accept confirmation email token after 2 days when expiration is set to 3 days' do
252
+ swap Devise, :confirm_within => 3.days do
253
+ assert confirm_user_by_token_with_confirmation_sent_at(2.days.ago)
254
+ end
255
+ end
256
+
257
+ test 'should not accept confirmation email token after 4 days when expiration is set to 3 days' do
258
+ swap Devise, :confirm_within => 3.days do
259
+ assert_not confirm_user_by_token_with_confirmation_sent_at(4.days.ago)
260
+ end
261
+ end
262
+
263
+ test 'should generate a new token if the previous one has expired' do
264
+ swap Devise, :confirm_within => 3.days do
265
+ user = create_user
266
+ user.update_attribute(:confirmation_sent_at, 4.days.ago)
267
+ old = user.confirmation_token
268
+ user.resend_confirmation_token
269
+ assert_not_equal user.confirmation_token, old
270
+ end
271
+ end
272
+ end
273
+
274
+ class ReconfirmableTest < ActiveSupport::TestCase
275
+ test 'should not worry about validations on confirm even with reconfirmable' do
276
+ admin = create_admin
277
+ admin.reset_password_token = "a"
278
+ assert admin.confirm!
279
+ end
280
+
281
+ test 'should generate confirmation token after changing email' do
282
+ admin = create_admin
283
+ assert admin.confirm!
284
+ assert_nil admin.confirmation_token
285
+ assert admin.update_attributes(:email => 'new_test@example.com')
286
+ assert_not_nil admin.confirmation_token
287
+ end
288
+
289
+ test 'should not generate confirmation token if skipping reconfirmation after changing email' do
290
+ admin = create_admin
291
+ assert admin.confirm!
292
+ admin.skip_reconfirmation!
293
+ assert admin.update_attributes(:email => 'new_test@example.com')
294
+ assert_nil admin.confirmation_token
295
+ end
296
+
297
+
298
+ test 'should regenerate confirmation token after changing email' do
299
+ admin = create_admin
300
+ assert admin.confirm!
301
+ assert admin.update_attributes(:email => 'old_test@example.com')
302
+ token = admin.confirmation_token
303
+ assert admin.update_attributes(:email => 'new_test@example.com')
304
+ assert_not_equal token, admin.confirmation_token
305
+ end
306
+
307
+ test 'should send confirmation instructions by email after changing email' do
308
+ admin = create_admin
309
+ assert admin.confirm!
310
+ assert_email_sent "new_test@example.com" do
311
+ assert admin.update_attributes(:email => 'new_test@example.com')
312
+ end
313
+ end
314
+
315
+ test 'should not send confirmation by email after changing password' do
316
+ admin = create_admin
317
+ assert admin.confirm!
318
+ assert_email_not_sent do
319
+ assert admin.update_attributes(:password => 'newpass', :password_confirmation => 'newpass')
320
+ end
321
+ end
322
+
323
+ test 'should stay confirmed when email is changed' do
324
+ admin = create_admin
325
+ assert admin.confirm!
326
+ assert admin.update_attributes(:email => 'new_test@example.com')
327
+ assert admin.confirmed?
328
+ end
329
+
330
+ test 'should update email only when it is confirmed' do
331
+ admin = create_admin
332
+ assert admin.confirm!
333
+ assert admin.update_attributes(:email => 'new_test@example.com')
334
+ assert_not_equal 'new_test@example.com', admin.email
335
+ assert admin.confirm!
336
+ assert_equal 'new_test@example.com', admin.email
337
+ end
338
+
339
+ test 'should not allow admin to get past confirmation email by resubmitting their new address' do
340
+ admin = create_admin
341
+ assert admin.confirm!
342
+ assert admin.update_attributes(:email => 'new_test@example.com')
343
+ assert_not_equal 'new_test@example.com', admin.email
344
+ assert admin.update_attributes(:email => 'new_test@example.com')
345
+ assert_not_equal 'new_test@example.com', admin.email
346
+ end
347
+
348
+ test 'should find a admin by send confirmation instructions with unconfirmed_email' do
349
+ admin = create_admin
350
+ assert admin.confirm!
351
+ assert admin.update_attributes(:email => 'new_test@example.com')
352
+ confirmation_admin = Admin.send_confirmation_instructions(:email => admin.unconfirmed_email)
353
+ assert_equal confirmation_admin, admin
354
+ end
355
+
356
+ test 'should return a new admin if no email or unconfirmed_email was found' do
357
+ confirmation_admin = Admin.send_confirmation_instructions(:email => "invalid@email.com")
358
+ assert_not confirmation_admin.persisted?
359
+ end
360
+
361
+ test 'should add error to new admin email if no email or unconfirmed_email was found' do
362
+ confirmation_admin = Admin.send_confirmation_instructions(:email => "invalid@email.com")
363
+ assert confirmation_admin.errors[:email]
364
+ assert_equal "not found", confirmation_admin.errors[:email].join
365
+ end
366
+
367
+ test 'should find admin with email in unconfirmed_emails' do
368
+ admin = create_admin
369
+ admin.unconfirmed_email = "new_test@email.com"
370
+ assert admin.save
371
+ admin = Admin.find_by_unconfirmed_email_with_errors(:email => "new_test@email.com")
372
+ assert admin.persisted?
373
+ end
374
+
375
+ test 'required_fields should contain the fields that Devise uses' do
376
+ assert_same_content Devise::Models::Confirmable.required_fields(User), [
377
+ :confirmation_sent_at,
378
+ :confirmation_token,
379
+ :confirmed_at
380
+ ]
381
+ end
382
+
383
+ test 'required_fields should also contain unconfirmable when reconfirmable_email is true' do
384
+ assert_same_content Devise::Models::Confirmable.required_fields(Admin), [
385
+ :confirmation_sent_at,
386
+ :confirmation_token,
387
+ :confirmed_at,
388
+ :unconfirmed_email
389
+ ]
390
+ end
391
+ end