namxam-devise 1.1.0.win

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 (152) hide show
  1. data/CHANGELOG.rdoc +455 -0
  2. data/Gemfile +23 -0
  3. data/Gemfile.lock +118 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.rdoc +311 -0
  6. data/Rakefile +55 -0
  7. data/TODO +3 -0
  8. data/app/controllers/devise/confirmations_controller.rb +33 -0
  9. data/app/controllers/devise/passwords_controller.rb +41 -0
  10. data/app/controllers/devise/registrations_controller.rb +57 -0
  11. data/app/controllers/devise/sessions_controller.rb +23 -0
  12. data/app/controllers/devise/unlocks_controller.rb +34 -0
  13. data/app/helpers/devise_helper.rb +17 -0
  14. data/app/mailers/devise/mailer.rb +71 -0
  15. data/app/views/devise/confirmations/new.html.erb +12 -0
  16. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  17. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  18. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  19. data/app/views/devise/passwords/edit.html.erb +16 -0
  20. data/app/views/devise/passwords/new.html.erb +12 -0
  21. data/app/views/devise/registrations/edit.html.erb +25 -0
  22. data/app/views/devise/registrations/new.html.erb +18 -0
  23. data/app/views/devise/sessions/new.html.erb +17 -0
  24. data/app/views/devise/shared/_links.erb +19 -0
  25. data/app/views/devise/unlocks/new.html.erb +12 -0
  26. data/config/locales/en.yml +39 -0
  27. data/lib/devise.rb +290 -0
  28. data/lib/devise/controllers/helpers.rb +231 -0
  29. data/lib/devise/controllers/internal_helpers.rb +98 -0
  30. data/lib/devise/controllers/scoped_views.rb +35 -0
  31. data/lib/devise/controllers/url_helpers.rb +41 -0
  32. data/lib/devise/encryptors/authlogic_sha512.rb +19 -0
  33. data/lib/devise/encryptors/base.rb +20 -0
  34. data/lib/devise/encryptors/bcrypt.rb +19 -0
  35. data/lib/devise/encryptors/clearance_sha1.rb +17 -0
  36. data/lib/devise/encryptors/restful_authentication_sha1.rb +22 -0
  37. data/lib/devise/encryptors/sha1.rb +25 -0
  38. data/lib/devise/encryptors/sha512.rb +25 -0
  39. data/lib/devise/failure_app.rb +107 -0
  40. data/lib/devise/hooks/activatable.rb +11 -0
  41. data/lib/devise/hooks/forgetable.rb +11 -0
  42. data/lib/devise/hooks/rememberable.rb +35 -0
  43. data/lib/devise/hooks/timeoutable.rb +22 -0
  44. data/lib/devise/hooks/trackable.rb +9 -0
  45. data/lib/devise/mapping.rb +103 -0
  46. data/lib/devise/models.rb +80 -0
  47. data/lib/devise/models/authenticatable.rb +126 -0
  48. data/lib/devise/models/confirmable.rb +164 -0
  49. data/lib/devise/models/database_authenticatable.rb +110 -0
  50. data/lib/devise/models/lockable.rb +165 -0
  51. data/lib/devise/models/recoverable.rb +81 -0
  52. data/lib/devise/models/registerable.rb +8 -0
  53. data/lib/devise/models/rememberable.rb +104 -0
  54. data/lib/devise/models/timeoutable.rb +26 -0
  55. data/lib/devise/models/token_authenticatable.rb +60 -0
  56. data/lib/devise/models/trackable.rb +30 -0
  57. data/lib/devise/models/validatable.rb +53 -0
  58. data/lib/devise/modules.rb +23 -0
  59. data/lib/devise/orm/active_record.rb +36 -0
  60. data/lib/devise/orm/mongoid.rb +29 -0
  61. data/lib/devise/path_checker.rb +18 -0
  62. data/lib/devise/rails.rb +69 -0
  63. data/lib/devise/rails/routes.rb +248 -0
  64. data/lib/devise/rails/warden_compat.rb +39 -0
  65. data/lib/devise/schema.rb +97 -0
  66. data/lib/devise/strategies/authenticatable.rb +111 -0
  67. data/lib/devise/strategies/base.rb +33 -0
  68. data/lib/devise/strategies/database_authenticatable.rb +21 -0
  69. data/lib/devise/strategies/rememberable.rb +43 -0
  70. data/lib/devise/strategies/token_authenticatable.rb +49 -0
  71. data/lib/devise/test_helpers.rb +90 -0
  72. data/lib/devise/version.rb +3 -0
  73. data/lib/generators/active_record/devise_generator.rb +28 -0
  74. data/lib/generators/active_record/templates/migration.rb +29 -0
  75. data/lib/generators/devise/devise_generator.rb +17 -0
  76. data/lib/generators/devise/install_generator.rb +24 -0
  77. data/lib/generators/devise/orm_helpers.rb +23 -0
  78. data/lib/generators/devise/templates/README +25 -0
  79. data/lib/generators/devise/templates/devise.rb +139 -0
  80. data/lib/generators/devise/views_generator.rb +63 -0
  81. data/lib/generators/devise_install_generator.rb +4 -0
  82. data/lib/generators/devise_views_generator.rb +4 -0
  83. data/lib/generators/mongoid/devise_generator.rb +17 -0
  84. data/test/controllers/helpers_test.rb +213 -0
  85. data/test/controllers/internal_helpers_test.rb +51 -0
  86. data/test/controllers/url_helpers_test.rb +58 -0
  87. data/test/devise_test.rb +65 -0
  88. data/test/encryptors_test.rb +30 -0
  89. data/test/failure_app_test.rb +123 -0
  90. data/test/integration/authenticatable_test.rb +344 -0
  91. data/test/integration/confirmable_test.rb +104 -0
  92. data/test/integration/database_authenticatable_test.rb +38 -0
  93. data/test/integration/http_authenticatable_test.rb +49 -0
  94. data/test/integration/lockable_test.rb +109 -0
  95. data/test/integration/recoverable_test.rb +141 -0
  96. data/test/integration/registerable_test.rb +153 -0
  97. data/test/integration/rememberable_test.rb +91 -0
  98. data/test/integration/timeoutable_test.rb +80 -0
  99. data/test/integration/token_authenticatable_test.rb +88 -0
  100. data/test/integration/trackable_test.rb +64 -0
  101. data/test/mailers/confirmation_instructions_test.rb +80 -0
  102. data/test/mailers/reset_password_instructions_test.rb +68 -0
  103. data/test/mailers/unlock_instructions_test.rb +62 -0
  104. data/test/mapping_test.rb +85 -0
  105. data/test/models/confirmable_test.rb +221 -0
  106. data/test/models/database_authenticatable_test.rb +148 -0
  107. data/test/models/lockable_test.rb +188 -0
  108. data/test/models/recoverable_test.rb +138 -0
  109. data/test/models/rememberable_test.rb +176 -0
  110. data/test/models/timeoutable_test.rb +28 -0
  111. data/test/models/token_authenticatable_test.rb +37 -0
  112. data/test/models/trackable_test.rb +5 -0
  113. data/test/models/validatable_test.rb +99 -0
  114. data/test/models_test.rb +77 -0
  115. data/test/orm/active_record.rb +9 -0
  116. data/test/orm/mongoid.rb +10 -0
  117. data/test/rails_app/app/active_record/admin.rb +3 -0
  118. data/test/rails_app/app/active_record/shim.rb +2 -0
  119. data/test/rails_app/app/active_record/user.rb +7 -0
  120. data/test/rails_app/app/controllers/admins_controller.rb +6 -0
  121. data/test/rails_app/app/controllers/application_controller.rb +9 -0
  122. data/test/rails_app/app/controllers/home_controller.rb +7 -0
  123. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +2 -0
  124. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +2 -0
  125. data/test/rails_app/app/controllers/sessions_controller.rb +6 -0
  126. data/test/rails_app/app/controllers/users_controller.rb +18 -0
  127. data/test/rails_app/app/helpers/application_helper.rb +3 -0
  128. data/test/rails_app/app/mongoid/admin.rb +6 -0
  129. data/test/rails_app/app/mongoid/shim.rb +16 -0
  130. data/test/rails_app/app/mongoid/user.rb +10 -0
  131. data/test/rails_app/config/application.rb +35 -0
  132. data/test/rails_app/config/boot.rb +13 -0
  133. data/test/rails_app/config/environment.rb +5 -0
  134. data/test/rails_app/config/environments/development.rb +19 -0
  135. data/test/rails_app/config/environments/production.rb +33 -0
  136. data/test/rails_app/config/environments/test.rb +33 -0
  137. data/test/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  138. data/test/rails_app/config/initializers/devise.rb +136 -0
  139. data/test/rails_app/config/initializers/inflections.rb +2 -0
  140. data/test/rails_app/config/initializers/secret_token.rb +2 -0
  141. data/test/rails_app/config/routes.rb +47 -0
  142. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +27 -0
  143. data/test/rails_app/db/schema.rb +86 -0
  144. data/test/routes_test.rb +146 -0
  145. data/test/support/assertions.rb +24 -0
  146. data/test/support/helpers.rb +54 -0
  147. data/test/support/integration.rb +88 -0
  148. data/test/support/test_silencer.rb +5 -0
  149. data/test/support/webrat/integrations/rails.rb +32 -0
  150. data/test/test_helper.rb +21 -0
  151. data/test/test_helpers_test.rb +72 -0
  152. metadata +230 -0
@@ -0,0 +1,91 @@
1
+ require 'test_helper'
2
+
3
+ class RememberMeTest < ActionController::IntegrationTest
4
+
5
+ def create_user_and_remember(add_to_token='')
6
+ Devise.remember_for = 1
7
+ user = create_user
8
+ user.remember_me!
9
+ raw_cookie = User.serialize_into_cookie(user).tap { |a| a.last << add_to_token }
10
+ cookies['remember_user_token'] = generate_signed_cookie(raw_cookie)
11
+ user
12
+ end
13
+
14
+ def generate_signed_cookie(raw_cookie)
15
+ request = ActionDispatch::TestRequest.new
16
+ request.cookie_jar.signed['raw_cookie'] = raw_cookie
17
+ request.cookie_jar['raw_cookie']
18
+ end
19
+
20
+ test 'do not remember the user if he has not checked remember me option' do
21
+ user = sign_in_as_user
22
+ assert_nil request.cookies["remember_user_cookie"]
23
+ assert_nil user.reload.remember_token
24
+ end
25
+
26
+ test 'generate remember token after sign in' do
27
+ user = sign_in_as_user :remember_me => true
28
+ assert request.cookies["remember_user_token"]
29
+ assert user.reload.remember_token
30
+ end
31
+
32
+ test 'generate remember token after sign in setting cookie domain' do
33
+ # We test this by asserting the cookie is not sent after the redirect
34
+ # since we changed the domain. This is the only difference with the
35
+ # previous test.
36
+ swap User, :cookie_domain => "omg.somewhere.com" do
37
+ user = sign_in_as_user :remember_me => true
38
+ assert_nil request.cookies["remember_user_token"]
39
+ end
40
+ end
41
+
42
+ test 'remember the user before sign in' do
43
+ user = create_user_and_remember
44
+ get users_path
45
+ assert_response :success
46
+ assert warden.authenticated?(:user)
47
+ assert warden.user(:user) == user
48
+ end
49
+
50
+ test 'do not remember other scopes' do
51
+ user = create_user_and_remember
52
+ get root_path
53
+ assert_response :success
54
+ assert warden.authenticated?(:user)
55
+ assert_not warden.authenticated?(:admin)
56
+ end
57
+
58
+ test 'do not remember with invalid token' do
59
+ user = create_user_and_remember('add')
60
+ get users_path
61
+ assert_not warden.authenticated?(:user)
62
+ assert_redirected_to new_user_session_path
63
+ end
64
+
65
+ test 'do not remember with expired token' do
66
+ user = create_user_and_remember
67
+ swap Devise, :remember_for => 0 do
68
+ get users_path
69
+ assert_not warden.authenticated?(:user)
70
+ assert_redirected_to new_user_session_path
71
+ end
72
+ end
73
+
74
+ test 'forget the user before sign out' do
75
+ user = create_user_and_remember
76
+ get users_path
77
+ assert warden.authenticated?(:user)
78
+ get destroy_user_session_path
79
+ assert_not warden.authenticated?(:user)
80
+ assert_nil user.reload.remember_token
81
+ end
82
+
83
+ test 'do not remember the user anymore after forget' do
84
+ user = create_user_and_remember
85
+ get users_path
86
+ assert warden.authenticated?(:user)
87
+ get destroy_user_session_path
88
+ get users_path
89
+ assert_not warden.authenticated?(:user)
90
+ end
91
+ end
@@ -0,0 +1,80 @@
1
+ require 'test_helper'
2
+
3
+ class SessionTimeoutTest < ActionController::IntegrationTest
4
+
5
+ def last_request_at
6
+ @controller.user_session['last_request_at']
7
+ end
8
+
9
+ test 'set last request at in user session after each request' do
10
+ sign_in_as_user
11
+ old_last_request = last_request_at
12
+ assert_not_nil last_request_at
13
+
14
+ get users_path
15
+ assert_not_nil last_request_at
16
+ assert_not_equal old_last_request, last_request_at
17
+ end
18
+
19
+ test 'not time out user session before default limit time' do
20
+ sign_in_as_user
21
+ assert_response :success
22
+ assert warden.authenticated?(:user)
23
+
24
+ get users_path
25
+ assert_response :success
26
+ assert warden.authenticated?(:user)
27
+ end
28
+
29
+ test 'time out user session after default limit time' do
30
+ user = sign_in_as_user
31
+ get expire_user_path(user)
32
+ assert_not_nil last_request_at
33
+
34
+ get users_path
35
+ assert_redirected_to new_user_session_path
36
+ assert_not warden.authenticated?(:user)
37
+ end
38
+
39
+ test 'time out is not triggered on sign out' do
40
+ user = sign_in_as_user
41
+ get expire_user_path(user)
42
+
43
+ get destroy_user_session_path
44
+ assert_response :redirect
45
+ assert_redirected_to root_path
46
+
47
+ follow_redirect!
48
+ assert_contain 'Signed out successfully'
49
+ end
50
+
51
+ test 'user configured timeout limit' do
52
+ swap Devise, :timeout_in => 8.minutes do
53
+ user = sign_in_as_user
54
+
55
+ get users_path
56
+ assert_not_nil last_request_at
57
+ assert_response :success
58
+ assert warden.authenticated?(:user)
59
+
60
+ get expire_user_path(user)
61
+ get users_path
62
+ assert_redirected_to new_user_session_path
63
+ assert_not warden.authenticated?(:user)
64
+ end
65
+ end
66
+
67
+ test 'error message with i18n' do
68
+ store_translations :en, :devise => {
69
+ :failure => { :user => { :timeout => 'Session expired!' } }
70
+ } do
71
+ user = sign_in_as_user
72
+
73
+ get expire_user_path(user)
74
+ get users_path
75
+ follow_redirect!
76
+ assert_contain 'Session expired!'
77
+ end
78
+ end
79
+
80
+ end
@@ -0,0 +1,88 @@
1
+ require 'test_helper'
2
+
3
+ class TokenAuthenticationTest < ActionController::IntegrationTest
4
+
5
+ test 'authenticate with valid authentication token key and value through params' do
6
+ swap Devise, :token_authentication_key => :secret_token do
7
+ sign_in_as_new_user_with_token
8
+
9
+ assert_response :success
10
+ assert_template 'users/index'
11
+ assert_contain 'Welcome'
12
+ assert warden.authenticated?(:user)
13
+ end
14
+ end
15
+
16
+ test 'authenticate with valid authentication token key and value through http' do
17
+ swap Devise, :token_authentication_key => :secret_token do
18
+ sign_in_as_new_user_with_token(:http_auth => true)
19
+
20
+ assert_response :success
21
+ assert_match '<email>user@test.com</email>', response.body
22
+ assert warden.authenticated?(:user)
23
+ end
24
+ end
25
+
26
+ test 'does authenticate with valid authentication token key and value through params if not configured' do
27
+ swap Devise, :token_authentication_key => :secret_token, :params_authenticatable => [:database] do
28
+ sign_in_as_new_user_with_token
29
+
30
+ assert_contain 'You need to sign in or sign up before continuing'
31
+ assert_contain 'Sign in'
32
+ assert_not warden.authenticated?(:user)
33
+ end
34
+ end
35
+
36
+ test 'does authenticate with valid authentication token key and value through http if not configured' do
37
+ swap Devise, :token_authentication_key => :secret_token, :http_authenticatable => [:database] do
38
+ sign_in_as_new_user_with_token(:http_auth => true)
39
+
40
+ assert_response 401
41
+ assert_contain 'Invalid email or password.'
42
+ assert_not warden.authenticated?(:user)
43
+ end
44
+ end
45
+
46
+ test 'does not authenticate with improper authentication token key' do
47
+ swap Devise, :token_authentication_key => :donald_duck_token do
48
+ sign_in_as_new_user_with_token(:auth_token_key => :secret_token)
49
+ assert_equal new_user_session_path, @request.path
50
+
51
+ assert_contain 'You need to sign in or sign up before continuing'
52
+ assert_contain 'Sign in'
53
+ assert_not warden.authenticated?(:user)
54
+ end
55
+ end
56
+
57
+ test 'does not authenticate with improper authentication token value' do
58
+ store_translations :en, :devise => {:failure => {:invalid_token => 'LOL, that was not a single character correct.'}} do
59
+ sign_in_as_new_user_with_token(:auth_token => '*** INVALID TOKEN ***')
60
+ assert_equal new_user_session_path, @request.path
61
+
62
+ assert_contain 'LOL, that was not a single character correct.'
63
+ assert_contain 'Sign in'
64
+ assert_not warden.authenticated?(:user)
65
+ end
66
+ end
67
+
68
+ private
69
+
70
+ def sign_in_as_new_user_with_token(options = {})
71
+ options[:auth_token_key] ||= Devise.token_authentication_key
72
+ options[:auth_token] ||= VALID_AUTHENTICATION_TOKEN
73
+
74
+ user = create_user(options)
75
+ user.authentication_token = VALID_AUTHENTICATION_TOKEN
76
+ user.save
77
+
78
+ if options[:http_auth]
79
+ header = "Basic #{ActiveSupport::Base64.encode64("#{VALID_AUTHENTICATION_TOKEN}:X")}"
80
+ get users_path(:format => :xml), {}, "HTTP_AUTHORIZATION" => header
81
+ else
82
+ visit users_path(options[:auth_token_key].to_sym => options[:auth_token])
83
+ end
84
+
85
+ user
86
+ end
87
+
88
+ end
@@ -0,0 +1,64 @@
1
+ require 'test_helper'
2
+
3
+ class TrackableHooksTest < ActionController::IntegrationTest
4
+
5
+ test "current and last sign in timestamps are updated on each sign in" do
6
+ user = create_user
7
+ assert_nil user.current_sign_in_at
8
+ assert_nil user.last_sign_in_at
9
+
10
+ sign_in_as_user
11
+ user.reload
12
+
13
+ assert_kind_of Time, user.current_sign_in_at
14
+ assert_kind_of Time, user.last_sign_in_at
15
+
16
+ assert_equal user.current_sign_in_at, user.last_sign_in_at
17
+ assert user.current_sign_in_at >= user.created_at
18
+
19
+ visit destroy_user_session_path
20
+ new_time = 2.seconds.from_now
21
+ Time.stubs(:now).returns(new_time)
22
+
23
+ sign_in_as_user
24
+ user.reload
25
+ assert user.current_sign_in_at > user.last_sign_in_at
26
+ end
27
+
28
+ test "current and last sign in remote ip are updated on each sign in" do
29
+ user = create_user
30
+ assert_nil user.current_sign_in_ip
31
+ assert_nil user.last_sign_in_ip
32
+
33
+ sign_in_as_user
34
+ user.reload
35
+
36
+ assert_equal "127.0.0.1", user.current_sign_in_ip
37
+ assert_equal "127.0.0.1", user.last_sign_in_ip
38
+ end
39
+
40
+ test "increase sign in count" do
41
+ user = create_user
42
+ assert_equal 0, user.sign_in_count
43
+
44
+ sign_in_as_user
45
+ user.reload
46
+ assert_equal 1, user.sign_in_count
47
+
48
+ visit destroy_user_session_path
49
+ sign_in_as_user
50
+ user.reload
51
+ assert_equal 2, user.sign_in_count
52
+ end
53
+
54
+ test "does not update anything if user has signed out along the way" do
55
+ swap Devise, :confirm_within => 0 do
56
+ user = create_user(:confirm => false)
57
+ sign_in_as_user
58
+
59
+ user.reload
60
+ assert_nil user.current_sign_in_at
61
+ assert_nil user.last_sign_in_at
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,80 @@
1
+ require 'test_helper'
2
+
3
+ class ConfirmationInstructionsTest < ActionMailer::TestCase
4
+
5
+ def setup
6
+ setup_mailer
7
+ Devise.mailer_sender = 'test@example.com'
8
+ end
9
+
10
+ def user
11
+ @user ||= create_user
12
+ end
13
+
14
+ def mail
15
+ @mail ||= begin
16
+ user
17
+ ActionMailer::Base.deliveries.first
18
+ end
19
+ end
20
+
21
+ test 'email sent after creating the user' do
22
+ assert_not_nil mail
23
+ end
24
+
25
+ test 'content type should be set to html' do
26
+ assert mail.content_type.include?('text/html')
27
+ end
28
+
29
+ test 'send confirmation instructions to the user email' do
30
+ mail
31
+ assert_equal [user.email], mail.to
32
+ end
33
+
34
+ test 'setup sender from configuration' do
35
+ assert_equal ['test@example.com'], mail.from
36
+ end
37
+
38
+ test 'setup subject from I18n' do
39
+ store_translations :en, :devise => { :mailer => { :confirmation_instructions => { :subject => 'Account Confirmation' } } } do
40
+ assert_equal 'Account Confirmation', mail.subject
41
+ end
42
+ end
43
+
44
+ test 'subject namespaced by model' do
45
+ store_translations :en, :devise => { :mailer => { :confirmation_instructions => { :user_subject => 'User Account Confirmation' } } } do
46
+ assert_equal 'User Account Confirmation', mail.subject
47
+ end
48
+ end
49
+
50
+ test 'body should have user info' do
51
+ assert_match /#{user.email}/, mail.body.encoded
52
+ end
53
+
54
+ test 'body should have link to confirm the account' do
55
+ host = ActionMailer::Base.default_url_options[:host]
56
+ confirmation_url_regexp = %r{<a href=\"http://#{host}/users/confirmation\?confirmation_token=#{user.confirmation_token}">}
57
+ assert_match confirmation_url_regexp, mail.body.encoded
58
+ end
59
+
60
+ test 'renders a scoped if scoped_views is set to true' do
61
+ swap Devise, :scoped_views => true do
62
+ assert_equal user.email, mail.body.decoded
63
+ end
64
+ end
65
+
66
+ test 'renders a scoped if scoped_views is set in the mailer class' do
67
+ begin
68
+ Devise::Mailer.scoped_views = true
69
+ assert_equal user.email, mail.body.decoded
70
+ ensure
71
+ Devise::Mailer.send :remove_instance_variable, :@scoped_views
72
+ end
73
+ end
74
+
75
+ test 'mailer sender accepts a proc' do
76
+ swap Devise, :mailer_sender => proc { "another@example.com" } do
77
+ assert_equal ['another@example.com'], mail.from
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,68 @@
1
+ require 'test_helper'
2
+
3
+ class ResetPasswordInstructionsTest < ActionMailer::TestCase
4
+
5
+ def setup
6
+ setup_mailer
7
+ Devise.mailer_sender = 'test@example.com'
8
+ end
9
+
10
+ def user
11
+ @user ||= begin
12
+ user = create_user
13
+ user.send_reset_password_instructions
14
+ user
15
+ end
16
+ end
17
+
18
+ def mail
19
+ @mail ||= begin
20
+ user
21
+ ActionMailer::Base.deliveries.last
22
+ end
23
+ end
24
+
25
+ test 'email sent after reseting the user password' do
26
+ assert_not_nil mail
27
+ end
28
+
29
+ test 'content type should be set to html' do
30
+ assert mail.content_type.include?('text/html')
31
+ end
32
+
33
+ test 'send confirmation instructions to the user email' do
34
+ assert_equal [user.email], mail.to
35
+ end
36
+
37
+ test 'setup sender from configuration' do
38
+ assert_equal ['test@example.com'], mail.from
39
+ end
40
+
41
+ test 'setup subject from I18n' do
42
+ store_translations :en, :devise => { :mailer => { :reset_password_instructions => { :subject => 'Reset instructions' } } } do
43
+ assert_equal 'Reset instructions', mail.subject
44
+ end
45
+ end
46
+
47
+ test 'subject namespaced by model' do
48
+ store_translations :en, :devise => { :mailer => { :reset_password_instructions => { :user_subject => 'User Reset Instructions' } } } do
49
+ assert_equal 'User Reset Instructions', mail.subject
50
+ end
51
+ end
52
+
53
+ test 'body should have user info' do
54
+ assert_match(/#{user.email}/, mail.body.encoded)
55
+ end
56
+
57
+ test 'body should have link to confirm the account' do
58
+ host = ActionMailer::Base.default_url_options[:host]
59
+ reset_url_regexp = %r{<a href=\"http://#{host}/users/password/edit\?reset_password_token=#{user.reset_password_token}">}
60
+ assert_match reset_url_regexp, mail.body.encoded
61
+ end
62
+
63
+ test 'mailer sender accepts a proc' do
64
+ swap Devise, :mailer_sender => proc { "another@example.com" } do
65
+ assert_equal ['another@example.com'], mail.from
66
+ end
67
+ end
68
+ end