devise 3.0.0 → 4.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +351 -0
  3. data/MIT-LICENSE +2 -1
  4. data/README.md +422 -130
  5. data/app/controllers/devise/confirmations_controller.rb +17 -6
  6. data/app/controllers/devise/omniauth_callbacks_controller.rb +12 -6
  7. data/app/controllers/devise/passwords_controller.rb +23 -8
  8. data/app/controllers/devise/registrations_controller.rb +70 -28
  9. data/app/controllers/devise/sessions_controller.rb +49 -17
  10. data/app/controllers/devise/unlocks_controller.rb +11 -4
  11. data/app/controllers/devise_controller.rb +74 -34
  12. data/app/helpers/devise_helper.rb +23 -18
  13. data/app/mailers/devise/mailer.rb +25 -10
  14. data/app/views/devise/confirmations/new.html.erb +9 -5
  15. data/app/views/devise/mailer/confirmation_instructions.html.erb +1 -1
  16. data/app/views/devise/mailer/email_changed.html.erb +7 -0
  17. data/app/views/devise/mailer/password_change.html.erb +3 -0
  18. data/app/views/devise/mailer/reset_password_instructions.html.erb +1 -1
  19. data/app/views/devise/mailer/unlock_instructions.html.erb +1 -1
  20. data/app/views/devise/passwords/edit.html.erb +16 -7
  21. data/app/views/devise/passwords/new.html.erb +9 -5
  22. data/app/views/devise/registrations/edit.html.erb +29 -15
  23. data/app/views/devise/registrations/new.html.erb +20 -9
  24. data/app/views/devise/sessions/new.html.erb +19 -10
  25. data/app/views/devise/shared/_error_messages.html.erb +15 -0
  26. data/app/views/devise/shared/{_links.erb → _links.html.erb} +10 -10
  27. data/app/views/devise/unlocks/new.html.erb +9 -5
  28. data/config/locales/en.yml +26 -20
  29. data/lib/devise/controllers/helpers.rb +122 -125
  30. data/lib/devise/controllers/rememberable.rb +14 -14
  31. data/lib/devise/controllers/scoped_views.rb +3 -1
  32. data/lib/devise/controllers/sign_in_out.rb +121 -0
  33. data/lib/devise/controllers/store_location.rb +76 -0
  34. data/lib/devise/controllers/url_helpers.rb +10 -8
  35. data/lib/devise/delegator.rb +2 -0
  36. data/lib/devise/encryptor.rb +24 -0
  37. data/lib/devise/failure_app.rb +132 -42
  38. data/lib/devise/hooks/activatable.rb +7 -6
  39. data/lib/devise/hooks/csrf_cleaner.rb +9 -0
  40. data/lib/devise/hooks/forgetable.rb +3 -1
  41. data/lib/devise/hooks/lockable.rb +5 -3
  42. data/lib/devise/hooks/proxy.rb +23 -0
  43. data/lib/devise/hooks/rememberable.rb +7 -4
  44. data/lib/devise/hooks/timeoutable.rb +18 -8
  45. data/lib/devise/hooks/trackable.rb +3 -1
  46. data/lib/devise/mailers/helpers.rb +15 -18
  47. data/lib/devise/mapping.rb +9 -3
  48. data/lib/devise/models/authenticatable.rb +102 -80
  49. data/lib/devise/models/confirmable.rb +154 -72
  50. data/lib/devise/models/database_authenticatable.rb +125 -25
  51. data/lib/devise/models/lockable.rb +50 -29
  52. data/lib/devise/models/omniauthable.rb +3 -1
  53. data/lib/devise/models/recoverable.rb +72 -50
  54. data/lib/devise/models/registerable.rb +4 -0
  55. data/lib/devise/models/rememberable.rb +65 -32
  56. data/lib/devise/models/timeoutable.rb +4 -8
  57. data/lib/devise/models/trackable.rb +20 -4
  58. data/lib/devise/models/validatable.rb +16 -9
  59. data/lib/devise/models.rb +6 -13
  60. data/lib/devise/modules.rb +12 -11
  61. data/lib/devise/omniauth/config.rb +2 -0
  62. data/lib/devise/omniauth/url_helpers.rb +14 -5
  63. data/lib/devise/omniauth.rb +4 -5
  64. data/lib/devise/orm/active_record.rb +5 -1
  65. data/lib/devise/orm/mongoid.rb +6 -2
  66. data/lib/devise/parameter_filter.rb +4 -0
  67. data/lib/devise/parameter_sanitizer.rb +144 -34
  68. data/lib/devise/rails/deprecated_constant_accessor.rb +39 -0
  69. data/lib/devise/rails/routes.rb +191 -127
  70. data/lib/devise/rails/warden_compat.rb +2 -1
  71. data/lib/devise/rails.rb +13 -20
  72. data/lib/devise/secret_key_finder.rb +27 -0
  73. data/lib/devise/strategies/authenticatable.rb +21 -22
  74. data/lib/devise/strategies/base.rb +3 -1
  75. data/lib/devise/strategies/database_authenticatable.rb +15 -4
  76. data/lib/devise/strategies/rememberable.rb +15 -3
  77. data/lib/devise/test/controller_helpers.rb +167 -0
  78. data/lib/devise/test/integration_helpers.rb +63 -0
  79. data/lib/devise/test_helpers.rb +7 -123
  80. data/lib/devise/time_inflector.rb +4 -2
  81. data/lib/devise/token_generator.rb +32 -0
  82. data/lib/devise/version.rb +3 -1
  83. data/lib/devise.rb +124 -78
  84. data/lib/generators/active_record/devise_generator.rb +64 -15
  85. data/lib/generators/active_record/templates/migration.rb +9 -8
  86. data/lib/generators/active_record/templates/migration_existing.rb +9 -8
  87. data/lib/generators/devise/controllers_generator.rb +46 -0
  88. data/lib/generators/devise/devise_generator.rb +10 -6
  89. data/lib/generators/devise/install_generator.rb +19 -1
  90. data/lib/generators/devise/orm_helpers.rb +17 -9
  91. data/lib/generators/devise/views_generator.rb +51 -28
  92. data/lib/generators/mongoid/devise_generator.rb +24 -24
  93. data/lib/generators/templates/README +13 -12
  94. data/lib/generators/templates/controllers/README +14 -0
  95. data/lib/generators/templates/controllers/confirmations_controller.rb +30 -0
  96. data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +30 -0
  97. data/lib/generators/templates/controllers/passwords_controller.rb +34 -0
  98. data/lib/generators/templates/controllers/registrations_controller.rb +62 -0
  99. data/lib/generators/templates/controllers/sessions_controller.rb +27 -0
  100. data/lib/generators/templates/controllers/unlocks_controller.rb +30 -0
  101. data/lib/generators/templates/devise.rb +118 -53
  102. data/lib/generators/templates/markerb/confirmation_instructions.markerb +1 -1
  103. data/lib/generators/templates/markerb/email_changed.markerb +7 -0
  104. data/lib/generators/templates/markerb/password_change.markerb +3 -0
  105. data/lib/generators/templates/markerb/reset_password_instructions.markerb +1 -1
  106. data/lib/generators/templates/markerb/unlock_instructions.markerb +1 -1
  107. data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +6 -2
  108. data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +12 -4
  109. data/lib/generators/templates/simple_form_for/passwords/new.html.erb +5 -2
  110. data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +14 -6
  111. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +12 -4
  112. data/lib/generators/templates/simple_form_for/sessions/new.html.erb +11 -6
  113. data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +5 -2
  114. metadata +73 -294
  115. data/.gitignore +0 -10
  116. data/.travis.yml +0 -20
  117. data/.yardopts +0 -9
  118. data/CHANGELOG.rdoc +0 -941
  119. data/CONTRIBUTING.md +0 -14
  120. data/Gemfile +0 -31
  121. data/Gemfile.lock +0 -159
  122. data/Rakefile +0 -35
  123. data/app/views/devise/_links.erb +0 -3
  124. data/devise.gemspec +0 -26
  125. data/devise.png +0 -0
  126. data/gemfiles/Gemfile.rails-3.2.x +0 -31
  127. data/gemfiles/Gemfile.rails-3.2.x.lock +0 -156
  128. data/lib/devise/models/token_authenticatable.rb +0 -89
  129. data/lib/devise/strategies/token_authenticatable.rb +0 -91
  130. data/test/controllers/custom_strategy_test.rb +0 -62
  131. data/test/controllers/helpers_test.rb +0 -253
  132. data/test/controllers/internal_helpers_test.rb +0 -120
  133. data/test/controllers/passwords_controller_test.rb +0 -32
  134. data/test/controllers/sessions_controller_test.rb +0 -99
  135. data/test/controllers/url_helpers_test.rb +0 -59
  136. data/test/delegator_test.rb +0 -19
  137. data/test/devise_test.rb +0 -83
  138. data/test/failure_app_test.rb +0 -221
  139. data/test/generators/active_record_generator_test.rb +0 -73
  140. data/test/generators/devise_generator_test.rb +0 -39
  141. data/test/generators/install_generator_test.rb +0 -13
  142. data/test/generators/mongoid_generator_test.rb +0 -23
  143. data/test/generators/views_generator_test.rb +0 -67
  144. data/test/helpers/devise_helper_test.rb +0 -51
  145. data/test/integration/authenticatable_test.rb +0 -699
  146. data/test/integration/confirmable_test.rb +0 -299
  147. data/test/integration/database_authenticatable_test.rb +0 -84
  148. data/test/integration/http_authenticatable_test.rb +0 -115
  149. data/test/integration/lockable_test.rb +0 -242
  150. data/test/integration/omniauthable_test.rb +0 -133
  151. data/test/integration/recoverable_test.rb +0 -335
  152. data/test/integration/registerable_test.rb +0 -349
  153. data/test/integration/rememberable_test.rb +0 -165
  154. data/test/integration/timeoutable_test.rb +0 -150
  155. data/test/integration/token_authenticatable_test.rb +0 -205
  156. data/test/integration/trackable_test.rb +0 -92
  157. data/test/mailers/confirmation_instructions_test.rb +0 -111
  158. data/test/mailers/reset_password_instructions_test.rb +0 -92
  159. data/test/mailers/unlock_instructions_test.rb +0 -87
  160. data/test/mapping_test.rb +0 -127
  161. data/test/models/authenticatable_test.rb +0 -13
  162. data/test/models/confirmable_test.rb +0 -452
  163. data/test/models/database_authenticatable_test.rb +0 -226
  164. data/test/models/lockable_test.rb +0 -282
  165. data/test/models/omniauthable_test.rb +0 -7
  166. data/test/models/recoverable_test.rb +0 -222
  167. data/test/models/registerable_test.rb +0 -7
  168. data/test/models/rememberable_test.rb +0 -175
  169. data/test/models/serializable_test.rb +0 -49
  170. data/test/models/timeoutable_test.rb +0 -46
  171. data/test/models/token_authenticatable_test.rb +0 -55
  172. data/test/models/trackable_test.rb +0 -13
  173. data/test/models/validatable_test.rb +0 -127
  174. data/test/models_test.rb +0 -163
  175. data/test/omniauth/config_test.rb +0 -57
  176. data/test/omniauth/url_helpers_test.rb +0 -54
  177. data/test/orm/active_record.rb +0 -10
  178. data/test/orm/mongoid.rb +0 -13
  179. data/test/parameter_sanitizer_test.rb +0 -58
  180. data/test/rails_app/Rakefile +0 -6
  181. data/test/rails_app/app/active_record/admin.rb +0 -6
  182. data/test/rails_app/app/active_record/shim.rb +0 -2
  183. data/test/rails_app/app/active_record/user.rb +0 -6
  184. data/test/rails_app/app/controllers/admins/sessions_controller.rb +0 -6
  185. data/test/rails_app/app/controllers/admins_controller.rb +0 -11
  186. data/test/rails_app/app/controllers/application_controller.rb +0 -9
  187. data/test/rails_app/app/controllers/home_controller.rb +0 -25
  188. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +0 -2
  189. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +0 -2
  190. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +0 -14
  191. data/test/rails_app/app/controllers/users_controller.rb +0 -31
  192. data/test/rails_app/app/helpers/application_helper.rb +0 -3
  193. data/test/rails_app/app/mailers/users/mailer.rb +0 -12
  194. data/test/rails_app/app/mongoid/admin.rb +0 -29
  195. data/test/rails_app/app/mongoid/shim.rb +0 -23
  196. data/test/rails_app/app/mongoid/user.rb +0 -42
  197. data/test/rails_app/app/views/admins/index.html.erb +0 -1
  198. data/test/rails_app/app/views/admins/sessions/new.html.erb +0 -2
  199. data/test/rails_app/app/views/home/admin_dashboard.html.erb +0 -1
  200. data/test/rails_app/app/views/home/index.html.erb +0 -1
  201. data/test/rails_app/app/views/home/join.html.erb +0 -1
  202. data/test/rails_app/app/views/home/private.html.erb +0 -1
  203. data/test/rails_app/app/views/home/user_dashboard.html.erb +0 -1
  204. data/test/rails_app/app/views/layouts/application.html.erb +0 -24
  205. data/test/rails_app/app/views/users/edit_form.html.erb +0 -1
  206. data/test/rails_app/app/views/users/index.html.erb +0 -1
  207. data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +0 -1
  208. data/test/rails_app/app/views/users/sessions/new.html.erb +0 -1
  209. data/test/rails_app/bin/bundle +0 -3
  210. data/test/rails_app/bin/rails +0 -4
  211. data/test/rails_app/bin/rake +0 -4
  212. data/test/rails_app/config/application.rb +0 -40
  213. data/test/rails_app/config/boot.rb +0 -8
  214. data/test/rails_app/config/database.yml +0 -18
  215. data/test/rails_app/config/environment.rb +0 -5
  216. data/test/rails_app/config/environments/development.rb +0 -34
  217. data/test/rails_app/config/environments/production.rb +0 -84
  218. data/test/rails_app/config/environments/test.rb +0 -36
  219. data/test/rails_app/config/initializers/backtrace_silencers.rb +0 -7
  220. data/test/rails_app/config/initializers/devise.rb +0 -178
  221. data/test/rails_app/config/initializers/inflections.rb +0 -2
  222. data/test/rails_app/config/initializers/secret_token.rb +0 -8
  223. data/test/rails_app/config/initializers/session_store.rb +0 -1
  224. data/test/rails_app/config/routes.rb +0 -104
  225. data/test/rails_app/config.ru +0 -4
  226. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +0 -74
  227. data/test/rails_app/db/schema.rb +0 -52
  228. data/test/rails_app/lib/shared_admin.rb +0 -14
  229. data/test/rails_app/lib/shared_user.rb +0 -25
  230. data/test/rails_app/public/404.html +0 -26
  231. data/test/rails_app/public/422.html +0 -26
  232. data/test/rails_app/public/500.html +0 -26
  233. data/test/rails_app/public/favicon.ico +0 -0
  234. data/test/routes_test.rb +0 -250
  235. data/test/support/assertions.rb +0 -40
  236. data/test/support/helpers.rb +0 -91
  237. data/test/support/integration.rb +0 -92
  238. data/test/support/locale/en.yml +0 -4
  239. data/test/support/webrat/integrations/rails.rb +0 -24
  240. data/test/test_helper.rb +0 -34
  241. data/test/test_helpers_test.rb +0 -151
  242. data/test/test_models.rb +0 -26
data/test/devise_test.rb DELETED
@@ -1,83 +0,0 @@
1
- require 'test_helper'
2
-
3
- module Devise
4
- def self.yield_and_restore
5
- @@warden_configured = nil
6
- c, b = @@warden_config, @@warden_config_block
7
- yield
8
- ensure
9
- @@warden_config, @@warden_config_block = c, b
10
- end
11
- end
12
-
13
- class DeviseTest < ActiveSupport::TestCase
14
- test 'model options can be configured through Devise' do
15
- swap Devise, :allow_unconfirmed_access_for => 113, :pepper => "foo" do
16
- assert_equal 113, Devise.allow_unconfirmed_access_for
17
- assert_equal "foo", Devise.pepper
18
- end
19
- end
20
-
21
- test 'setup block yields self' do
22
- Devise.setup do |config|
23
- assert_equal Devise, config
24
- end
25
- end
26
-
27
- test 'stores warden configuration' do
28
- assert_kind_of Devise::Delegator, Devise.warden_config.failure_app
29
- assert_equal :user, Devise.warden_config.default_scope
30
- end
31
-
32
- test 'warden manager user configuration through a block' do
33
- Devise.yield_and_restore do
34
- @executed = false
35
- Devise.warden do |config|
36
- @executed = true
37
- assert_kind_of Warden::Config, config
38
- end
39
-
40
- Devise.configure_warden!
41
- assert @executed
42
- end
43
- end
44
-
45
- test 'add new module using the helper method' do
46
- assert_nothing_raised(Exception) { Devise.add_module(:coconut) }
47
- assert_equal 1, Devise::ALL.select { |v| v == :coconut }.size
48
- assert_not Devise::STRATEGIES.include?(:coconut)
49
- assert_not defined?(Devise::Models::Coconut)
50
- Devise::ALL.delete(:coconut)
51
-
52
- assert_nothing_raised(Exception) { Devise.add_module(:banana, :strategy => :fruits) }
53
- assert_equal :fruits, Devise::STRATEGIES[:banana]
54
- Devise::ALL.delete(:banana)
55
- Devise::STRATEGIES.delete(:banana)
56
-
57
- assert_nothing_raised(Exception) { Devise.add_module(:kivi, :controller => :fruits) }
58
- assert_equal :fruits, Devise::CONTROLLERS[:kivi]
59
- Devise::ALL.delete(:kivi)
60
- Devise::CONTROLLERS.delete(:kivi)
61
- end
62
-
63
- test 'should complain when comparing empty or different sized passes' do
64
- [nil, ""].each do |empty|
65
- assert_not Devise.secure_compare(empty, "something")
66
- assert_not Devise.secure_compare("something", empty)
67
- assert_not Devise.secure_compare(empty, empty)
68
- end
69
- assert_not Devise.secure_compare("size_1", "size_four")
70
- end
71
-
72
- test 'Devise.email_regexp should match valid email addresses' do
73
- valid_emails = ["test@example.com", "jo@jo.co", "f4$_m@you.com", "testing.example@example.com.ua"]
74
- non_valid_emails = ["rex", "test@go,com", "test user@example.com", "test_user@example server.com"]
75
-
76
- valid_emails.each do |email|
77
- assert_match Devise.email_regexp, email
78
- end
79
- non_valid_emails.each do |email|
80
- assert_no_match Devise.email_regexp, email
81
- end
82
- end
83
- end
@@ -1,221 +0,0 @@
1
- require 'test_helper'
2
- require 'ostruct'
3
-
4
- class FailureTest < ActiveSupport::TestCase
5
- class RootFailureApp < Devise::FailureApp
6
- def fake_app
7
- Object.new
8
- end
9
- end
10
-
11
- def self.context(name, &block)
12
- instance_eval(&block)
13
- end
14
-
15
- def call_failure(env_params={})
16
- env = {
17
- 'REQUEST_URI' => 'http://test.host/',
18
- 'HTTP_HOST' => 'test.host',
19
- 'REQUEST_METHOD' => 'GET',
20
- 'warden.options' => { :scope => :user },
21
- 'rack.session' => {},
22
- 'action_dispatch.request.formats' => Array(env_params.delete('formats') || Mime::HTML),
23
- 'rack.input' => "",
24
- 'warden' => OpenStruct.new(:message => nil)
25
- }.merge!(env_params)
26
-
27
- @response = (env.delete(:app) || Devise::FailureApp).call(env).to_a
28
- @request = ActionDispatch::Request.new(env)
29
- end
30
-
31
- context 'When redirecting' do
32
- test 'returns to the default redirect location' do
33
- call_failure
34
- assert_equal 302, @response.first
35
- assert_equal 'You need to sign in or sign up before continuing.', @request.flash[:alert]
36
- assert_equal 'http://test.host/users/sign_in', @response.second['Location']
37
- end
38
-
39
- test 'returns to the default redirect location for wildcard requests' do
40
- call_failure 'action_dispatch.request.formats' => nil, 'HTTP_ACCEPT' => '*/*'
41
- assert_equal 302, @response.first
42
- assert_equal 'http://test.host/users/sign_in', @response.second['Location']
43
- end
44
-
45
- test 'returns to the root path if no session path is available' do
46
- swap Devise, :router_name => :fake_app do
47
- call_failure :app => RootFailureApp
48
- assert_equal 302, @response.first
49
- assert_equal 'You need to sign in or sign up before continuing.', @request.flash[:alert]
50
- assert_equal 'http://test.host/', @response.second['Location']
51
- end
52
- end
53
-
54
- if Rails.application.config.respond_to?(:relative_url_root)
55
- test 'returns to the default redirect location considering the relative url root' do
56
- swap Rails.application.config, :relative_url_root => "/sample" do
57
- call_failure
58
- assert_equal 302, @response.first
59
- assert_equal 'http://test.host/sample/users/sign_in', @response.second['Location']
60
- end
61
- end
62
- end
63
-
64
- test 'uses the proxy failure message as symbol' do
65
- call_failure('warden' => OpenStruct.new(:message => :invalid))
66
- assert_equal 'Invalid email or password.', @request.flash[:alert]
67
- assert_equal 'http://test.host/users/sign_in', @response.second["Location"]
68
- end
69
-
70
- test 'uses the proxy failure message as string' do
71
- call_failure('warden' => OpenStruct.new(:message => 'Hello world'))
72
- assert_equal 'Hello world', @request.flash[:alert]
73
- assert_equal 'http://test.host/users/sign_in', @response.second["Location"]
74
- end
75
-
76
- test 'set content type to default text/html' do
77
- call_failure
78
- assert_equal 'text/html; charset=utf-8', @response.second['Content-Type']
79
- end
80
-
81
- test 'setup a default message' do
82
- call_failure
83
- assert_match(/You are being/, @response.last.body)
84
- assert_match(/redirected/, @response.last.body)
85
- assert_match(/users\/sign_in/, @response.last.body)
86
- end
87
-
88
- test 'works for any navigational format' do
89
- swap Devise, :navigational_formats => [:xml] do
90
- call_failure('formats' => Mime::XML)
91
- assert_equal 302, @response.first
92
- end
93
- end
94
-
95
- test 'redirects the correct format if it is a non-html format request' do
96
- swap Devise, :navigational_formats => [:js] do
97
- call_failure('formats' => Mime::JS)
98
- assert_equal 'http://test.host/users/sign_in.js', @response.second["Location"]
99
- end
100
- end
101
- end
102
-
103
- context 'For HTTP request' do
104
- test 'return 401 status' do
105
- call_failure('formats' => Mime::XML)
106
- assert_equal 401, @response.first
107
- end
108
-
109
- test 'return appropriate body for xml' do
110
- call_failure('formats' => Mime::XML)
111
- result = %(<?xml version="1.0" encoding="UTF-8"?>\n<errors>\n <error>You need to sign in or sign up before continuing.</error>\n</errors>\n)
112
- assert_equal result, @response.last.body
113
- end
114
-
115
- test 'return appropriate body for json' do
116
- call_failure('formats' => Mime::JSON)
117
- result = %({"error":"You need to sign in or sign up before continuing."})
118
- assert_equal result, @response.last.body
119
- end
120
-
121
- test 'return 401 status for unknown formats' do
122
- call_failure 'formats' => []
123
- assert_equal 401, @response.first
124
- end
125
-
126
- test 'return WWW-authenticate headers if model allows' do
127
- call_failure('formats' => Mime::XML)
128
- assert_equal 'Basic realm="Application"', @response.second["WWW-Authenticate"]
129
- end
130
-
131
- test 'does not return WWW-authenticate headers if model does not allow' do
132
- swap Devise, :http_authenticatable => false do
133
- call_failure('formats' => Mime::XML)
134
- assert_nil @response.second["WWW-Authenticate"]
135
- end
136
- end
137
-
138
- test 'works for any non navigational format' do
139
- swap Devise, :navigational_formats => [] do
140
- call_failure('formats' => Mime::HTML)
141
- assert_equal 401, @response.first
142
- end
143
- end
144
-
145
- test 'uses the failure message as response body' do
146
- call_failure('formats' => Mime::XML, 'warden' => OpenStruct.new(:message => :invalid))
147
- assert_match '<error>Invalid email or password.</error>', @response.third.body
148
- end
149
-
150
- context 'on ajax call' do
151
- context 'when http_authenticatable_on_xhr is false' do
152
- test 'dont return 401 with navigational formats' do
153
- swap Devise, :http_authenticatable_on_xhr => false do
154
- call_failure('formats' => Mime::HTML, 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest')
155
- assert_equal 302, @response.first
156
- assert_equal 'http://test.host/users/sign_in', @response.second["Location"]
157
- end
158
- end
159
-
160
- test 'dont return 401 with non navigational formats' do
161
- swap Devise, :http_authenticatable_on_xhr => false do
162
- call_failure('formats' => Mime::JSON, 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest')
163
- assert_equal 302, @response.first
164
- assert_equal 'http://test.host/users/sign_in.json', @response.second["Location"]
165
- end
166
- end
167
- end
168
-
169
- context 'when http_authenticatable_on_xhr is true' do
170
- test 'return 401' do
171
- swap Devise, :http_authenticatable_on_xhr => true do
172
- call_failure('formats' => Mime::HTML, 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest')
173
- assert_equal 401, @response.first
174
- end
175
- end
176
-
177
- test 'skip WWW-Authenticate header' do
178
- swap Devise, :http_authenticatable_on_xhr => true do
179
- call_failure('formats' => Mime::HTML, 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest')
180
- assert_nil @response.second['WWW-Authenticate']
181
- end
182
- end
183
- end
184
- end
185
- end
186
-
187
- context 'With recall' do
188
- test 'calls the original controller if invalid email or password' do
189
- env = {
190
- "warden.options" => { :recall => "devise/sessions#new", :attempted_path => "/users/sign_in" },
191
- "devise.mapping" => Devise.mappings[:user],
192
- "warden" => stub_everything
193
- }
194
- call_failure(env)
195
- assert @response.third.body.include?('<h2>Sign in</h2>')
196
- assert @response.third.body.include?('Invalid email or password.')
197
- end
198
-
199
- test 'calls the original controller if not confirmed email' do
200
- env = {
201
- "warden.options" => { :recall => "devise/sessions#new", :attempted_path => "/users/sign_in", :message => :unconfirmed },
202
- "devise.mapping" => Devise.mappings[:user],
203
- "warden" => stub_everything
204
- }
205
- call_failure(env)
206
- assert @response.third.body.include?('<h2>Sign in</h2>')
207
- assert @response.third.body.include?('You have to confirm your account before continuing.')
208
- end
209
-
210
- test 'calls the original controller if inactive account' do
211
- env = {
212
- "warden.options" => { :recall => "devise/sessions#new", :attempted_path => "/users/sign_in", :message => :inactive },
213
- "devise.mapping" => Devise.mappings[:user],
214
- "warden" => stub_everything
215
- }
216
- call_failure(env)
217
- assert @response.third.body.include?('<h2>Sign in</h2>')
218
- assert @response.third.body.include?('Your account was not activated yet.')
219
- end
220
- end
221
- end
@@ -1,73 +0,0 @@
1
- require "test_helper"
2
-
3
- if DEVISE_ORM == :active_record
4
- require "generators/active_record/devise_generator"
5
-
6
- class ActiveRecordGeneratorTest < Rails::Generators::TestCase
7
- tests ActiveRecord::Generators::DeviseGenerator
8
- destination File.expand_path("../../tmp", __FILE__)
9
- setup :prepare_destination
10
-
11
- test "all files are properly created with rails31 migration syntax" do
12
- run_generator %w(monster)
13
- assert_migration "db/migrate/devise_create_monsters.rb", /def change/
14
- end
15
-
16
- test "all files for namespaced model are properly created" do
17
- run_generator %w(admin/monster)
18
- assert_migration "db/migrate/devise_create_admin_monsters.rb", /def change/
19
- end
20
-
21
- test "update model migration when model exists" do
22
- run_generator %w(monster)
23
- assert_file "app/models/monster.rb"
24
- run_generator %w(monster)
25
- assert_migration "db/migrate/add_devise_to_monsters.rb"
26
- end
27
-
28
- test "all files are properly deleted" do
29
- run_generator %w(monster)
30
- run_generator %w(monster)
31
- assert_migration "db/migrate/devise_create_monsters.rb"
32
- assert_migration "db/migrate/add_devise_to_monsters.rb"
33
- run_generator %w(monster), :behavior => :revoke
34
- assert_no_migration "db/migrate/add_devise_to_monsters.rb"
35
- assert_migration "db/migrate/devise_create_monsters.rb"
36
- run_generator %w(monster), :behavior => :revoke
37
- assert_no_file "app/models/monster.rb"
38
- assert_no_migration "db/migrate/devise_create_monsters.rb"
39
- end
40
- end
41
-
42
- module RailsEngine
43
- class Engine < Rails::Engine
44
- isolate_namespace RailsEngine
45
- end
46
- end
47
-
48
- def simulate_inside_engine(engine, namespace)
49
- if Rails::Generators.respond_to?(:namespace=)
50
- swap Rails::Generators, :namespace => namespace do
51
- yield
52
- end
53
- else
54
- swap Rails, :application => engine.instance do
55
- yield
56
- end
57
- end
58
- end
59
-
60
- class ActiveRecordEngineGeneratorTest < Rails::Generators::TestCase
61
- tests ActiveRecord::Generators::DeviseGenerator
62
- destination File.expand_path("../../tmp", __FILE__)
63
- setup :prepare_destination
64
-
65
- test "all files are properly created" do
66
- simulate_inside_engine(RailsEngine::Engine, RailsEngine) do
67
- run_generator ["monster"]
68
-
69
- assert_file "app/models/rails_engine/monster.rb", /devise/
70
- end
71
- end
72
- end
73
- end
@@ -1,39 +0,0 @@
1
- require 'test_helper'
2
-
3
- require "generators/devise/devise_generator"
4
-
5
- class DeviseGeneratorTest < Rails::Generators::TestCase
6
- tests Devise::Generators::DeviseGenerator
7
- destination File.expand_path("../../tmp", __FILE__)
8
-
9
- setup do
10
- prepare_destination
11
- copy_routes
12
- end
13
-
14
- test "route generation for simple model names" do
15
- run_generator %w(monster name:string)
16
- assert_file "config/routes.rb", /devise_for :monsters/
17
- end
18
-
19
- test "route generation for namespaced model names" do
20
- run_generator %w(monster/goblin name:string)
21
- match = /devise_for :goblins, :class_name => "Monster::Goblin"/
22
- assert_file "config/routes.rb", match
23
- end
24
-
25
- test "route generation with skip routes" do
26
- run_generator %w(monster name:string --skip-routes)
27
- match = /devise_for :monsters, :skip => :all/
28
- assert_file "config/routes.rb", match
29
- end
30
-
31
- def copy_routes
32
- routes = File.expand_path("../../rails_app/config/routes.rb", __FILE__)
33
- destination = File.join(destination_root, "config")
34
-
35
- FileUtils.mkdir_p(destination)
36
- FileUtils.cp routes, destination
37
- end
38
-
39
- end
@@ -1,13 +0,0 @@
1
- require "test_helper"
2
-
3
- class InstallGeneratorTest < Rails::Generators::TestCase
4
- tests Devise::Generators::InstallGenerator
5
- destination File.expand_path("../../tmp", __FILE__)
6
- setup :prepare_destination
7
-
8
- test "Assert all files are properly created" do
9
- run_generator
10
- assert_file "config/initializers/devise.rb"
11
- assert_file "config/locales/devise.en.yml"
12
- end
13
- end
@@ -1,23 +0,0 @@
1
- require "test_helper"
2
-
3
- if DEVISE_ORM == :mongoid
4
- require "generators/mongoid/devise_generator"
5
-
6
- class MongoidGeneratorTest < Rails::Generators::TestCase
7
- tests Mongoid::Generators::DeviseGenerator
8
- destination File.expand_path("../../tmp", __FILE__)
9
- setup :prepare_destination
10
-
11
- test "all files are properly created" do
12
- run_generator %w(monster)
13
- assert_file "app/models/monster.rb", /devise/
14
- end
15
-
16
- test "all files are properly deleted" do
17
- run_generator %w(monster)
18
- run_generator %w(monster), :behavior => :revoke
19
- assert_no_file "app/models/monster.rb"
20
- end
21
- end
22
- end
23
-
@@ -1,67 +0,0 @@
1
- require "test_helper"
2
-
3
- class ViewsGeneratorTest < Rails::Generators::TestCase
4
- tests Devise::Generators::ViewsGenerator
5
- destination File.expand_path("../../tmp", __FILE__)
6
- setup :prepare_destination
7
-
8
- test "Assert all views are properly created with no params" do
9
- run_generator
10
- assert_files
11
- assert_shared_links
12
- end
13
-
14
- test "Assert all views are properly created with scope param" do
15
- run_generator %w(users)
16
- assert_files "users"
17
- assert_shared_links "users"
18
-
19
- run_generator %w(admins)
20
- assert_files "admins"
21
- assert_shared_links "admins"
22
- end
23
-
24
- test "Assert views with simple form" do
25
- run_generator %w(-b simple_form_for)
26
- assert_files
27
- assert_file "app/views/devise/confirmations/new.html.erb", /simple_form_for/
28
-
29
- run_generator %w(users -b simple_form_for)
30
- assert_files "users"
31
- assert_file "app/views/users/confirmations/new.html.erb", /simple_form_for/
32
- end
33
-
34
- test "Assert views with markerb" do
35
- run_generator %w(--markerb)
36
- assert_files nil, :mail_template_engine => "markerb"
37
- end
38
-
39
- def assert_files(scope = nil, options={})
40
- scope = "devise" if scope.nil?
41
- mail_template_engine = options[:mail_template_engine] || "html.erb"
42
-
43
- assert_file "app/views/#{scope}/confirmations/new.html.erb"
44
- assert_file "app/views/#{scope}/mailer/confirmation_instructions.#{mail_template_engine}"
45
- assert_file "app/views/#{scope}/mailer/reset_password_instructions.#{mail_template_engine}"
46
- assert_file "app/views/#{scope}/mailer/unlock_instructions.#{mail_template_engine}"
47
- assert_file "app/views/#{scope}/passwords/edit.html.erb"
48
- assert_file "app/views/#{scope}/passwords/new.html.erb"
49
- assert_file "app/views/#{scope}/registrations/new.html.erb"
50
- assert_file "app/views/#{scope}/registrations/edit.html.erb"
51
- assert_file "app/views/#{scope}/sessions/new.html.erb"
52
- assert_file "app/views/#{scope}/shared/_links.erb"
53
- assert_file "app/views/#{scope}/unlocks/new.html.erb"
54
- end
55
-
56
- def assert_shared_links(scope = nil)
57
- scope = "devise" if scope.nil?
58
- link = /<%= render \"#{scope}\/shared\/links\" %>/
59
-
60
- assert_file "app/views/#{scope}/passwords/edit.html.erb", link
61
- assert_file "app/views/#{scope}/passwords/new.html.erb", link
62
- assert_file "app/views/#{scope}/confirmations/new.html.erb", link
63
- assert_file "app/views/#{scope}/registrations/new.html.erb", link
64
- assert_file "app/views/#{scope}/sessions/new.html.erb", link
65
- assert_file "app/views/#{scope}/unlocks/new.html.erb", link
66
- end
67
- end
@@ -1,51 +0,0 @@
1
- require 'test_helper'
2
-
3
- class DeviseHelperTest < ActionDispatch::IntegrationTest
4
- setup do
5
- model_labels = { :models => { :user => "utilisateur" } }
6
-
7
- I18n.backend.store_translations :fr,
8
- {
9
- :errors => { :messages => { :not_saved => {
10
- :one => "Erreur lors de l'enregistrement de '%{resource}': 1 erreur.",
11
- :other => "Erreur lors de l'enregistrement de '%{resource}': %{count} erreurs."
12
- } } },
13
- :activerecord => model_labels,
14
- :mongoid => model_labels
15
- }
16
-
17
- I18n.locale = 'fr'
18
- end
19
-
20
- teardown do
21
- I18n.locale = 'en'
22
- end
23
-
24
- test 'test errors.messages.not_saved with single error from i18n' do
25
- get new_user_registration_path
26
-
27
- fill_in 'password', :with => 'new_user123'
28
- fill_in 'password confirmation', :with => 'new_user123'
29
- click_button 'Sign up'
30
-
31
- assert_have_selector '#error_explanation'
32
- assert_contain "Erreur lors de l'enregistrement de 'utilisateur': 1 erreur"
33
- end
34
-
35
- test 'test errors.messages.not_saved with multiple errors from i18n' do
36
- # Dirty tracking behavior prevents email validations from being applied:
37
- # https://github.com/mongoid/mongoid/issues/756
38
- (pending "Fails on Mongoid < 2.1"; break) if defined?(Mongoid) && Mongoid::VERSION.to_f < 2.1
39
-
40
- get new_user_registration_path
41
-
42
- fill_in 'email', :with => 'invalid_email'
43
- fill_in 'password', :with => 'new_user123'
44
- fill_in 'password confirmation', :with => 'new_user321'
45
- click_button 'Sign up'
46
-
47
- assert_have_selector '#error_explanation'
48
- assert_contain "Erreur lors de l'enregistrement de 'utilisateur': 2 erreurs"
49
- end
50
- end
51
-