sorcery 0.1.4 → 0.3.1

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 (113) hide show
  1. data/Gemfile +4 -2
  2. data/Gemfile.lock +16 -13
  3. data/README.rdoc +149 -78
  4. data/Rakefile +5 -0
  5. data/VERSION +1 -1
  6. data/lib/generators/sorcery_migration/sorcery_migration_generator.rb +24 -0
  7. data/lib/generators/sorcery_migration/templates/activity_logging.rb +17 -0
  8. data/lib/generators/sorcery_migration/templates/brute_force_protection.rb +11 -0
  9. data/lib/generators/sorcery_migration/templates/core.rb +16 -0
  10. data/lib/generators/sorcery_migration/templates/external.rb +14 -0
  11. data/lib/generators/sorcery_migration/templates/remember_me.rb +15 -0
  12. data/lib/generators/sorcery_migration/templates/reset_password.rb +13 -0
  13. data/lib/generators/sorcery_migration/templates/user_activation.rb +17 -0
  14. data/lib/sorcery/controller/adapters/sinatra.rb +97 -0
  15. data/lib/sorcery/controller/submodules/activity_logging.rb +20 -7
  16. data/lib/sorcery/controller/submodules/brute_force_protection.rb +9 -2
  17. data/lib/sorcery/controller/submodules/email.rb +44 -0
  18. data/lib/sorcery/controller/submodules/external/protocols/oauth1.rb +35 -0
  19. data/lib/sorcery/controller/submodules/external/protocols/oauth2.rb +26 -0
  20. data/lib/sorcery/controller/submodules/external/providers/facebook.rb +82 -0
  21. data/lib/sorcery/controller/submodules/external/providers/twitter.rb +86 -0
  22. data/lib/sorcery/controller/submodules/external.rb +83 -0
  23. data/lib/sorcery/controller/submodules/http_basic_auth.rb +18 -9
  24. data/lib/sorcery/controller/submodules/oauth.rb +95 -0
  25. data/lib/sorcery/controller/submodules/remember_me.rb +14 -5
  26. data/lib/sorcery/controller/submodules/session_timeout.rb +6 -1
  27. data/lib/sorcery/controller.rb +30 -16
  28. data/lib/sorcery/engine.rb +9 -2
  29. data/lib/sorcery/model/submodules/activity_logging.rb +13 -8
  30. data/lib/sorcery/model/submodules/brute_force_protection.rb +11 -8
  31. data/lib/sorcery/model/submodules/external.rb +53 -0
  32. data/lib/sorcery/model/submodules/remember_me.rb +5 -3
  33. data/lib/sorcery/model/submodules/reset_password.rb +16 -13
  34. data/lib/sorcery/model/submodules/user_activation.rb +38 -19
  35. data/lib/sorcery/model/temporary_token.rb +22 -0
  36. data/lib/sorcery/model.rb +17 -7
  37. data/lib/sorcery/sinatra.rb +14 -0
  38. data/lib/sorcery/test_helpers/rails.rb +57 -0
  39. data/lib/sorcery/test_helpers/sinatra.rb +131 -0
  40. data/lib/sorcery/test_helpers.rb +40 -0
  41. data/lib/sorcery.rb +22 -0
  42. data/sorcery.gemspec +146 -41
  43. data/spec/Gemfile +3 -2
  44. data/spec/Gemfile.lock +15 -2
  45. data/spec/rails3/app_root/.rspec +1 -0
  46. data/spec/rails3/{Gemfile → app_root/Gemfile} +4 -4
  47. data/spec/rails3/{Gemfile.lock → app_root/Gemfile.lock} +23 -3
  48. data/spec/rails3/app_root/app/controllers/application_controller.rb +42 -1
  49. data/spec/rails3/app_root/app/models/authentication.rb +3 -0
  50. data/spec/rails3/app_root/app/models/user.rb +4 -1
  51. data/spec/rails3/app_root/config/application.rb +1 -3
  52. data/spec/rails3/app_root/config/routes.rb +1 -10
  53. data/spec/rails3/app_root/db/migrate/activation/20101224223622_add_activation_to_users.rb +6 -4
  54. data/spec/rails3/app_root/db/migrate/core/20101224223620_create_users.rb +4 -4
  55. data/spec/rails3/app_root/db/migrate/external/20101224223628_create_authentications.rb +14 -0
  56. data/spec/rails3/{controller_activity_logging_spec.rb → app_root/spec/controller_activity_logging_spec.rb} +13 -13
  57. data/spec/rails3/{controller_brute_force_protection_spec.rb → app_root/spec/controller_brute_force_protection_spec.rb} +16 -6
  58. data/spec/rails3/{controller_http_basic_auth_spec.rb → app_root/spec/controller_http_basic_auth_spec.rb} +3 -3
  59. data/spec/rails3/app_root/spec/controller_oauth2_spec.rb +119 -0
  60. data/spec/rails3/app_root/spec/controller_oauth_spec.rb +122 -0
  61. data/spec/rails3/{controller_remember_me_spec.rb → app_root/spec/controller_remember_me_spec.rb} +4 -4
  62. data/spec/rails3/{controller_session_timeout_spec.rb → app_root/spec/controller_session_timeout_spec.rb} +6 -6
  63. data/spec/rails3/{controller_spec.rb → app_root/spec/controller_spec.rb} +20 -13
  64. data/spec/rails3/app_root/spec/spec_helper.orig.rb +27 -0
  65. data/spec/rails3/app_root/spec/spec_helper.rb +62 -0
  66. data/spec/rails3/{user_activation_spec.rb → app_root/spec/user_activation_spec.rb} +60 -20
  67. data/spec/rails3/{user_activity_logging_spec.rb → app_root/spec/user_activity_logging_spec.rb} +4 -4
  68. data/spec/rails3/{user_brute_force_protection_spec.rb → app_root/spec/user_brute_force_protection_spec.rb} +7 -7
  69. data/spec/rails3/app_root/spec/user_oauth_spec.rb +39 -0
  70. data/spec/rails3/{user_remember_me_spec.rb → app_root/spec/user_remember_me_spec.rb} +4 -4
  71. data/spec/rails3/{user_reset_password_spec.rb → app_root/spec/user_reset_password_spec.rb} +21 -41
  72. data/spec/rails3/app_root/spec/user_spec.rb +317 -0
  73. data/spec/sinatra/Gemfile +12 -0
  74. data/spec/sinatra/Gemfile.lock +134 -0
  75. data/spec/sinatra/Rakefile +10 -0
  76. data/spec/sinatra/authentication.rb +3 -0
  77. data/spec/sinatra/db/migrate/activation/20101224223622_add_activation_to_users.rb +17 -0
  78. data/spec/sinatra/db/migrate/activity_logging/20101224223624_add_activity_logging_to_users.rb +17 -0
  79. data/spec/sinatra/db/migrate/brute_force_protection/20101224223626_add_brute_force_protection_to_users.rb +11 -0
  80. data/spec/sinatra/db/migrate/core/20101224223620_create_users.rb +16 -0
  81. data/spec/sinatra/db/migrate/external/20101224223628_create_authentications.rb +14 -0
  82. data/spec/sinatra/db/migrate/remember_me/20101224223623_add_remember_me_token_to_users.rb +15 -0
  83. data/spec/sinatra/db/migrate/reset_password/20101224223622_add_reset_password_to_users.rb +13 -0
  84. data/spec/sinatra/filters.rb +21 -0
  85. data/spec/sinatra/myapp.rb +133 -0
  86. data/spec/sinatra/sorcery_mailer.rb +25 -0
  87. data/spec/sinatra/spec/controller_activity_logging_spec.rb +85 -0
  88. data/spec/sinatra/spec/controller_brute_force_protection_spec.rb +69 -0
  89. data/spec/sinatra/spec/controller_http_basic_auth_spec.rb +53 -0
  90. data/spec/sinatra/spec/controller_oauth2_spec.rb +119 -0
  91. data/spec/sinatra/spec/controller_oauth_spec.rb +121 -0
  92. data/spec/sinatra/spec/controller_remember_me_spec.rb +64 -0
  93. data/spec/sinatra/spec/controller_session_timeout_spec.rb +52 -0
  94. data/spec/sinatra/spec/controller_spec.rb +120 -0
  95. data/spec/sinatra/spec/spec.opts +4 -0
  96. data/spec/sinatra/spec/spec_helper.rb +44 -0
  97. data/spec/sinatra/spec/user_activation_spec.rb +188 -0
  98. data/spec/sinatra/spec/user_activity_logging_spec.rb +36 -0
  99. data/spec/sinatra/spec/user_brute_force_protection_spec.rb +76 -0
  100. data/spec/sinatra/spec/user_oauth_spec.rb +39 -0
  101. data/spec/sinatra/spec/user_remember_me_spec.rb +66 -0
  102. data/spec/sinatra/spec/user_reset_password_spec.rb +178 -0
  103. data/spec/{rails3 → sinatra/spec}/user_spec.rb +68 -38
  104. data/spec/sinatra/user.rb +6 -0
  105. data/spec/sinatra/views/test_login.erb +4 -0
  106. data/spec/untitled folder +18 -0
  107. metadata +203 -58
  108. data/spec/rails3/app_root/test/fixtures/users.yml +0 -9
  109. data/spec/rails3/app_root/test/performance/browsing_test.rb +0 -9
  110. data/spec/rails3/app_root/test/test_helper.rb +0 -13
  111. data/spec/rails3/app_root/test/unit/user_test.rb +0 -8
  112. data/spec/rails3/spec_helper.rb +0 -135
  113. /data/spec/rails3/{Rakefile → app_root/Rakefile} +0 -0
@@ -0,0 +1,76 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "User with brute_force_protection submodule" do
4
+ before(:all) do
5
+ ActiveRecord::Migrator.migrate("#{APP_ROOT}/db/migrate/brute_force_protection")
6
+ end
7
+
8
+ after(:all) do
9
+ ActiveRecord::Migrator.rollback("#{APP_ROOT}/db/migrate/brute_force_protection")
10
+ end
11
+
12
+ # ----------------- PLUGIN CONFIGURATION -----------------------
13
+ describe User, "loaded plugin configuration" do
14
+
15
+ before(:all) do
16
+ sorcery_reload!([:brute_force_protection])
17
+ create_new_user
18
+ end
19
+
20
+ after(:each) do
21
+ User.sorcery_config.reset!
22
+ end
23
+
24
+ it "should respond to 'failed_logins_count'" do
25
+ @user.should respond_to(:failed_logins_count)
26
+ end
27
+
28
+ it "should respond to 'lock_expires_at'" do
29
+ @user.should respond_to(:failed_logins_count)
30
+ end
31
+
32
+ it "should enable configuration option 'failed_logins_count_attribute_name'" do
33
+ sorcery_model_property_set(:failed_logins_count_attribute_name, :my_count)
34
+ User.sorcery_config.failed_logins_count_attribute_name.should equal(:my_count)
35
+ end
36
+
37
+ it "should enable configuration option 'lock_expires_at_attribute_name'" do
38
+ sorcery_model_property_set(:lock_expires_at_attribute_name, :expires)
39
+ User.sorcery_config.lock_expires_at_attribute_name.should equal(:expires)
40
+ end
41
+
42
+ it "should enable configuration option 'consecutive_login_retries_amount_allowed'" do
43
+ sorcery_model_property_set(:consecutive_login_retries_amount_limit, 34)
44
+ User.sorcery_config.consecutive_login_retries_amount_limit.should equal(34)
45
+ end
46
+
47
+ it "should enable configuration option 'login_lock_time_period'" do
48
+ sorcery_model_property_set(:login_lock_time_period, 2.hours)
49
+ User.sorcery_config.login_lock_time_period.should == 2.hours
50
+ end
51
+ end
52
+
53
+ # ----------------- PLUGIN ACTIVATED -----------------------
54
+ describe User, "when activated with sorcery" do
55
+
56
+ before(:all) do
57
+ sorcery_reload!([:brute_force_protection])
58
+ end
59
+
60
+ before(:each) do
61
+ User.delete_all
62
+ end
63
+
64
+ # it "should increment failed_logins_count on a failed login" do
65
+ # create_new_user
66
+ #
67
+ # end
68
+ #
69
+ # it "should set lock expiry (effectively lock user) when failed_logins_count reaches max within max period" do
70
+ # create_new_user
71
+ # @user.lock_expires_at.should == Time.now.utc + 30
72
+ # end
73
+
74
+ end
75
+
76
+ end
@@ -0,0 +1,39 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "User with oauth submodule" do
4
+ before(:all) do
5
+ ActiveRecord::Migrator.migrate("#{APP_ROOT}/db/migrate/external")
6
+ end
7
+
8
+ after(:all) do
9
+ ActiveRecord::Migrator.rollback("#{APP_ROOT}/db/migrate/external")
10
+ end
11
+
12
+ # ----------------- PLUGIN CONFIGURATION -----------------------
13
+ describe User, "loaded plugin configuration" do
14
+
15
+ before(:all) do
16
+ sorcery_reload!([:external])
17
+ sorcery_controller_property_set(:external_providers, [:twitter])
18
+ sorcery_model_property_set(:authentications_class, Authentication)
19
+ sorcery_controller_oauth_property_set(:twitter, :key, "eYVNBjBDi33aa9GkA3w")
20
+ sorcery_controller_oauth_property_set(:twitter, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
21
+ sorcery_controller_oauth_property_set(:twitter, :callback_url, "http://blabla.com")
22
+ create_new_external_user(:twitter)
23
+ end
24
+
25
+ it "should respond to 'load_from_provider'" do
26
+ User.should respond_to(:load_from_provider)
27
+ end
28
+
29
+ it "'load_from_provider' should load user if exists" do
30
+ User.load_from_provider(:twitter,123).should == @user
31
+ end
32
+
33
+ it "'load_from_provider' should return nil if user doesn't exist" do
34
+ User.load_from_provider(:twitter,980342).should be_nil
35
+ end
36
+
37
+ end
38
+
39
+ end
@@ -0,0 +1,66 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "User with remember_me submodule" do
4
+ before(:all) do
5
+ ActiveRecord::Migrator.migrate("#{APP_ROOT}/db/migrate/remember_me")
6
+ end
7
+
8
+ after(:all) do
9
+ ActiveRecord::Migrator.rollback("#{APP_ROOT}/db/migrate/remember_me")
10
+ end
11
+
12
+ # ----------------- PLUGIN CONFIGURATION -----------------------
13
+ describe User, "loaded plugin configuration" do
14
+ before(:all) do
15
+ sorcery_reload!([:remember_me])
16
+ end
17
+
18
+ after(:each) do
19
+ User.sorcery_config.reset!
20
+ end
21
+
22
+ it "should allow configuration option 'remember_me_token_attribute_name'" do
23
+ sorcery_model_property_set(:remember_me_token_attribute_name, :my_token)
24
+ User.sorcery_config.remember_me_token_attribute_name.should equal(:my_token)
25
+ end
26
+
27
+ it "should allow configuration option 'remember_me_token_expires_at_attribute_name'" do
28
+ sorcery_model_property_set(:remember_me_token_expires_at_attribute_name, :my_expires)
29
+ User.sorcery_config.remember_me_token_expires_at_attribute_name.should equal(:my_expires)
30
+ end
31
+
32
+ it "should respond to 'remember_me!'" do
33
+ create_new_user
34
+ @user.should respond_to(:remember_me!)
35
+ end
36
+
37
+ it "should respond to 'forget_me!'" do
38
+ create_new_user
39
+ @user.should respond_to(:forget_me!)
40
+ end
41
+
42
+ it "should generate a new token on 'remember_me!'" do
43
+ create_new_user
44
+ @user.remember_me_token.should be_nil
45
+ @user.remember_me!
46
+ @user.remember_me_token.should_not be_nil
47
+ end
48
+
49
+ it "should set an expiration based on 'remember_me_for' attribute" do
50
+ create_new_user
51
+ sorcery_model_property_set(:remember_me_for, 2 * 60 * 60 * 24)
52
+ @user.remember_me!
53
+ @user.remember_me_token_expires_at.to_s.should == (Time.now + 2 * 60 * 60 * 24).to_s
54
+ end
55
+
56
+ it "should delete the token and expiration on 'forget_me!'" do
57
+ create_new_user
58
+ @user.remember_me!
59
+ @user.remember_me_token.should_not be_nil
60
+ @user.forget_me!
61
+ @user.remember_me_token.should be_nil
62
+ @user.remember_me_token_expires_at.should be_nil
63
+ end
64
+ end
65
+
66
+ end
@@ -0,0 +1,178 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "User with reset_password submodule" do
4
+ before(:all) do
5
+ ActiveRecord::Migrator.migrate("#{APP_ROOT}/db/migrate/reset_password")
6
+ end
7
+
8
+ after(:all) do
9
+ ActiveRecord::Migrator.rollback("#{APP_ROOT}/db/migrate/reset_password")
10
+ end
11
+
12
+ # ----------------- PLUGIN CONFIGURATION -----------------------
13
+ describe User, "loaded plugin configuration" do
14
+
15
+ before(:all) do
16
+ sorcery_reload!([:reset_password], :reset_password_mailer => ::SorceryMailer)
17
+ end
18
+
19
+ after(:each) do
20
+ User.sorcery_config.reset!
21
+ end
22
+
23
+ it "should respond to 'deliver_reset_password_instructions!'" do
24
+ create_new_user
25
+ @user.should respond_to(:deliver_reset_password_instructions!)
26
+ end
27
+
28
+ it "should respond to 'reset_password!" do
29
+ create_new_user
30
+ @user.should respond_to(:reset_password!)
31
+ end
32
+
33
+ it "should respond to 'load_from_reset_password_token'" do
34
+ create_new_user
35
+ User.should respond_to(:load_from_reset_password_token)
36
+ end
37
+
38
+ it "should allow configuration option 'reset_password_token_attribute_name'" do
39
+ sorcery_model_property_set(:reset_password_token_attribute_name, :my_code)
40
+ User.sorcery_config.reset_password_token_attribute_name.should equal(:my_code)
41
+ end
42
+
43
+ it "should allow configuration option 'reset_password_mailer'" do
44
+ sorcery_model_property_set(:reset_password_mailer, TestUser)
45
+ User.sorcery_config.reset_password_mailer.should equal(TestUser)
46
+ end
47
+
48
+ it "should allow configuration option 'reset_password_email_method_name'" do
49
+ sorcery_model_property_set(:reset_password_email_method_name, :my_mailer_method)
50
+ User.sorcery_config.reset_password_email_method_name.should equal(:my_mailer_method)
51
+ end
52
+
53
+ it "should allow configuration option 'reset_password_expiration_period'" do
54
+ sorcery_model_property_set(:reset_password_expiration_period, 16)
55
+ User.sorcery_config.reset_password_expiration_period.should equal(16)
56
+ end
57
+
58
+ it "should allow configuration option 'reset_password_email_sent_at_attribute_name'" do
59
+ sorcery_model_property_set(:reset_password_email_sent_at_attribute_name, :blabla)
60
+ User.sorcery_config.reset_password_email_sent_at_attribute_name.should equal(:blabla)
61
+ end
62
+
63
+ it "should allow configuration option 'reset_password_time_between_emails'" do
64
+ sorcery_model_property_set(:reset_password_time_between_emails, 16)
65
+ User.sorcery_config.reset_password_time_between_emails.should equal(16)
66
+ end
67
+ end
68
+
69
+ # ----------------- PLUGIN ACTIVATED -----------------------
70
+ describe User, "when activated with sorcery" do
71
+
72
+ before(:all) do
73
+ sorcery_reload!([:reset_password], :reset_password_mailer => ::SorceryMailer)
74
+ end
75
+
76
+ before(:each) do
77
+ User.delete_all
78
+ end
79
+
80
+ it "load_from_reset_password_token should return user when token is found" do
81
+ create_new_user
82
+ @user.deliver_reset_password_instructions!
83
+ User.load_from_reset_password_token(@user.reset_password_token).should == @user
84
+ end
85
+
86
+ it "load_from_reset_password_token should NOT return user when token is NOT found" do
87
+ create_new_user
88
+ @user.deliver_reset_password_instructions!
89
+ User.load_from_reset_password_token("a").should == nil
90
+ end
91
+
92
+ it "load_from_reset_password_token should return user when token is found and not expired" do
93
+ create_new_user
94
+ sorcery_model_property_set(:reset_password_expiration_period, 500)
95
+ @user.deliver_reset_password_instructions!
96
+ User.load_from_reset_password_token(@user.reset_password_token).should == @user
97
+ end
98
+
99
+ it "load_from_reset_password_token should NOT return user when token is found and expired" do
100
+ create_new_user
101
+ sorcery_model_property_set(:reset_password_expiration_period, 0.1)
102
+ @user.deliver_reset_password_instructions!
103
+ sleep 0.5
104
+ User.load_from_reset_password_token(@user.reset_password_token).should == nil
105
+ end
106
+
107
+ it "load_from_reset_password_token should always be valid if expiration period is nil" do
108
+ create_new_user
109
+ sorcery_model_property_set(:reset_password_expiration_period, nil)
110
+ @user.deliver_reset_password_instructions!
111
+ User.load_from_reset_password_token(@user.reset_password_token).should == @user
112
+ end
113
+
114
+ it "load_from_reset_password_token should return nil if token is blank" do
115
+ User.load_from_reset_password_token(nil).should == nil
116
+ User.load_from_reset_password_token("").should == nil
117
+ end
118
+
119
+ it "'deliver_reset_password_instructions!' should generate a reset_password_token" do
120
+ create_new_user
121
+ @user.reset_password_token.should be_nil
122
+ @user.deliver_reset_password_instructions!
123
+ @user.reset_password_token.should_not be_nil
124
+ end
125
+
126
+ it "the reset_password_token should be random" do
127
+ create_new_user
128
+ sorcery_model_property_set(:reset_password_time_between_emails, 0)
129
+ @user.deliver_reset_password_instructions!
130
+ old_password_code = @user.reset_password_token
131
+ @user.deliver_reset_password_instructions!
132
+ @user.reset_password_token.should_not == old_password_code
133
+ end
134
+
135
+ it "should send an email on reset" do
136
+ create_new_user
137
+ old_size = ActionMailer::Base.deliveries.size
138
+ @user.deliver_reset_password_instructions!
139
+ ActionMailer::Base.deliveries.size.should == old_size + 1
140
+ end
141
+
142
+ it "when reset_password! is called, should delete reset_password_token" do
143
+ create_new_user
144
+ @user.deliver_reset_password_instructions!
145
+ @user.reset_password_token.should_not be_nil
146
+ @user.reset_password!(:password => "blabulsdf")
147
+ @user.save!
148
+ @user.reset_password_token.should be_nil
149
+ end
150
+
151
+ it "should not send an email if time between emails has not passed since last email" do
152
+ create_new_user
153
+ sorcery_model_property_set(:reset_password_time_between_emails, 10000)
154
+ old_size = ActionMailer::Base.deliveries.size
155
+ @user.deliver_reset_password_instructions!
156
+ ActionMailer::Base.deliveries.size.should == old_size + 1
157
+ @user.deliver_reset_password_instructions!
158
+ ActionMailer::Base.deliveries.size.should == old_size + 1
159
+ end
160
+
161
+ it "should send an email if time between emails has passed since last email" do
162
+ create_new_user
163
+ sorcery_model_property_set(:reset_password_time_between_emails, 0.5)
164
+ old_size = ActionMailer::Base.deliveries.size
165
+ @user.deliver_reset_password_instructions!
166
+ ActionMailer::Base.deliveries.size.should == old_size + 1
167
+ sleep 0.5
168
+ @user.deliver_reset_password_instructions!
169
+ ActionMailer::Base.deliveries.size.should == old_size + 2
170
+ end
171
+
172
+ it "if mailer is nil on activation, throw exception!" do
173
+ expect{sorcery_reload!([:reset_password])}.to raise_error(ArgumentError)
174
+ end
175
+
176
+ end
177
+
178
+ end
@@ -1,9 +1,9 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
- require File.expand_path(File.dirname(__FILE__) + '/app_root/app/mailers/sorcery_mailer')
2
+ require File.expand_path(File.dirname(__FILE__) + '/../sorcery_mailer')
3
3
 
4
4
  describe "User with no submodules (core)" do
5
5
  before(:all) do
6
- plugin_model_configure
6
+ sorcery_reload!
7
7
  end
8
8
 
9
9
  describe User, "when app has plugin loaded" do
@@ -36,55 +36,55 @@ describe "User with no submodules (core)" do
36
36
  end
37
37
 
38
38
  it "should enable configuration option 'username_attribute_name'" do
39
- plugin_set_model_config_property(:username_attribute_name, :email)
39
+ sorcery_model_property_set(:username_attribute_name, :email)
40
40
  User.sorcery_config.username_attribute_name.should equal(:email)
41
41
  end
42
42
 
43
43
  it "should enable configuration option 'password_attribute_name'" do
44
- plugin_set_model_config_property(:password_attribute_name, :mypassword)
44
+ sorcery_model_property_set(:password_attribute_name, :mypassword)
45
45
  User.sorcery_config.password_attribute_name.should equal(:mypassword)
46
46
  end
47
47
 
48
48
  it "should enable configuration option 'email_attribute_name'" do
49
- plugin_set_model_config_property(:email_attribute_name, :my_email)
49
+ sorcery_model_property_set(:email_attribute_name, :my_email)
50
50
  User.sorcery_config.email_attribute_name.should equal(:my_email)
51
51
  end
52
52
 
53
53
  it "should enable configuration option 'crypted_password_attribute_name'" do
54
- plugin_set_model_config_property(:crypted_password_attribute_name, :password)
54
+ sorcery_model_property_set(:crypted_password_attribute_name, :password)
55
55
  User.sorcery_config.crypted_password_attribute_name.should equal(:password)
56
56
  end
57
57
 
58
58
  it "should enable configuration option 'salt_attribute_name'" do
59
- plugin_set_model_config_property(:salt_attribute_name, :my_salt)
59
+ sorcery_model_property_set(:salt_attribute_name, :my_salt)
60
60
  User.sorcery_config.salt_attribute_name.should equal(:my_salt)
61
61
  end
62
62
 
63
63
  it "should enable configuration option 'encryption_algorithm'" do
64
- plugin_set_model_config_property(:encryption_algorithm, :none)
64
+ sorcery_model_property_set(:encryption_algorithm, :none)
65
65
  User.sorcery_config.encryption_algorithm.should equal(:none)
66
66
  end
67
67
 
68
68
  it "should enable configuration option 'encryption_key'" do
69
- plugin_set_model_config_property(:encryption_key, 'asdadas424234242')
69
+ sorcery_model_property_set(:encryption_key, 'asdadas424234242')
70
70
  User.sorcery_config.encryption_key.should == 'asdadas424234242'
71
71
  end
72
72
 
73
73
  it "should enable configuration option 'custom_encryption_provider'" do
74
- plugin_set_model_config_property(:encryption_algorithm, :custom)
75
- plugin_set_model_config_property(:custom_encryption_provider, Array)
74
+ sorcery_model_property_set(:encryption_algorithm, :custom)
75
+ sorcery_model_property_set(:custom_encryption_provider, Array)
76
76
  User.sorcery_config.custom_encryption_provider.should equal(Array)
77
77
  end
78
78
 
79
79
  it "should enable configuration option 'salt_join_token'" do
80
80
  salt_join_token = "--%%*&-"
81
- plugin_set_model_config_property(:salt_join_token, salt_join_token)
81
+ sorcery_model_property_set(:salt_join_token, salt_join_token)
82
82
  User.sorcery_config.salt_join_token.should equal(salt_join_token)
83
83
  end
84
84
 
85
85
  it "should enable configuration option 'stretches'" do
86
86
  stretches = 15
87
- plugin_set_model_config_property(:stretches, stretches)
87
+ sorcery_model_property_set(:stretches, stretches)
88
88
  User.sorcery_config.stretches.should equal(stretches)
89
89
  end
90
90
 
@@ -93,7 +93,7 @@ describe "User with no submodules (core)" do
93
93
  # ----------------- PLUGIN ACTIVATED -----------------------
94
94
  describe User, "when activated with sorcery" do
95
95
  before(:all) do
96
- plugin_model_configure()
96
+ sorcery_reload!()
97
97
  end
98
98
 
99
99
  before(:each) do
@@ -124,7 +124,7 @@ describe "User with no submodules (core)" do
124
124
  describe User, "registration" do
125
125
 
126
126
  before(:all) do
127
- plugin_model_configure()
127
+ sorcery_reload!()
128
128
  end
129
129
 
130
130
  before(:each) do
@@ -159,9 +159,9 @@ describe "User with no submodules (core)" do
159
159
  it "should not clear the virtual password field if save failed due to exception" do
160
160
  create_new_user
161
161
  @user.password = 'blupush'
162
- @user.email = nil
162
+ @user.username = nil
163
163
  begin
164
- @user.save # triggers SQL exception since email field is defined not null.
164
+ @user.save # triggers SQL exception since username field is defined not null.
165
165
  rescue
166
166
  end
167
167
  @user.password.should_not be_nil
@@ -186,7 +186,7 @@ describe "User with no submodules (core)" do
186
186
  # ----------------- PASSWORD ENCRYPTION -----------------------
187
187
  describe User, "special encryption cases" do
188
188
  before(:all) do
189
- plugin_model_configure()
189
+ sorcery_reload!()
190
190
  @text = "Some Text!"
191
191
  end
192
192
 
@@ -199,7 +199,7 @@ describe "User with no submodules (core)" do
199
199
  end
200
200
 
201
201
  it "should work with no password encryption" do
202
- plugin_set_model_config_property(:encryption_algorithm, :none)
202
+ sorcery_model_property_set(:encryption_algorithm, :none)
203
203
  create_new_user
204
204
  User.authenticate(@user.send(User.sorcery_config.username_attribute_name), 'secret').should be_true
205
205
  end
@@ -214,66 +214,66 @@ describe "User with no submodules (core)" do
214
214
  crypted = encrypt(*tokens)
215
215
  end
216
216
  end
217
- plugin_set_model_config_property(:encryption_algorithm, :custom)
218
- plugin_set_model_config_property(:custom_encryption_provider, MyCrypto)
217
+ sorcery_model_property_set(:encryption_algorithm, :custom)
218
+ sorcery_model_property_set(:custom_encryption_provider, MyCrypto)
219
219
  create_new_user
220
220
  User.authenticate(@user.send(User.sorcery_config.username_attribute_name), 'secret').should be_true
221
221
  end
222
222
 
223
223
  it "if encryption algo is aes256, it should set key to crypto provider" do
224
- plugin_set_model_config_property(:encryption_algorithm, :aes256)
225
- plugin_set_model_config_property(:encryption_key, nil)
224
+ sorcery_model_property_set(:encryption_algorithm, :aes256)
225
+ sorcery_model_property_set(:encryption_key, nil)
226
226
  expect{User.encrypt(@text)}.to raise_error(ArgumentError)
227
- plugin_set_model_config_property(:encryption_key, "asd234dfs423fddsmndsflktsdf32343")
227
+ sorcery_model_property_set(:encryption_key, "asd234dfs423fddsmndsflktsdf32343")
228
228
  expect{User.encrypt(@text)}.to_not raise_error(ArgumentError)
229
229
  end
230
230
 
231
231
  it "if encryption algo is aes256, it should set key to crypto provider, even if attributes are set in reverse" do
232
- plugin_set_model_config_property(:encryption_key, nil)
233
- plugin_set_model_config_property(:encryption_algorithm, :none)
234
- plugin_set_model_config_property(:encryption_key, "asd234dfs423fddsmndsflktsdf32343")
235
- plugin_set_model_config_property(:encryption_algorithm, :aes256)
232
+ sorcery_model_property_set(:encryption_key, nil)
233
+ sorcery_model_property_set(:encryption_algorithm, :none)
234
+ sorcery_model_property_set(:encryption_key, "asd234dfs423fddsmndsflktsdf32343")
235
+ sorcery_model_property_set(:encryption_algorithm, :aes256)
236
236
  expect{User.encrypt(@text)}.to_not raise_error(ArgumentError)
237
237
  end
238
238
 
239
239
  it "if encryption algo is md5 it should work" do
240
- plugin_set_model_config_property(:encryption_algorithm, :md5)
240
+ sorcery_model_property_set(:encryption_algorithm, :md5)
241
241
  User.encrypt(@text).should == Sorcery::CryptoProviders::MD5.encrypt(@text)
242
242
  end
243
243
 
244
244
  it "if encryption algo is sha1 it should work" do
245
- plugin_set_model_config_property(:encryption_algorithm, :sha1)
245
+ sorcery_model_property_set(:encryption_algorithm, :sha1)
246
246
  User.encrypt(@text).should == Sorcery::CryptoProviders::SHA1.encrypt(@text)
247
247
  end
248
248
 
249
249
  it "if encryption algo is sha256 it should work" do
250
- plugin_set_model_config_property(:encryption_algorithm, :sha256)
250
+ sorcery_model_property_set(:encryption_algorithm, :sha256)
251
251
  User.encrypt(@text).should == Sorcery::CryptoProviders::SHA256.encrypt(@text)
252
252
  end
253
253
 
254
254
  it "if encryption algo is sha512 it should work" do
255
- plugin_set_model_config_property(:encryption_algorithm, :sha512)
255
+ sorcery_model_property_set(:encryption_algorithm, :sha512)
256
256
  User.encrypt(@text).should == Sorcery::CryptoProviders::SHA512.encrypt(@text)
257
257
  end
258
258
 
259
259
  it "salt should be random for each user and saved in db" do
260
- plugin_set_model_config_property(:salt_attribute_name, :salt)
260
+ sorcery_model_property_set(:salt_attribute_name, :salt)
261
261
  create_new_user
262
262
  @user.salt.should_not be_nil
263
263
  end
264
264
 
265
265
  it "if salt is set should use it to encrypt" do
266
- plugin_set_model_config_property(:salt_attribute_name, :salt)
267
- plugin_set_model_config_property(:encryption_algorithm, :sha512)
266
+ sorcery_model_property_set(:salt_attribute_name, :salt)
267
+ sorcery_model_property_set(:encryption_algorithm, :sha512)
268
268
  create_new_user
269
269
  @user.crypted_password.should_not == Sorcery::CryptoProviders::SHA512.encrypt('secret')
270
270
  @user.crypted_password.should == Sorcery::CryptoProviders::SHA512.encrypt('secret',@user.salt)
271
271
  end
272
272
 
273
273
  it "if salt_join_token is set should use it to encrypt" do
274
- plugin_set_model_config_property(:salt_attribute_name, :salt)
275
- plugin_set_model_config_property(:salt_join_token, "-@=>")
276
- plugin_set_model_config_property(:encryption_algorithm, :sha512)
274
+ sorcery_model_property_set(:salt_attribute_name, :salt)
275
+ sorcery_model_property_set(:salt_join_token, "-@=>")
276
+ sorcery_model_property_set(:encryption_algorithm, :sha512)
277
277
  create_new_user
278
278
  @user.crypted_password.should_not == Sorcery::CryptoProviders::SHA512.encrypt('secret')
279
279
  Sorcery::CryptoProviders::SHA512.join_token = ""
@@ -283,5 +283,35 @@ describe "User with no submodules (core)" do
283
283
  end
284
284
 
285
285
  end
286
+
287
+ describe User, "external users" do
288
+ before(:all) do
289
+ ActiveRecord::Migrator.migrate("#{APP_ROOT}/db/migrate/external")
290
+ sorcery_reload!()
291
+ end
292
+
293
+ after(:all) do
294
+ ActiveRecord::Migrator.rollback("#{APP_ROOT}/db/migrate/external")
295
+ end
296
+
297
+ before(:each) do
298
+ User.delete_all
299
+ end
300
+
301
+ it "should respond to 'external?'" do
302
+ create_new_user
303
+ @user.should respond_to(:external?)
304
+ end
305
+
306
+ it "external? should be false for regular users" do
307
+ create_new_user
308
+ @user.external?.should be_false
309
+ end
310
+
311
+ it "external? should be true for external users" do
312
+ create_new_external_user(:twitter)
313
+ @user.external?.should be_true
314
+ end
315
+ end
286
316
 
287
317
  end
@@ -0,0 +1,6 @@
1
+ class User < ActiveRecord::Base
2
+ attr_accessible :email, :password, :password_confirmation, :authentications_attributes
3
+
4
+ has_many :authentications, :dependent => :destroy
5
+ accepts_nested_attributes_for :authentications
6
+ end
@@ -0,0 +1,4 @@
1
+ <%= @user %> bla bla
2
+
3
+ hourdyasd
4
+ <bla>
@@ -0,0 +1,18 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+
4
+ require 'simplecov'
5
+ SimpleCov.root File.join(File.dirname(__FILE__), '..', 'lib')
6
+ SimpleCov.start
7
+
8
+
9
+ require 'rspec'
10
+ require 'sorcery'
11
+
12
+ # Requires supporting files with custom matchers and macros, etc,
13
+ # in ./support/ and its subdirectories.
14
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
15
+
16
+ RSpec.configure do |config|
17
+
18
+ end