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,75 @@
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_file "app/models/monster.rb", /devise/, /attr_accessible (:[a-z_]+(, )?)+/
14
+ assert_migration "db/migrate/devise_create_monsters.rb", /def change/
15
+ end
16
+
17
+ test "all files for namespaced model are properly created" do
18
+ run_generator %w(admin/monster)
19
+ assert_file "app/models/admin/monster.rb", /devise/, /attr_accessible (:[a-z_]+(, )?)+/
20
+ assert_migration "db/migrate/devise_create_admin_monsters.rb", /def change/
21
+ end
22
+
23
+ test "update model migration when model exists" do
24
+ run_generator %w(monster)
25
+ assert_file "app/models/monster.rb"
26
+ run_generator %w(monster)
27
+ assert_migration "db/migrate/add_devise_to_monsters.rb"
28
+ end
29
+
30
+ test "all files are properly deleted" do
31
+ run_generator %w(monster)
32
+ run_generator %w(monster)
33
+ assert_migration "db/migrate/devise_create_monsters.rb"
34
+ assert_migration "db/migrate/add_devise_to_monsters.rb"
35
+ run_generator %w(monster), :behavior => :revoke
36
+ assert_no_migration "db/migrate/add_devise_to_monsters.rb"
37
+ assert_migration "db/migrate/devise_create_monsters.rb"
38
+ run_generator %w(monster), :behavior => :revoke
39
+ assert_no_file "app/models/monster.rb"
40
+ assert_no_migration "db/migrate/devise_create_monsters.rb"
41
+ end
42
+ end
43
+
44
+ module RailsEngine
45
+ class Engine < Rails::Engine
46
+ isolate_namespace RailsEngine
47
+ end
48
+ end
49
+
50
+ def simulate_inside_engine(engine, namespace)
51
+ if Rails::Generators.respond_to?(:namespace=)
52
+ swap Rails::Generators, :namespace => namespace do
53
+ yield
54
+ end
55
+ else
56
+ swap Rails, :application => engine.instance do
57
+ yield
58
+ end
59
+ end
60
+ end
61
+
62
+ class ActiveRecordEngineGeneratorTest < Rails::Generators::TestCase
63
+ tests ActiveRecord::Generators::DeviseGenerator
64
+ destination File.expand_path("../../tmp", __FILE__)
65
+ setup :prepare_destination
66
+
67
+ test "all files are properly created" do
68
+ simulate_inside_engine(RailsEngine::Engine, RailsEngine) do
69
+ run_generator ["monster"]
70
+
71
+ assert_file "app/models/rails_engine/monster.rb", /devise/,/attr_accessible (:[a-z_]+(, )?)+/
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,39 @@
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
@@ -0,0 +1,13 @@
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
@@ -0,0 +1,23 @@
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
+
@@ -0,0 +1,52 @@
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
+ end
12
+
13
+ test "Assert all views are properly created with scope param param" do
14
+ run_generator %w(users)
15
+ assert_files "users"
16
+
17
+ run_generator %w(admins)
18
+ assert_files "admins"
19
+ end
20
+
21
+ test "Assert views with simple form" do
22
+ run_generator %w(-b simple_form_for)
23
+ assert_files
24
+ assert_file "app/views/devise/confirmations/new.html.erb", /simple_form_for/
25
+
26
+ run_generator %w(users -b simple_form_for)
27
+ assert_files "users"
28
+ assert_file "app/views/users/confirmations/new.html.erb", /simple_form_for/
29
+ end
30
+
31
+ test "Assert views with markerb" do
32
+ run_generator %w(--markerb)
33
+ assert_files nil, :mail_template_engine => "markerb"
34
+ end
35
+
36
+ def assert_files(scope = nil, options={})
37
+ scope = "devise" if scope.nil?
38
+ mail_template_engine = options[:mail_template_engine] || "html.erb"
39
+
40
+ assert_file "app/views/#{scope}/confirmations/new.html.erb"
41
+ assert_file "app/views/#{scope}/mailer/confirmation_instructions.#{mail_template_engine}"
42
+ assert_file "app/views/#{scope}/mailer/reset_password_instructions.#{mail_template_engine}"
43
+ assert_file "app/views/#{scope}/mailer/unlock_instructions.#{mail_template_engine}"
44
+ assert_file "app/views/#{scope}/passwords/edit.html.erb"
45
+ assert_file "app/views/#{scope}/passwords/new.html.erb"
46
+ assert_file "app/views/#{scope}/registrations/new.html.erb"
47
+ assert_file "app/views/#{scope}/registrations/edit.html.erb"
48
+ assert_file "app/views/#{scope}/sessions/new.html.erb"
49
+ assert_file "app/views/#{scope}/shared/_links.erb"
50
+ assert_file "app/views/#{scope}/unlocks/new.html.erb"
51
+ end
52
+ end
@@ -0,0 +1,51 @@
1
+ require 'test_helper'
2
+
3
+ class DeviseHelperTest < ActionController::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
+
@@ -0,0 +1,633 @@
1
+ require 'test_helper'
2
+
3
+ class AuthenticationSanityTest < ActionController::IntegrationTest
4
+ test 'home should be accessible without sign in' do
5
+ visit '/'
6
+ assert_response :success
7
+ assert_template 'home/index'
8
+ end
9
+
10
+ test 'sign in as user should not authenticate admin scope' do
11
+ sign_in_as_user
12
+ assert warden.authenticated?(:user)
13
+ assert_not warden.authenticated?(:admin)
14
+ end
15
+
16
+ test 'sign in as admin should not authenticate user scope' do
17
+ sign_in_as_admin
18
+ assert warden.authenticated?(:admin)
19
+ assert_not warden.authenticated?(:user)
20
+ end
21
+
22
+ test 'sign in as both user and admin at same time' do
23
+ sign_in_as_user
24
+ sign_in_as_admin
25
+ assert warden.authenticated?(:user)
26
+ assert warden.authenticated?(:admin)
27
+ end
28
+
29
+ test 'sign out as user should not touch admin authentication if sign_out_all_scopes is false' do
30
+ swap Devise, :sign_out_all_scopes => false do
31
+ sign_in_as_user
32
+ sign_in_as_admin
33
+ get destroy_user_session_path
34
+ assert_not warden.authenticated?(:user)
35
+ assert warden.authenticated?(:admin)
36
+ end
37
+ end
38
+
39
+ test 'sign out as admin should not touch user authentication if sign_out_all_scopes is false' do
40
+ swap Devise, :sign_out_all_scopes => false do
41
+ sign_in_as_user
42
+ sign_in_as_admin
43
+
44
+ get destroy_admin_session_path
45
+ assert_not warden.authenticated?(:admin)
46
+ assert warden.authenticated?(:user)
47
+ end
48
+ end
49
+
50
+ test 'sign out as user should also sign out admin if sign_out_all_scopes is true' do
51
+ swap Devise, :sign_out_all_scopes => true do
52
+ sign_in_as_user
53
+ sign_in_as_admin
54
+
55
+ get destroy_user_session_path
56
+ assert_not warden.authenticated?(:user)
57
+ assert_not warden.authenticated?(:admin)
58
+ end
59
+ end
60
+
61
+ test 'sign out as admin should also sign out user if sign_out_all_scopes is true' do
62
+ swap Devise, :sign_out_all_scopes => true do
63
+ sign_in_as_user
64
+ sign_in_as_admin
65
+
66
+ get destroy_admin_session_path
67
+ assert_not warden.authenticated?(:admin)
68
+ assert_not warden.authenticated?(:user)
69
+ end
70
+ end
71
+
72
+ test 'not signed in as admin should not be able to access admins actions' do
73
+ get admins_path
74
+ assert_redirected_to new_admin_session_path
75
+ assert_not warden.authenticated?(:admin)
76
+ end
77
+
78
+ test 'signed in as user should not be able to access admins actions' do
79
+ sign_in_as_user
80
+ assert warden.authenticated?(:user)
81
+ assert_not warden.authenticated?(:admin)
82
+
83
+ get admins_path
84
+ assert_redirected_to new_admin_session_path
85
+ end
86
+
87
+ test 'signed in as admin should be able to access admin actions' do
88
+ sign_in_as_admin
89
+ assert warden.authenticated?(:admin)
90
+ assert_not warden.authenticated?(:user)
91
+
92
+ get admins_path
93
+
94
+ assert_response :success
95
+ assert_template 'admins/index'
96
+ assert_contain 'Welcome Admin'
97
+ end
98
+
99
+ test 'authenticated admin should not be able to sign as admin again' do
100
+ sign_in_as_admin
101
+ get new_admin_session_path
102
+
103
+ assert_response :redirect
104
+ assert_redirected_to admin_root_path
105
+ assert warden.authenticated?(:admin)
106
+ end
107
+
108
+ test 'authenticated admin should be able to sign out' do
109
+ sign_in_as_admin
110
+ assert warden.authenticated?(:admin)
111
+
112
+ get destroy_admin_session_path
113
+ assert_response :redirect
114
+ assert_redirected_to root_path
115
+
116
+ get root_path
117
+ assert_contain 'Signed out successfully'
118
+ assert_not warden.authenticated?(:admin)
119
+ end
120
+
121
+ test 'unauthenticated admin does not set message on sign out' do
122
+ get destroy_admin_session_path
123
+ assert_response :redirect
124
+ assert_redirected_to root_path
125
+
126
+ get root_path
127
+ assert_not_contain 'Signed out successfully'
128
+ end
129
+
130
+ test 'scope uses custom failure app' do
131
+ put "/en/accounts/management"
132
+ assert_equal "Oops, not found", response.body
133
+ assert_equal 404, response.status
134
+ end
135
+ end
136
+
137
+ class AuthenticationRoutesRestrictions < ActionController::IntegrationTest
138
+ test 'not signed in should not be able to access private route (authenticate denied)' do
139
+ get private_path
140
+ assert_redirected_to new_admin_session_path
141
+ assert_not warden.authenticated?(:admin)
142
+ end
143
+
144
+ test 'signed in as user should not be able to access private route restricted to admins (authenticate denied)' do
145
+ sign_in_as_user
146
+ assert warden.authenticated?(:user)
147
+ assert_not warden.authenticated?(:admin)
148
+ get private_path
149
+ assert_redirected_to new_admin_session_path
150
+ end
151
+
152
+ test 'signed in as admin should be able to access private route restricted to admins (authenticate accepted)' do
153
+ sign_in_as_admin
154
+ assert warden.authenticated?(:admin)
155
+ assert_not warden.authenticated?(:user)
156
+
157
+ get private_path
158
+
159
+ assert_response :success
160
+ assert_template 'home/private'
161
+ assert_contain 'Private!'
162
+ end
163
+
164
+ test 'signed in as inactive admin should not be able to access private/active route restricted to active admins (authenticate denied)' do
165
+ sign_in_as_admin(:active => false)
166
+ assert warden.authenticated?(:admin)
167
+ assert_not warden.authenticated?(:user)
168
+
169
+ assert_raises ActionController::RoutingError do
170
+ get "/private/active"
171
+ end
172
+ end
173
+
174
+ test 'signed in as active admin should be able to access private/active route restricted to active admins (authenticate accepted)' do
175
+ sign_in_as_admin(:active => true)
176
+ assert warden.authenticated?(:admin)
177
+ assert_not warden.authenticated?(:user)
178
+
179
+ get private_active_path
180
+
181
+ assert_response :success
182
+ assert_template 'home/private'
183
+ assert_contain 'Private!'
184
+ end
185
+
186
+ test 'signed in as admin should get admin dashboard (authenticated accepted)' do
187
+ sign_in_as_admin
188
+ assert warden.authenticated?(:admin)
189
+ assert_not warden.authenticated?(:user)
190
+
191
+ get dashboard_path
192
+
193
+ assert_response :success
194
+ assert_template 'home/admin'
195
+ assert_contain 'Admin dashboard'
196
+ end
197
+
198
+ test 'signed in as user should get user dashboard (authenticated accepted)' do
199
+ sign_in_as_user
200
+ assert warden.authenticated?(:user)
201
+ assert_not warden.authenticated?(:admin)
202
+
203
+ get dashboard_path
204
+
205
+ assert_response :success
206
+ assert_template 'home/user'
207
+ assert_contain 'User dashboard'
208
+ end
209
+
210
+ test 'not signed in should get no dashboard (authenticated denied)' do
211
+ assert_raises ActionController::RoutingError do
212
+ get dashboard_path
213
+ end
214
+ end
215
+
216
+ test 'signed in as inactive admin should not be able to access dashboard/active route restricted to active admins (authenticated denied)' do
217
+ sign_in_as_admin(:active => false)
218
+ assert warden.authenticated?(:admin)
219
+ assert_not warden.authenticated?(:user)
220
+
221
+ assert_raises ActionController::RoutingError do
222
+ get "/dashboard/active"
223
+ end
224
+ end
225
+
226
+ test 'signed in as active admin should be able to access dashboard/active route restricted to active admins (authenticated accepted)' do
227
+ sign_in_as_admin(:active => true)
228
+ assert warden.authenticated?(:admin)
229
+ assert_not warden.authenticated?(:user)
230
+
231
+ get dashboard_active_path
232
+
233
+ assert_response :success
234
+ assert_template 'home/admin_dashboard'
235
+ assert_contain 'Admin dashboard'
236
+ end
237
+
238
+ test 'signed in user should not see unauthenticated page (unauthenticated denied)' do
239
+ sign_in_as_user
240
+ assert warden.authenticated?(:user)
241
+ assert_not warden.authenticated?(:admin)
242
+
243
+ assert_raises ActionController::RoutingError do
244
+ get join_path
245
+ end
246
+ end
247
+
248
+ test 'not signed in users should see unautheticated page (unauthenticated accepted)' do
249
+ get join_path
250
+
251
+ assert_response :success
252
+ assert_template 'home/join'
253
+ assert_contain 'Join'
254
+ end
255
+ end
256
+
257
+ class AuthenticationRedirectTest < ActionController::IntegrationTest
258
+ test 'redirect from warden shows sign in or sign up message' do
259
+ get admins_path
260
+
261
+ warden_path = new_admin_session_path
262
+ assert_redirected_to warden_path
263
+
264
+ get warden_path
265
+ assert_contain 'You need to sign in or sign up before continuing.'
266
+ end
267
+
268
+ test 'redirect to default url if no other was configured' do
269
+ sign_in_as_user
270
+ assert_template 'home/index'
271
+ assert_nil session[:"user_return_to"]
272
+ end
273
+
274
+ test 'redirect to requested url after sign in' do
275
+ get users_path
276
+ assert_redirected_to new_user_session_path
277
+ assert_equal users_path, session[:"user_return_to"]
278
+
279
+ follow_redirect!
280
+ sign_in_as_user :visit => false
281
+
282
+ assert_current_url '/users'
283
+ assert_nil session[:"user_return_to"]
284
+ end
285
+
286
+ test 'redirect to last requested url overwriting the stored return_to option' do
287
+ get expire_user_path(create_user)
288
+ assert_redirected_to new_user_session_path
289
+ assert_equal expire_user_path(create_user), session[:"user_return_to"]
290
+
291
+ get users_path
292
+ assert_redirected_to new_user_session_path
293
+ assert_equal users_path, session[:"user_return_to"]
294
+
295
+ follow_redirect!
296
+ sign_in_as_user :visit => false
297
+
298
+ assert_current_url '/users'
299
+ assert_nil session[:"user_return_to"]
300
+ end
301
+
302
+ test 'xml http requests does not store urls for redirect' do
303
+ get users_path, {}, 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest'
304
+ assert_equal 401, response.status
305
+ assert_nil session[:"user_return_to"]
306
+ end
307
+
308
+ test 'redirect to configured home path for a given scope after sign in' do
309
+ sign_in_as_admin
310
+ assert_equal "/admin_area/home", @request.path
311
+ end
312
+
313
+ test 'require_no_authentication should set the already_authenticated flash message' do
314
+ sign_in_as_user
315
+ visit new_user_session_path
316
+ assert_equal flash[:alert], I18n.t("devise.failure.already_authenticated")
317
+ end
318
+ end
319
+
320
+ class AuthenticationSessionTest < ActionController::IntegrationTest
321
+ test 'destroyed account is signed out' do
322
+ sign_in_as_user
323
+ get '/users'
324
+
325
+ User.destroy_all
326
+ get '/users'
327
+ assert_redirected_to new_user_session_path
328
+ end
329
+
330
+ test 'allows session to be set for a given scope' do
331
+ sign_in_as_user
332
+ get '/users'
333
+ assert_equal "Cart", @controller.user_session[:cart]
334
+ end
335
+
336
+ test 'does not explode when invalid user class is stored in session' do
337
+ klass = User
338
+ paths = ActiveSupport::Dependencies.autoload_paths.dup
339
+
340
+ begin
341
+ sign_in_as_user
342
+ assert warden.authenticated?(:user)
343
+
344
+ Object.send :remove_const, :User
345
+ ActiveSupport::Dependencies.autoload_paths.clear
346
+
347
+ visit "/users"
348
+ assert_not warden.authenticated?(:user)
349
+ ensure
350
+ Object.const_set(:User, klass)
351
+ ActiveSupport::Dependencies.autoload_paths.replace(paths)
352
+ end
353
+ end
354
+
355
+ test 'session id is changed on sign in' do
356
+ get '/users'
357
+ session_id = request.session["session_id"]
358
+
359
+ get '/users'
360
+ assert_equal session_id, request.session["session_id"]
361
+
362
+ sign_in_as_user
363
+ assert_not_equal session_id, request.session["session_id"]
364
+ end
365
+ end
366
+
367
+ class AuthenticationWithScopedViewsTest < ActionController::IntegrationTest
368
+ test 'renders the scoped view if turned on and view is available' do
369
+ swap Devise, :scoped_views => true do
370
+ assert_raise Webrat::NotFoundError do
371
+ sign_in_as_user
372
+ end
373
+ assert_match /Special user view/, response.body
374
+ end
375
+ end
376
+
377
+ test 'renders the scoped view if turned on in an specific controller' do
378
+ begin
379
+ Devise::SessionsController.scoped_views = true
380
+ assert_raise Webrat::NotFoundError do
381
+ sign_in_as_user
382
+ end
383
+
384
+ assert_match /Special user view/, response.body
385
+ assert !Devise::PasswordsController.scoped_views?
386
+ ensure
387
+ Devise::SessionsController.send :remove_instance_variable, :@scoped_views
388
+ end
389
+ end
390
+
391
+ test 'does not render the scoped view if turned off' do
392
+ swap Devise, :scoped_views => false do
393
+ assert_nothing_raised do
394
+ sign_in_as_user
395
+ end
396
+ end
397
+ end
398
+
399
+ test 'does not render the scoped view if not available' do
400
+ swap Devise, :scoped_views => true do
401
+ assert_nothing_raised do
402
+ sign_in_as_admin
403
+ end
404
+ end
405
+ end
406
+ end
407
+
408
+ class AuthenticationOthersTest < ActionController::IntegrationTest
409
+ test 'handles unverified requests gets rid of caches' do
410
+ swap UsersController, :allow_forgery_protection => true do
411
+ post exhibit_user_url(1)
412
+ assert_not warden.authenticated?(:user)
413
+
414
+ sign_in_as_user
415
+ assert warden.authenticated?(:user)
416
+
417
+ post exhibit_user_url(1)
418
+ assert_not warden.authenticated?(:user)
419
+ assert_equal "User is not authenticated", response.body
420
+ end
421
+ end
422
+
423
+ test 'uses the custom controller with the custom controller view' do
424
+ get '/admin_area/sign_in'
425
+ assert_contain 'Sign in'
426
+ assert_contain 'Welcome to "admins/sessions" controller!'
427
+ assert_contain 'Welcome to "sessions/new" view!'
428
+ end
429
+
430
+ test 'render 404 on roles without routes' do
431
+ assert_raise ActionController::RoutingError do
432
+ get '/admin_area/password/new'
433
+ end
434
+ end
435
+
436
+ test 'does not intercept Rails 401 responses' do
437
+ get '/unauthenticated'
438
+ assert_equal 401, response.status
439
+ end
440
+
441
+ test 'render 404 on roles without mapping' do
442
+ assert_raise AbstractController::ActionNotFound do
443
+ get '/sign_in'
444
+ end
445
+ end
446
+
447
+ test 'sign in with script name' do
448
+ assert_nothing_raised do
449
+ get new_user_session_path, {}, "SCRIPT_NAME" => "/omg"
450
+ fill_in "email", :with => "user@test.com"
451
+ end
452
+ end
453
+
454
+ test 'sign in stub in xml format' do
455
+ get new_user_session_path(:format => 'xml')
456
+ assert_match '<?xml version="1.0" encoding="UTF-8"?>', response.body
457
+ assert_match /<user>.*<\/user>/m, response.body
458
+ assert_match '<email></email>', response.body
459
+ assert_match '<password nil="true"', response.body
460
+ end
461
+
462
+ test 'sign in stub in json format' do
463
+ get new_user_session_path(:format => 'json')
464
+ assert_match '{"user":{', response.body
465
+ assert_match '"email":""', response.body
466
+ assert_match '"password":null', response.body
467
+ end
468
+
469
+ test 'sign in stub in json with non attribute key' do
470
+ swap Devise, :authentication_keys => [:other_key] do
471
+ get new_user_session_path(:format => 'json')
472
+ assert_match '{"user":{', response.body
473
+ assert_match '"other_key":null', response.body
474
+ assert_match '"password":null', response.body
475
+ end
476
+ end
477
+
478
+ test 'uses the mapping from router' do
479
+ sign_in_as_user :visit => "/as/sign_in"
480
+ assert warden.authenticated?(:user)
481
+ assert_not warden.authenticated?(:admin)
482
+ end
483
+
484
+ test 'sign in with xml format returns xml response' do
485
+ create_user
486
+ post user_session_path(:format => 'xml'), :user => {:email => "user@test.com", :password => '12345678'}
487
+ assert_response :success
488
+ assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>)
489
+ end
490
+
491
+ test 'sign in with xml format is idempotent' do
492
+ get new_user_session_path(:format => 'xml')
493
+ assert_response :success
494
+
495
+ create_user
496
+ post user_session_path(:format => 'xml'), :user => {:email => "user@test.com", :password => '12345678'}
497
+ assert_response :success
498
+
499
+ get new_user_session_path(:format => 'xml')
500
+ assert_response :success
501
+
502
+ post user_session_path(:format => 'xml'), :user => {:email => "user@test.com", :password => '12345678'}
503
+ assert_response :success
504
+ assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>)
505
+ end
506
+
507
+ test 'sign out with xml format returns ok response' do
508
+ sign_in_as_user
509
+ get destroy_user_session_path(:format => 'xml')
510
+ assert_response :no_content
511
+ assert_not warden.authenticated?(:user)
512
+ end
513
+
514
+ test 'sign out with json format returns empty json response' do
515
+ sign_in_as_user
516
+ get destroy_user_session_path(:format => 'json')
517
+ assert_response :no_content
518
+ assert_not warden.authenticated?(:user)
519
+ end
520
+ end
521
+
522
+ class AuthenticationKeysTest < ActionController::IntegrationTest
523
+ test 'missing authentication keys cause authentication to abort' do
524
+ swap Devise, :authentication_keys => [:subdomain] do
525
+ sign_in_as_user
526
+ assert_contain "Invalid email or password."
527
+ assert_not warden.authenticated?(:user)
528
+ end
529
+ end
530
+
531
+ test 'missing authentication keys cause authentication to abort unless marked as not required' do
532
+ swap Devise, :authentication_keys => { :email => true, :subdomain => false } do
533
+ sign_in_as_user
534
+ assert warden.authenticated?(:user)
535
+ end
536
+ end
537
+ end
538
+
539
+ class AuthenticationRequestKeysTest < ActionController::IntegrationTest
540
+ test 'request keys are used on authentication' do
541
+ host! 'foo.bar.baz'
542
+
543
+ swap Devise, :request_keys => [:subdomain] do
544
+ User.expects(:find_for_authentication).with(:subdomain => 'foo', :email => 'user@test.com').returns(create_user)
545
+ sign_in_as_user
546
+ assert warden.authenticated?(:user)
547
+ end
548
+ end
549
+
550
+ test 'invalid request keys raises NoMethodError' do
551
+ swap Devise, :request_keys => [:unknown_method] do
552
+ assert_raise NoMethodError do
553
+ sign_in_as_user
554
+ end
555
+
556
+ assert_not warden.authenticated?(:user)
557
+ end
558
+ end
559
+
560
+ test 'blank request keys cause authentication to abort' do
561
+ host! 'test.com'
562
+
563
+ swap Devise, :request_keys => [:subdomain] do
564
+ sign_in_as_user
565
+ assert_contain "Invalid email or password."
566
+ assert_not warden.authenticated?(:user)
567
+ end
568
+ end
569
+
570
+ test 'blank request keys cause authentication to abort unless if marked as not required' do
571
+ host! 'test.com'
572
+
573
+ swap Devise, :request_keys => { :subdomain => false } do
574
+ sign_in_as_user
575
+ assert warden.authenticated?(:user)
576
+ end
577
+ end
578
+ end
579
+
580
+ class AuthenticationSignOutViaTest < ActionController::IntegrationTest
581
+ def sign_in!(scope)
582
+ sign_in_as_admin(:visit => send("new_#{scope}_session_path"))
583
+ assert warden.authenticated?(scope)
584
+ end
585
+
586
+ test 'allow sign out via delete when sign_out_via provides only delete' do
587
+ sign_in!(:sign_out_via_delete)
588
+ delete destroy_sign_out_via_delete_session_path
589
+ assert_not warden.authenticated?(:sign_out_via_delete)
590
+ end
591
+
592
+ test 'do not allow sign out via get when sign_out_via provides only delete' do
593
+ sign_in!(:sign_out_via_delete)
594
+ assert_raise ActionController::RoutingError do
595
+ get destroy_sign_out_via_delete_session_path
596
+ end
597
+ assert warden.authenticated?(:sign_out_via_delete)
598
+ end
599
+
600
+ test 'allow sign out via post when sign_out_via provides only post' do
601
+ sign_in!(:sign_out_via_post)
602
+ post destroy_sign_out_via_post_session_path
603
+ assert_not warden.authenticated?(:sign_out_via_post)
604
+ end
605
+
606
+ test 'do not allow sign out via get when sign_out_via provides only post' do
607
+ sign_in!(:sign_out_via_post)
608
+ assert_raise ActionController::RoutingError do
609
+ get destroy_sign_out_via_delete_session_path
610
+ end
611
+ assert warden.authenticated?(:sign_out_via_post)
612
+ end
613
+
614
+ test 'allow sign out via delete when sign_out_via provides delete and post' do
615
+ sign_in!(:sign_out_via_delete_or_post)
616
+ delete destroy_sign_out_via_delete_or_post_session_path
617
+ assert_not warden.authenticated?(:sign_out_via_delete_or_post)
618
+ end
619
+
620
+ test 'allow sign out via post when sign_out_via provides delete and post' do
621
+ sign_in!(:sign_out_via_delete_or_post)
622
+ post destroy_sign_out_via_delete_or_post_session_path
623
+ assert_not warden.authenticated?(:sign_out_via_delete_or_post)
624
+ end
625
+
626
+ test 'do not allow sign out via get when sign_out_via provides delete and post' do
627
+ sign_in!(:sign_out_via_delete_or_post)
628
+ assert_raise ActionController::RoutingError do
629
+ get destroy_sign_out_via_delete_or_post_session_path
630
+ end
631
+ assert warden.authenticated?(:sign_out_via_delete_or_post)
632
+ end
633
+ end