sorcery 0.5.0 → 0.6.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 (98) hide show
  1. data/README.rdoc +9 -1
  2. data/VERSION +1 -1
  3. data/lib/sorcery/controller/adapters/sinatra.rb +35 -28
  4. data/lib/sorcery/controller/submodules/activity_logging.rb +11 -7
  5. data/lib/sorcery/controller/submodules/brute_force_protection.rb +8 -5
  6. data/lib/sorcery/controller/submodules/external.rb +11 -6
  7. data/lib/sorcery/controller/submodules/http_basic_auth.rb +12 -7
  8. data/lib/sorcery/controller/submodules/remember_me.rb +14 -5
  9. data/lib/sorcery/controller/submodules/session_timeout.rb +3 -1
  10. data/lib/sorcery/controller.rb +12 -9
  11. data/lib/sorcery/crypto_providers/aes256.rb +8 -5
  12. data/lib/sorcery/crypto_providers/bcrypt.rb +12 -6
  13. data/lib/sorcery/crypto_providers/sha256.rb +2 -1
  14. data/lib/sorcery/crypto_providers/sha512.rb +2 -1
  15. data/lib/sorcery/engine.rb +0 -7
  16. data/lib/sorcery/initializers/initializer.rb +127 -36
  17. data/lib/sorcery/model/adapters/active_record.rb +2 -2
  18. data/lib/sorcery/model/adapters/mongoid.rb +12 -7
  19. data/lib/sorcery/model/submodules/activity_logging.rb +7 -6
  20. data/lib/sorcery/model/submodules/brute_force_protection.rb +10 -6
  21. data/lib/sorcery/model/submodules/external.rb +4 -2
  22. data/lib/sorcery/model/submodules/remember_me.rb +4 -3
  23. data/lib/sorcery/model/submodules/reset_password.rb +21 -11
  24. data/lib/sorcery/model/submodules/user_activation.rb +23 -10
  25. data/lib/sorcery/model/temporary_token.rb +3 -2
  26. data/lib/sorcery/model.rb +60 -29
  27. data/lib/sorcery/test_helpers/internal/rails.rb +6 -1
  28. data/lib/sorcery/test_helpers/internal/sinatra.rb +3 -3
  29. data/lib/sorcery/test_helpers/internal/sinatra_modular.rb +74 -0
  30. data/lib/sorcery/test_helpers/internal.rb +2 -1
  31. data/lib/sorcery.rb +3 -5
  32. data/sorcery.gemspec +72 -2
  33. data/spec/Gemfile.lock +1 -4
  34. data/spec/rails3/Gemfile.lock +1 -4
  35. data/spec/rails3/spec/controller_oauth2_spec.rb +3 -24
  36. data/spec/rails3/spec/controller_oauth_spec.rb +3 -24
  37. data/spec/rails3/spec/controller_spec.rb +2 -2
  38. data/spec/rails3/spec/user_activation_spec.rb +2 -168
  39. data/spec/rails3/spec/user_activity_logging_spec.rb +2 -30
  40. data/spec/rails3/spec/user_brute_force_protection_spec.rb +2 -35
  41. data/spec/rails3/spec/user_oauth_spec.rb +2 -26
  42. data/spec/rails3/spec/user_remember_me_spec.rb +2 -45
  43. data/spec/rails3/spec/user_reset_password_spec.rb +3 -168
  44. data/spec/rails3/spec/user_spec.rb +3 -293
  45. data/spec/rails3_mongoid/Gemfile.lock +1 -4
  46. data/spec/rails3_mongoid/app/models/authentication.rb +3 -3
  47. data/spec/rails3_mongoid/spec/user_activation_spec.rb +2 -171
  48. data/spec/rails3_mongoid/spec/user_activity_logging_spec.rb +2 -25
  49. data/spec/rails3_mongoid/spec/user_brute_force_protection_spec.rb +2 -35
  50. data/spec/rails3_mongoid/spec/user_oauth_spec.rb +2 -28
  51. data/spec/rails3_mongoid/spec/user_remember_me_spec.rb +2 -45
  52. data/spec/rails3_mongoid/spec/user_reset_password_spec.rb +2 -168
  53. data/spec/rails3_mongoid/spec/user_spec.rb +3 -295
  54. data/spec/shared_examples/controller_oauth2_shared_examples.rb +37 -0
  55. data/spec/shared_examples/controller_oauth_shared_examples.rb +37 -0
  56. data/spec/shared_examples/user_activation_shared_examples.rb +173 -0
  57. data/spec/shared_examples/user_activity_logging_shared_examples.rb +27 -0
  58. data/spec/shared_examples/user_brute_force_protection_shared_examples.rb +37 -0
  59. data/spec/shared_examples/user_oauth_shared_examples.rb +31 -0
  60. data/spec/shared_examples/user_remember_me_shared_examples.rb +47 -0
  61. data/spec/shared_examples/user_reset_password_shared_examples.rb +177 -0
  62. data/spec/shared_examples/user_shared_examples.rb +292 -0
  63. data/spec/sinatra/Gemfile +3 -0
  64. data/spec/sinatra/Gemfile.lock +17 -34
  65. data/spec/sinatra/Rakefile +1 -1
  66. data/spec/sinatra/filters.rb +20 -14
  67. data/spec/sinatra/modular.rb +157 -0
  68. data/spec/sinatra/spec/controller_oauth2_spec.rb +3 -24
  69. data/spec/sinatra/spec/controller_oauth_spec.rb +3 -24
  70. data/spec/sinatra/spec/controller_spec.rb +2 -2
  71. data/spec/sinatra_modular/Gemfile +15 -0
  72. data/spec/sinatra_modular/Gemfile.lock +117 -0
  73. data/spec/sinatra_modular/Rakefile +11 -0
  74. data/spec/sinatra_modular/authentication.rb +3 -0
  75. data/spec/sinatra_modular/db/migrate/activation/20101224223622_add_activation_to_users.rb +17 -0
  76. data/spec/sinatra_modular/db/migrate/activity_logging/20101224223624_add_activity_logging_to_users.rb +17 -0
  77. data/spec/sinatra_modular/db/migrate/brute_force_protection/20101224223626_add_brute_force_protection_to_users.rb +11 -0
  78. data/spec/sinatra_modular/db/migrate/core/20101224223620_create_users.rb +16 -0
  79. data/spec/sinatra_modular/db/migrate/external/20101224223628_create_authentications.rb +14 -0
  80. data/spec/sinatra_modular/db/migrate/remember_me/20101224223623_add_remember_me_token_to_users.rb +15 -0
  81. data/spec/sinatra_modular/db/migrate/reset_password/20101224223622_add_reset_password_to_users.rb +13 -0
  82. data/spec/sinatra_modular/filters.rb +27 -0
  83. data/spec/sinatra_modular/modular.rb +157 -0
  84. data/spec/sinatra_modular/myapp.rb +133 -0
  85. data/spec/sinatra_modular/sorcery_mailer.rb +25 -0
  86. data/spec/sinatra_modular/spec_modular/controller_activity_logging_spec.rb +85 -0
  87. data/spec/sinatra_modular/spec_modular/controller_brute_force_protection_spec.rb +70 -0
  88. data/spec/sinatra_modular/spec_modular/controller_http_basic_auth_spec.rb +53 -0
  89. data/spec/sinatra_modular/spec_modular/controller_oauth2_spec.rb +99 -0
  90. data/spec/sinatra_modular/spec_modular/controller_oauth_spec.rb +100 -0
  91. data/spec/sinatra_modular/spec_modular/controller_remember_me_spec.rb +64 -0
  92. data/spec/sinatra_modular/spec_modular/controller_session_timeout_spec.rb +57 -0
  93. data/spec/sinatra_modular/spec_modular/controller_spec.rb +116 -0
  94. data/spec/sinatra_modular/spec_modular/spec.opts +2 -0
  95. data/spec/sinatra_modular/spec_modular/spec_helper.rb +51 -0
  96. data/spec/sinatra_modular/user.rb +6 -0
  97. data/spec/sinatra_modular/views/test_login.erb +4 -0
  98. metadata +72 -2
@@ -1,5 +1,6 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
  require File.expand_path(File.dirname(__FILE__) + '/../app/mailers/sorcery_mailer')
3
+ require File.expand_path(File.dirname(__FILE__) + '/../../shared_examples/user_shared_examples')
3
4
 
4
5
  describe "User with no submodules (core)" do
5
6
  before(:all) do
@@ -15,284 +16,10 @@ describe "User with no submodules (core)" do
15
16
  User.should respond_to(:authenticates_with_sorcery!)
16
17
  end
17
18
  end
18
-
19
- # ----------------- PLUGIN ACTIVATION -----------------------
20
- describe TestUser, "Testing activated class self-registration" do
21
- it "should register itself as user_class if activated" do
22
- TestUser.class_eval do
23
- authenticates_with_sorcery!
24
- end
25
- ::Sorcery::Controller::Config.user_class.should == TestUser
26
- end
27
- end
28
19
 
29
20
  # ----------------- PLUGIN CONFIGURATION -----------------------
30
- describe User, "loaded plugin configuration" do
31
- after(:each) do
32
- User.sorcery_config.reset!
33
- end
34
-
35
- it "should enable configuration option 'username_attribute_name'" do
36
- sorcery_model_property_set(:username_attribute_name, :email)
37
- User.sorcery_config.username_attribute_name.should equal(:email)
38
- end
39
-
40
- it "should enable configuration option 'password_attribute_name'" do
41
- sorcery_model_property_set(:password_attribute_name, :mypassword)
42
- User.sorcery_config.password_attribute_name.should equal(:mypassword)
43
- end
44
-
45
- it "should enable configuration option 'email_attribute_name'" do
46
- sorcery_model_property_set(:email_attribute_name, :my_email)
47
- User.sorcery_config.email_attribute_name.should equal(:my_email)
48
- end
49
-
50
- it "should enable configuration option 'crypted_password_attribute_name'" do
51
- sorcery_model_property_set(:crypted_password_attribute_name, :password)
52
- User.sorcery_config.crypted_password_attribute_name.should equal(:password)
53
- end
54
-
55
- it "should enable configuration option 'salt_attribute_name'" do
56
- sorcery_model_property_set(:salt_attribute_name, :my_salt)
57
- User.sorcery_config.salt_attribute_name.should equal(:my_salt)
58
- end
59
21
 
60
- it "should enable configuration option 'encryption_algorithm'" do
61
- sorcery_model_property_set(:encryption_algorithm, :none)
62
- User.sorcery_config.encryption_algorithm.should equal(:none)
63
- end
64
-
65
- it "should enable configuration option 'encryption_key'" do
66
- sorcery_model_property_set(:encryption_key, 'asdadas424234242')
67
- User.sorcery_config.encryption_key.should == 'asdadas424234242'
68
- end
69
-
70
- it "should enable configuration option 'custom_encryption_provider'" do
71
- sorcery_model_property_set(:encryption_algorithm, :custom)
72
- sorcery_model_property_set(:custom_encryption_provider, Array)
73
- User.sorcery_config.custom_encryption_provider.should equal(Array)
74
- end
75
-
76
- it "should enable configuration option 'salt_join_token'" do
77
- salt_join_token = "--%%*&-"
78
- sorcery_model_property_set(:salt_join_token, salt_join_token)
79
- User.sorcery_config.salt_join_token.should equal(salt_join_token)
80
- end
81
-
82
- it "should enable configuration option 'stretches'" do
83
- stretches = 15
84
- sorcery_model_property_set(:stretches, stretches)
85
- User.sorcery_config.stretches.should equal(stretches)
86
- end
87
-
88
- end
89
-
90
- # ----------------- PLUGIN ACTIVATED -----------------------
91
- describe User, "when activated with sorcery" do
92
- before(:all) do
93
- sorcery_reload!()
94
- end
95
-
96
- before(:each) do
97
- User.delete_all
98
- end
99
-
100
- it "should respond to class method authenticate" do
101
- ActiveRecord::Base.should_not respond_to(:authenticate)
102
- User.should respond_to(:authenticate)
103
- end
104
-
105
- it "authenticate should return true if credentials are good" do
106
- create_new_user
107
- User.authenticate(@user.send(User.sorcery_config.username_attribute_name), 'secret').should be_true
108
- end
109
-
110
- it "authenticate should return false if credentials are bad" do
111
- create_new_user
112
- User.authenticate(@user.send(User.sorcery_config.username_attribute_name), 'wrong!').should be_false
113
- end
114
-
115
- specify { User.should respond_to(:encrypt) }
116
-
117
- it "subclass should inherit config if defined so" do
118
- sorcery_reload!([],{:subclasses_inherit_config => true})
119
- class Admin < User
120
- end
121
- Admin.sorcery_config.should_not be_nil
122
- Admin.sorcery_config.should == User.sorcery_config
123
- end
124
-
125
- it "subclass should not inherit config if not defined so" do
126
- sorcery_reload!([],{:subclasses_inherit_config => false})
127
- class Admin2 < User
128
- end
129
- Admin2.sorcery_config.should be_nil
130
- end
131
- end
132
-
133
- # ----------------- REGISTRATION -----------------------
134
- describe User, "registration" do
135
-
136
- before(:all) do
137
- sorcery_reload!()
138
- end
139
-
140
- before(:each) do
141
- User.delete_all
142
- end
143
-
144
- it "by default, encryption_provider should not be nil" do
145
- User.sorcery_config.encryption_provider.should_not be_nil
146
- end
147
-
148
- it "should encrypt password when a new user is saved" do
149
- create_new_user
150
- User.sorcery_config.encryption_provider.matches?(@user.send(User.sorcery_config.crypted_password_attribute_name),'secret',@user.salt).should be_true
151
- end
152
-
153
- it "should clear the virtual password field if the encryption process worked" do
154
- create_new_user
155
- @user.password.should be_nil
156
- end
157
-
158
- it "should not clear the virtual password field if save failed due to validity" do
159
- create_new_user
160
- User.class_eval do
161
- validates_format_of :email, :with => /^(.)+@(.)+$/, :if => Proc.new {|r| r.email}, :message => "is invalid"
162
- end
163
- @user.password = 'blupush'
164
- @user.email = 'asd'
165
- @user.save
166
- @user.password.should_not be_nil
167
- end
168
-
169
- it "should not clear the virtual password field if save failed due to exception" do
170
- create_new_user
171
- @user.password = 'blupush'
172
- @user.username = nil
173
- begin
174
- @user.save # triggers SQL exception since username field is defined not null.
175
- rescue
176
- end
177
- @user.password.should_not be_nil
178
- end
179
-
180
- it "should not encrypt the password twice when a user is updated" do
181
- create_new_user
182
- @user.email = "blup@bla.com"
183
- @user.save!
184
- User.sorcery_config.encryption_provider.matches?(@user.send(User.sorcery_config.crypted_password_attribute_name),'secret',@user.salt).should be_true
185
- end
186
-
187
- it "should replace the crypted_password in case a new password is set" do
188
- create_new_user
189
- @user.password = 'new_secret'
190
- @user.save!
191
- User.sorcery_config.encryption_provider.matches?(@user.send(User.sorcery_config.crypted_password_attribute_name),'secret',@user.salt).should be_false
192
- end
193
-
194
- end
195
-
196
- # ----------------- PASSWORD ENCRYPTION -----------------------
197
- describe User, "special encryption cases" do
198
- before(:all) do
199
- sorcery_reload!()
200
- @text = "Some Text!"
201
- end
202
-
203
- before(:each) do
204
- User.delete_all
205
- end
206
-
207
- after(:each) do
208
- User.sorcery_config.reset!
209
- end
210
-
211
- it "should work with no password encryption" do
212
- sorcery_model_property_set(:encryption_algorithm, :none)
213
- create_new_user
214
- User.authenticate(@user.send(User.sorcery_config.username_attribute_name), 'secret').should be_true
215
- end
216
-
217
- it "should work with custom password encryption" do
218
- class MyCrypto
219
- def self.encrypt(*tokens)
220
- tokens.flatten.join('').gsub(/e/,'A')
221
- end
222
-
223
- def self.matches?(crypted,*tokens)
224
- crypted = encrypt(*tokens)
225
- end
226
- end
227
- sorcery_model_property_set(:encryption_algorithm, :custom)
228
- sorcery_model_property_set(:custom_encryption_provider, MyCrypto)
229
- create_new_user
230
- User.authenticate(@user.send(User.sorcery_config.username_attribute_name), 'secret').should be_true
231
- end
232
-
233
- it "if encryption algo is aes256, it should set key to crypto provider" do
234
- sorcery_model_property_set(:encryption_algorithm, :aes256)
235
- sorcery_model_property_set(:encryption_key, nil)
236
- expect{User.encrypt(@text)}.to raise_error(ArgumentError)
237
- sorcery_model_property_set(:encryption_key, "asd234dfs423fddsmndsflktsdf32343")
238
- expect{User.encrypt(@text)}.to_not raise_error(ArgumentError)
239
- end
240
-
241
- it "if encryption algo is aes256, it should set key to crypto provider, even if attributes are set in reverse" do
242
- sorcery_model_property_set(:encryption_key, nil)
243
- sorcery_model_property_set(:encryption_algorithm, :none)
244
- sorcery_model_property_set(:encryption_key, "asd234dfs423fddsmndsflktsdf32343")
245
- sorcery_model_property_set(:encryption_algorithm, :aes256)
246
- expect{User.encrypt(@text)}.to_not raise_error(ArgumentError)
247
- end
248
-
249
- it "if encryption algo is md5 it should work" do
250
- sorcery_model_property_set(:encryption_algorithm, :md5)
251
- User.encrypt(@text).should == Sorcery::CryptoProviders::MD5.encrypt(@text)
252
- end
253
-
254
- it "if encryption algo is sha1 it should work" do
255
- sorcery_model_property_set(:encryption_algorithm, :sha1)
256
- User.encrypt(@text).should == Sorcery::CryptoProviders::SHA1.encrypt(@text)
257
- end
258
-
259
- it "if encryption algo is sha256 it should work" do
260
- sorcery_model_property_set(:encryption_algorithm, :sha256)
261
- User.encrypt(@text).should == Sorcery::CryptoProviders::SHA256.encrypt(@text)
262
- end
263
-
264
- it "if encryption algo is sha512 it should work" do
265
- sorcery_model_property_set(:encryption_algorithm, :sha512)
266
- User.encrypt(@text).should == Sorcery::CryptoProviders::SHA512.encrypt(@text)
267
- end
268
-
269
- it "salt should be random for each user and saved in db" do
270
- sorcery_model_property_set(:salt_attribute_name, :salt)
271
- create_new_user
272
- @user.salt.should_not be_nil
273
- end
274
-
275
- it "if salt is set should use it to encrypt" do
276
- sorcery_model_property_set(:salt_attribute_name, :salt)
277
- sorcery_model_property_set(:encryption_algorithm, :sha512)
278
- create_new_user
279
- @user.crypted_password.should_not == Sorcery::CryptoProviders::SHA512.encrypt('secret')
280
- @user.crypted_password.should == Sorcery::CryptoProviders::SHA512.encrypt('secret',@user.salt)
281
- end
282
-
283
- it "if salt_join_token is set should use it to encrypt" do
284
- sorcery_model_property_set(:salt_attribute_name, :salt)
285
- sorcery_model_property_set(:salt_join_token, "-@=>")
286
- sorcery_model_property_set(:encryption_algorithm, :sha512)
287
- create_new_user
288
- @user.crypted_password.should_not == Sorcery::CryptoProviders::SHA512.encrypt('secret')
289
- Sorcery::CryptoProviders::SHA512.join_token = ""
290
- @user.crypted_password.should_not == Sorcery::CryptoProviders::SHA512.encrypt('secret',@user.salt)
291
- Sorcery::CryptoProviders::SHA512.join_token = User.sorcery_config.salt_join_token
292
- @user.crypted_password.should == Sorcery::CryptoProviders::SHA512.encrypt('secret',@user.salt)
293
- end
294
-
295
- end
22
+ it_should_behave_like "rails_3_core_model"
296
23
 
297
24
  describe User, "external users" do
298
25
  before(:all) do
@@ -304,23 +31,6 @@ describe "User with no submodules (core)" do
304
31
  ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/external")
305
32
  end
306
33
 
307
- before(:each) do
308
- User.delete_all
309
- end
310
-
311
- it "should respond to 'external?'" do
312
- create_new_user
313
- @user.should respond_to(:external?)
314
- end
315
-
316
- it "external? should be false for regular users" do
317
- create_new_user
318
- @user.external?.should be_false
319
- end
320
-
321
- it "external? should be true for external users" do
322
- create_new_external_user(:twitter)
323
- @user.external?.should be_true
324
- end
34
+ it_should_behave_like "external_user"
325
35
  end
326
36
  end
@@ -2,14 +2,12 @@ PATH
2
2
  remote: ../../../
3
3
  specs:
4
4
  oauth (0.4.4)
5
- sorcery (0.5.0)
5
+ sorcery (0.5.30)
6
6
  bcrypt-ruby (~> 2.1.4)
7
- json (>= 1.5.1)
8
7
  oauth (>= 0.4.4)
9
8
  oauth (>= 0.4.4)
10
9
  oauth2 (>= 0.1.1)
11
10
  oauth2 (>= 0.1.1)
12
- rails (>= 3.0.0)
13
11
 
14
12
  GEM
15
13
  remote: http://rubygems.org/
@@ -57,7 +55,6 @@ GEM
57
55
  multipart-post (~> 1.1.0)
58
56
  rack (< 2, >= 1.1.0)
59
57
  i18n (0.5.0)
60
- json (1.5.1)
61
58
  linecache19 (0.5.11)
62
59
  ruby_core_source (>= 0.1.4)
63
60
  mail (2.2.13)
@@ -1,7 +1,7 @@
1
1
  class Authentication
2
2
  include Mongoid::Document
3
- field :user_id, type: Integer
4
- field :provider, type: String
5
- field :uid, type: Integer
3
+ field :user_id, :type => Integer
4
+ field :provider, :type => String
5
+ field :uid, :type => Integer
6
6
  belongs_to :user
7
7
  end
@@ -1,178 +1,9 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
  require File.expand_path(File.dirname(__FILE__) + '/../app/mailers/sorcery_mailer')
3
+ require File.expand_path(File.dirname(__FILE__) + '/../../shared_examples/user_activation_shared_examples')
3
4
 
4
5
  describe "User with activation submodule" do
5
6
 
6
- # ----------------- PLUGIN CONFIGURATION -----------------------
7
- describe User, "loaded plugin configuration" do
8
- before(:all) do
9
- sorcery_reload!([:user_activation], :user_activation_mailer => ::SorceryMailer)
10
- end
11
-
12
- after(:each) do
13
- User.sorcery_config.reset!
14
- sorcery_reload!([:user_activation], :user_activation_mailer => ::SorceryMailer)
15
- end
16
-
17
- it "should enable configuration option 'activation_state_attribute_name'" do
18
- sorcery_model_property_set(:activation_state_attribute_name, :status)
19
- User.sorcery_config.activation_state_attribute_name.should equal(:status)
20
- end
21
-
22
- it "should enable configuration option 'activation_token_attribute_name'" do
23
- sorcery_model_property_set(:activation_token_attribute_name, :code)
24
- User.sorcery_config.activation_token_attribute_name.should equal(:code)
25
- end
26
-
27
- it "should enable configuration option 'user_activation_mailer'" do
28
- sorcery_model_property_set(:user_activation_mailer, TestMailer)
29
- User.sorcery_config.user_activation_mailer.should equal(TestMailer)
30
- end
31
-
32
- it "should enable configuration option 'activation_needed_email_method_name'" do
33
- sorcery_model_property_set(:activation_needed_email_method_name, :my_activation_email)
34
- User.sorcery_config.activation_needed_email_method_name.should equal(:my_activation_email)
35
- end
36
-
37
- it "should enable configuration option 'activation_success_email_method_name'" do
38
- sorcery_model_property_set(:activation_success_email_method_name, :my_activation_email)
39
- User.sorcery_config.activation_success_email_method_name.should equal(:my_activation_email)
40
- end
41
-
42
- it "if mailer is nil on activation, throw exception!" do
43
- expect{sorcery_reload!([:user_activation])}.to raise_error(ArgumentError)
44
- end
45
- end
46
-
47
- # ----------------- ACTIVATION PROCESS -----------------------
48
- describe User, "activation process" do
49
- before(:all) do
50
- sorcery_reload!([:user_activation], :user_activation_mailer => ::SorceryMailer)
51
- end
52
-
53
- before(:each) do
54
- create_new_user
55
- end
56
-
57
- it "should initialize user state to 'pending'" do
58
- @user.activation_state.should == "pending"
59
- end
60
-
61
- specify { @user.should respond_to(:activate!) }
62
-
63
- it "should clear activation code and change state to 'active' on activation" do
64
- activation_token = @user.activation_token
65
- @user.activate!
66
- @user2 = User.find(@user.id) # go to db to make sure it was saved and not just in memory
67
- @user2.activation_token.should be_nil
68
- @user2.activation_state.should == "active"
69
- User.find_by_activation_token(activation_token).should be_nil
70
- end
71
-
72
- it "should send the user an activation email" do
73
- old_size = ActionMailer::Base.deliveries.size
74
- create_new_user
75
- ActionMailer::Base.deliveries.size.should == old_size + 1
76
- end
77
-
78
- it "subsequent saves do not send activation email" do
79
- old_size = ActionMailer::Base.deliveries.size
80
- @user.username = "Shauli"
81
- @user.save!
82
- ActionMailer::Base.deliveries.size.should == old_size
83
- end
84
-
85
- it "should send the user an activation success email on successful activation" do
86
- old_size = ActionMailer::Base.deliveries.size
87
- @user.activate!
88
- ActionMailer::Base.deliveries.size.should == old_size + 1
89
- end
90
-
91
- it "subsequent saves do not send activation success email" do
92
- @user.activate!
93
- old_size = ActionMailer::Base.deliveries.size
94
- @user.username = "Shauli"
95
- @user.save!
96
- ActionMailer::Base.deliveries.size.should == old_size
97
- end
98
-
99
- it "activation needed email is optional" do
100
- sorcery_model_property_set(:activation_needed_email_method_name, nil)
101
- old_size = ActionMailer::Base.deliveries.size
102
- create_new_user
103
- ActionMailer::Base.deliveries.size.should == old_size
104
- end
105
-
106
- it "activation success email is optional" do
107
- sorcery_model_property_set(:activation_success_email_method_name, nil)
108
- old_size = ActionMailer::Base.deliveries.size
109
- @user.activate!
110
- ActionMailer::Base.deliveries.size.should == old_size
111
- end
112
- end
113
-
114
- describe User, "prevent non-active login feature" do
115
- before(:all) do
116
- sorcery_reload!([:user_activation], :user_activation_mailer => ::SorceryMailer)
117
- end
118
-
119
- before(:each) do
120
- User.delete_all
121
- create_new_user
122
- end
123
-
124
- it "should not allow a non-active user to authenticate" do
125
- User.authenticate(@user.username,'secret').should be_false
126
- end
127
-
128
- it "should allow a non-active user to authenticate if configured so" do
129
- sorcery_model_property_set(:prevent_non_active_users_to_login, false)
130
- User.authenticate(@user.username,'secret').should be_true
131
- end
132
- end
133
-
134
- describe User, "load_from_activation_token" do
135
- before(:all) do
136
- sorcery_reload!([:user_activation], :user_activation_mailer => ::SorceryMailer)
137
- end
138
-
139
- after(:each) do
140
- Timecop.return
141
- end
142
-
143
- it "load_from_activation_token should return user when token is found" do
144
- create_new_user
145
- User.load_from_activation_token(@user.activation_token).should == @user
146
- end
147
-
148
- it "load_from_activation_token should NOT return user when token is NOT found" do
149
- create_new_user
150
- User.load_from_activation_token("a").should == nil
151
- end
152
-
153
- it "load_from_activation_token should return user when token is found and not expired" do
154
- sorcery_model_property_set(:activation_token_expiration_period, 500)
155
- create_new_user
156
- User.load_from_activation_token(@user.activation_token).should == @user
157
- end
158
-
159
- it "load_from_activation_token should NOT return user when token is found and expired" do
160
- sorcery_model_property_set(:activation_token_expiration_period, 0.1)
161
- create_new_user
162
- Timecop.travel(Time.now+0.5)
163
- User.load_from_activation_token(@user.activation_token).should == nil
164
- end
165
-
166
- it "load_from_activation_token should return nil if token is blank" do
167
- User.load_from_activation_token(nil).should == nil
168
- User.load_from_activation_token("").should == nil
169
- end
170
-
171
- it "load_from_activation_token should always be valid if expiration period is nil" do
172
- sorcery_model_property_set(:activation_token_expiration_period, nil)
173
- create_new_user
174
- User.load_from_activation_token(@user.activation_token).should == @user
175
- end
176
- end
7
+ it_behaves_like "rails_3_activation_model"
177
8
 
178
9
  end
@@ -1,31 +1,8 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require File.expand_path(File.dirname(__FILE__) + '/../../shared_examples/user_activity_logging_shared_examples')
2
3
 
3
4
  describe "User with activity logging submodule" do
4
5
 
5
- # ----------------- PLUGIN CONFIGURATION -----------------------
6
- describe User, "loaded plugin configuration" do
7
- before(:all) do
8
- sorcery_reload!([:activity_logging])
9
- end
10
-
11
- after(:each) do
12
- User.sorcery_config.reset!
13
- end
14
-
15
- it "should allow configuration option 'last_login_at_attribute_name'" do
16
- sorcery_model_property_set(:last_login_at_attribute_name, :login_time)
17
- User.sorcery_config.last_login_at_attribute_name.should equal(:login_time)
18
- end
19
-
20
- it "should allow configuration option 'last_logout_at_attribute_name'" do
21
- sorcery_model_property_set(:last_logout_at_attribute_name, :logout_time)
22
- User.sorcery_config.last_logout_at_attribute_name.should equal(:logout_time)
23
- end
24
-
25
- it "should allow configuration option 'last_activity_at_attribute_name'" do
26
- sorcery_model_property_set(:last_activity_at_attribute_name, :activity_time)
27
- User.sorcery_config.last_activity_at_attribute_name.should equal(:activity_time)
28
- end
29
- end
6
+ it_behaves_like "rails_3_activity_logging_model"
30
7
 
31
8
  end
@@ -1,41 +1,8 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require File.expand_path(File.dirname(__FILE__) + '/../../shared_examples/user_brute_force_protection_shared_examples')
2
3
 
3
4
  describe "User with brute_force_protection submodule" do
4
5
 
5
- # ----------------- PLUGIN CONFIGURATION -----------------------
6
- describe User, "loaded plugin configuration" do
7
-
8
- before(:all) do
9
- sorcery_reload!([:brute_force_protection])
10
- create_new_user
11
- end
12
-
13
- after(:each) do
14
- User.sorcery_config.reset!
15
- end
16
-
17
- specify { @user.should respond_to(:failed_logins_count) }
18
- specify { @user.should respond_to(:lock_expires_at) }
19
-
20
- it "should enable configuration option 'failed_logins_count_attribute_name'" do
21
- sorcery_model_property_set(:failed_logins_count_attribute_name, :my_count)
22
- User.sorcery_config.failed_logins_count_attribute_name.should equal(:my_count)
23
- end
24
-
25
- it "should enable configuration option 'lock_expires_at_attribute_name'" do
26
- sorcery_model_property_set(:lock_expires_at_attribute_name, :expires)
27
- User.sorcery_config.lock_expires_at_attribute_name.should equal(:expires)
28
- end
29
-
30
- it "should enable configuration option 'consecutive_login_retries_amount_allowed'" do
31
- sorcery_model_property_set(:consecutive_login_retries_amount_limit, 34)
32
- User.sorcery_config.consecutive_login_retries_amount_limit.should equal(34)
33
- end
34
-
35
- it "should enable configuration option 'login_lock_time_period'" do
36
- sorcery_model_property_set(:login_lock_time_period, 2.hours)
37
- User.sorcery_config.login_lock_time_period.should == 2.hours
38
- end
39
- end
6
+ it_behaves_like "rails_3_brute_force_protection_model"
40
7
 
41
8
  end
@@ -1,34 +1,8 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require File.expand_path(File.dirname(__FILE__) + '/../../shared_examples/user_oauth_shared_examples')
2
3
 
3
4
  describe "User with oauth submodule" do
4
5
 
5
- # ----------------- PLUGIN CONFIGURATION -----------------------
6
- describe User, "loaded plugin configuration" do
7
-
8
- before(:all) do
9
- User.delete_all
10
- Authentication.delete_all
11
- sorcery_reload!([:external])
12
- sorcery_controller_property_set(:external_providers, [:twitter])
13
- sorcery_model_property_set(:authentications_class, Authentication)
14
- sorcery_controller_external_property_set(:twitter, :key, "eYVNBjBDi33aa9GkA3w")
15
- sorcery_controller_external_property_set(:twitter, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
16
- sorcery_controller_external_property_set(:twitter, :callback_url, "http://blabla.com")
17
- create_new_external_user(:twitter)
18
- end
19
-
20
- it "should respond to 'load_from_provider'" do
21
- User.should respond_to(:load_from_provider)
22
- end
23
-
24
- it "'load_from_provider' should load user if exists" do
25
- User.load_from_provider(:twitter,123).should == @user
26
- end
27
-
28
- it "'load_from_provider' should return nil if user doesn't exist" do
29
- User.load_from_provider(:twitter,980342).should be_nil
30
- end
31
-
32
- end
6
+ it_behaves_like "rails_3_oauth_model"
33
7
 
34
8
  end