ateam-merb-auth-old 0.0.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 (69) hide show
  1. data/LICENSE +44 -0
  2. data/README +212 -0
  3. data/Rakefile +50 -0
  4. data/TODO +14 -0
  5. data/activerecord_generators/ma_migration/ma_migration_generator.rb +41 -0
  6. data/activerecord_generators/ma_migration/templates/schema/migrations/%time_stamp%_add_ma_user.rb +21 -0
  7. data/app/controllers/application.rb +7 -0
  8. data/app/controllers/sessions.rb +3 -0
  9. data/app/controllers/users.rb +3 -0
  10. data/app/helpers/application_helper.rb +64 -0
  11. data/app/mailers/user_mailer.rb +24 -0
  12. data/app/mailers/views/user_mailer/activation.text.erb +1 -0
  13. data/app/mailers/views/user_mailer/forgot_password.text.erb +5 -0
  14. data/app/mailers/views/user_mailer/signup.text.erb +7 -0
  15. data/app/views/layout/merb_auth.html.erb +16 -0
  16. data/app/views/sessions/new.html.erb +13 -0
  17. data/app/views/users/new.html.erb +21 -0
  18. data/datamapper_generators/ma_migration/ma_migration_generator.rb +38 -0
  19. data/datamapper_generators/ma_migration/templates/schema/migrations/add_ma_user.rb +21 -0
  20. data/lib/ateam-merb-auth-old.rb +1 -0
  21. data/lib/merb-auth.rb +184 -0
  22. data/lib/merb-auth/adapters/activerecord/init.rb +26 -0
  23. data/lib/merb-auth/adapters/activerecord/map.rb +44 -0
  24. data/lib/merb-auth/adapters/activerecord/model.rb +81 -0
  25. data/lib/merb-auth/adapters/common.rb +161 -0
  26. data/lib/merb-auth/adapters/datamapper/init.rb +28 -0
  27. data/lib/merb-auth/adapters/datamapper/map.rb +35 -0
  28. data/lib/merb-auth/adapters/datamapper/model.rb +72 -0
  29. data/lib/merb-auth/adapters/map.rb +0 -0
  30. data/lib/merb-auth/adapters/sequel/init.rb +26 -0
  31. data/lib/merb-auth/adapters/sequel/map.rb +36 -0
  32. data/lib/merb-auth/adapters/sequel/model.rb +86 -0
  33. data/lib/merb-auth/controller/controller.rb +113 -0
  34. data/lib/merb-auth/controller/sessions_base.rb +41 -0
  35. data/lib/merb-auth/controller/users_base.rb +58 -0
  36. data/lib/merb-auth/initializer.rb +47 -0
  37. data/lib/merb-auth/merbtasks.rb +168 -0
  38. data/lib/merb-auth/slicetasks.rb +102 -0
  39. data/plugins/forgotten_password/app/controllers/passwords.rb +90 -0
  40. data/plugins/forgotten_password/app/models/user.rb +52 -0
  41. data/plugins/forgotten_password/app/views/passwords/edit.html.erb +9 -0
  42. data/plugins/forgotten_password/app/views/passwords/new.html.erb +4 -0
  43. data/plugins/forgotten_password/forgotten_password.rb +6 -0
  44. data/plugins/forgotten_password/init.rb +8 -0
  45. data/plugins/forgotten_password/spec/controller_spec.rb +236 -0
  46. data/plugins/forgotten_password/spec/model_spec.rb +52 -0
  47. data/plugins/forgotten_password/spec/spec_helper.rb +36 -0
  48. data/public/javascripts/master.js +0 -0
  49. data/public/stylesheets/master.css +2 -0
  50. data/spec/controllers/plugins/test_plugin.rb +17 -0
  51. data/spec/controllers/sessions_spec.rb +118 -0
  52. data/spec/controllers/users_spec.rb +119 -0
  53. data/spec/mailers/user_mailer_spec.rb +75 -0
  54. data/spec/merb_auth_spec.rb +231 -0
  55. data/spec/models/ar_model_spec.rb +50 -0
  56. data/spec/models/common_spec.rb +0 -0
  57. data/spec/models/model_spec.rb +23 -0
  58. data/spec/models/sq_model_spec.rb +50 -0
  59. data/spec/shared_specs/shared_model_spec.rb +445 -0
  60. data/spec/spec_helper.rb +114 -0
  61. data/spec/spec_helpers/helpers.rb +18 -0
  62. data/spec/spec_helpers/valid_model_hashes.rb +10 -0
  63. data/stubs/app/controllers/application.rb +2 -0
  64. data/stubs/app/controllers/main.rb +2 -0
  65. data/stubs/app/mailers/views/activation.text.erb +1 -0
  66. data/stubs/app/mailers/views/signup.text.erb +7 -0
  67. data/stubs/app/views/sessions/new.html.erb +14 -0
  68. data/stubs/app/views/users/new.html.erb +18 -0
  69. metadata +120 -0
@@ -0,0 +1,50 @@
1
+ require File.join( File.dirname(__FILE__), "..", "spec_helper" )
2
+ require 'active_record'
3
+
4
+ describe "MA ActiveRecord User Model" do
5
+
6
+ before(:all) do
7
+
8
+ Merb.stub!(:orm_generator_scope).and_return("activerecord")
9
+
10
+ adapter_path = File.join( File.dirname(__FILE__), "..", "..", "lib", "merb-auth", "adapters")
11
+ MA.register_adapter :datamapper, "#{adapter_path}/datamapper"
12
+ MA.register_adapter :activerecord, "#{adapter_path}/activerecord"
13
+ MA.loaded
14
+
15
+ ActiveRecord::Migration.verbose = false
16
+ ActiveRecord::Base.establish_connection(
17
+ :adapter => 'sqlite3',
18
+ :database => ':memory:')
19
+
20
+ class UserMigration < ActiveRecord::Migration
21
+ def self.up
22
+ create_table "users", :force => true do |t|
23
+ t.column :login, :string
24
+ t.column :email, :string
25
+ t.column :crypted_password, :string, :limit => 40
26
+ t.column :salt, :string, :limit => 40
27
+ t.column :created_at, :datetime
28
+ t.column :updated_at, :datetime
29
+ t.column :remember_token, :string
30
+ t.column :remember_token_expires_at, :datetime
31
+ t.column :activation_code, :string, :limit => 40
32
+ t.column :activated_at, :datetime
33
+ t.column :password_reset_key, :string
34
+ end
35
+ end
36
+ end
37
+
38
+ UserMigration.up
39
+
40
+ class User < ActiveRecord::Base
41
+ include MerbAuth::Adapter::ActiveRecord
42
+ include MerbAuth::Adapter::ActiveRecord::DefaultModelSetup
43
+ end
44
+
45
+ MA.activate
46
+ end
47
+
48
+ it_should_behave_like "A MerbAuth User Model"
49
+
50
+ end
File without changes
@@ -0,0 +1,23 @@
1
+ require File.join( File.dirname(__FILE__), "..", "spec_helper" )
2
+ require 'dm-core'
3
+
4
+ describe "MA User Model" do
5
+
6
+ before(:all) do
7
+ DataMapper.setup(:default, 'sqlite3::memory:')
8
+ Merb.stub!(:orm_generator_scope).and_return("datamapper")
9
+
10
+ adapter_path = File.join( File.dirname(__FILE__), "..", "..", "lib", "merb-auth", "adapters")
11
+ MA.register_adapter :datamapper, "#{adapter_path}/datamapper"
12
+ MA.register_adapter :activerecord, "#{adapter_path}/activerecord"
13
+ MA.loaded
14
+
15
+ class User
16
+ include MA::Adapter::DataMapper
17
+ include MA::Adapter::DataMapper::DefaultModelSetup
18
+ end
19
+ end
20
+
21
+ it_should_behave_like "A MerbAuth User Model"
22
+
23
+ end
@@ -0,0 +1,50 @@
1
+ require File.join( File.dirname(__FILE__), "..", "spec_helper" )
2
+ require 'sequel'
3
+
4
+ describe "MA Sequel User Model" do
5
+
6
+ before(:all) do
7
+
8
+ Merb.stub!(:orm_generator_scope).and_return("sequel")
9
+
10
+ adapter_path = File.join( File.dirname(__FILE__), "..", "..", "lib", "merb-auth", "adapters")
11
+ MA.register_adapter :datamapper, "#{adapter_path}/datamapper"
12
+ MA.register_adapter :activerecord, "#{adapter_path}/activerecord"
13
+ MA.register_adapter :sequel, "#{adapter_path}/sequel"
14
+ MA.loaded
15
+
16
+ sqdb = Sequel.sqlite
17
+
18
+ sqdb.create_table! :users do
19
+ primary_key :id
20
+ column :login, :text
21
+ column :email, :text
22
+ column :crypted_password, :varchar, :size => 40
23
+ column :salt, :varchar, :size => 40
24
+ column :created_at, :datetime
25
+ column :updated_at, :datetime
26
+ column :remember_token, :text
27
+ column :remember_token_expires_at, :datetime
28
+ column :activation_code, :varchar, :size => 40
29
+ column :activated_at, :datetime
30
+ column :password_reset_key, :text
31
+ end
32
+
33
+ class User < Sequel::Model
34
+ include MerbAuth::Adapter::Sequel
35
+ include MerbAuth::Adapter::Sequel::DefaultModelSetup
36
+
37
+ def attributes
38
+ values
39
+ end
40
+ end
41
+ User.raise_on_save_failure = false
42
+
43
+ Sequel.datetime_class = DateTime
44
+
45
+ MA.activate
46
+ end
47
+
48
+ it_should_behave_like "A MerbAuth User Model"
49
+
50
+ end
@@ -0,0 +1,445 @@
1
+ describe "A MerbAuth User Model", :shared => true do
2
+
3
+ before(:all) do
4
+ raise "You need to set the MerbAuth[:user] class to use this spec" unless MA[:user].is_a?(Class)
5
+ end
6
+
7
+ before(:each) do
8
+ MA[:user].clear_database_table
9
+ @hash = valid_user_hash
10
+ @user = MA[:user].new(@hash)
11
+ MA[:from_email] = "example@email.com"
12
+ end
13
+
14
+ it "should include MerbAuth::Adapter::Common mixin" do
15
+ MA[:user].should include(MA::Adapter::Common)
16
+ end
17
+
18
+ it "should setup the name of the resource" do
19
+ MA[:single_resource].should == :user
20
+ end
21
+
22
+ it "should set the name of the collection" do
23
+ MA[:plural_resource].should == :users
24
+ end
25
+
26
+ describe "Fields" do
27
+
28
+ before(:each) do
29
+ MA[:use_activation] = true
30
+ end
31
+
32
+ it "should make a valid user" do
33
+ user = MA[:user].new(valid_user_hash)
34
+ user.save
35
+ user.errors.should be_empty
36
+ end
37
+
38
+ it "should have a login field" do
39
+ user = MA[:user].new
40
+ user.should respond_to(:login)
41
+ user.valid?
42
+ user.errors.on(:login).should_not be_blank
43
+ end
44
+
45
+ it "should have an email field" do
46
+ user = MA[:user].new
47
+ user.should respond_to(:email)
48
+ user.valid?
49
+ user.errors.on(:email).should_not be_blank
50
+ end
51
+
52
+ it "should add on some random numbers on the end if the username is already taken" do
53
+ hash = valid_user_hash.except(:login)
54
+ hash[:email] = "homer@simpsons.com"
55
+ u1 = MA[:user].new(hash)
56
+ u1.save
57
+ u1.should_not be_new_record
58
+ u1.login.should == "homer"
59
+
60
+ h2 = valid_user_hash.except(:login)
61
+ h2[:email] = "homer@shelbyvile.com"
62
+ u2 = MA[:user].new(h2)
63
+ u2.save
64
+ u2.should_not be_new_record
65
+ u2.login.should match(/homer\d{3}/)
66
+ u2.login.should == "homer000"
67
+
68
+ h3 = valid_user_hash.except(:login)
69
+ h3[:email] = "homer@hotmail.com"
70
+ u3 = MA[:user].new(h3)
71
+ u3.save
72
+ u3.should_not be_new_record
73
+ u3.login.should match(/homer\d{3}/)
74
+ u3.login.should == "homer001"
75
+ end
76
+
77
+ it "should fail login if there are less than 3 chars" do
78
+ user = MA[:user].new
79
+ user.login = "AB"
80
+ user.valid?
81
+ user.errors.on(:login).should_not be_blank
82
+ end
83
+
84
+ it "should not fail login with between 3 and 40 chars" do
85
+ user = MA[:user].new
86
+ [3,40].each do |num|
87
+ user.login = "a" * num
88
+ user.valid?
89
+ user.errors.on(:login).should be_blank
90
+ end
91
+ end
92
+
93
+ it "should fail login with over 90 chars" do
94
+ user = MA[:user].new
95
+ user.login = "A" * 41
96
+ user.valid?
97
+ user.errors.on(:login).should_not be_blank
98
+ end
99
+
100
+ it "should make sure login is unique regardless of case" do
101
+ MA[:user].find_with_conditions(:login => "Daniel").should be_nil
102
+ user = MA[:user].new( valid_user_hash.with(:login => "Daniel") )
103
+ user2 = MA[:user].new( valid_user_hash.with(:login => "daniel"))
104
+ user.save
105
+ user.should_not be_a_new_record
106
+ user2.save
107
+ user2.should be_a_new_record
108
+ user2.errors.on(:login).should_not be_blank
109
+ end
110
+
111
+ it "should downcase logins" do
112
+ user = MA[:user].new( valid_user_hash.with(:login => "DaNieL"))
113
+ user.login.should == "daniel"
114
+ end
115
+
116
+ it "should authenticate a user using a class method" do
117
+ hash = valid_user_hash
118
+ user = MA[:user].new(hash)
119
+ user.save
120
+ user.should_not be_new_record
121
+ user.activate
122
+ MA[:user].authenticate(hash[:email], hash[:password]).should_not be_nil
123
+ end
124
+
125
+ it "should not authenticate a user using the wrong password" do
126
+ user = MA[:user].new(valid_user_hash)
127
+ user.save
128
+
129
+ user.activate
130
+ MA[:user].authenticate(valid_user_hash[:email], "not_the_password").should be_nil
131
+ end
132
+
133
+ it "should not authenticate a user using the wrong login" do
134
+ user = MA[:user].create(valid_user_hash)
135
+
136
+ user.activate
137
+ MA[:user].authenticate("not_the_login@blah.com", valid_user_hash[:password]).should be_nil
138
+ end
139
+
140
+ it "should not authenticate a user that does not exist" do
141
+ MA[:user].authenticate("i_dont_exist", "password").should be_nil
142
+ end
143
+
144
+ end
145
+
146
+ describe "the password fields" do
147
+
148
+ it "should respond to password" do
149
+ @user.should respond_to(:password)
150
+ end
151
+
152
+ it "should respond to password_confirmation" do
153
+ @user.should respond_to(:password_confirmation)
154
+ end
155
+
156
+ it "should respond to crypted_password" do
157
+ @user.should respond_to(:crypted_password)
158
+ end
159
+
160
+ it "should require password if password is required" do
161
+ user = MA[:user].new( valid_user_hash.without(:password))
162
+ user.stub!(:password_required?).and_return(true)
163
+ user.valid?
164
+ user.errors.on(:password).should_not be_nil
165
+ user.errors.on(:password).should_not be_empty
166
+ end
167
+
168
+ it "should set the salt" do
169
+ user = MA[:user].new(valid_user_hash)
170
+ user.salt.should be_nil
171
+ user.send(:encrypt_password)
172
+ user.salt.should_not be_nil
173
+ end
174
+
175
+ it "should require the password on create" do
176
+ user = MA[:user].new(valid_user_hash.without(:password))
177
+ user.save
178
+ user.errors.on(:password).should_not be_nil
179
+ user.errors.on(:password).should_not be_empty
180
+ end
181
+
182
+ it "should require password_confirmation if the password_required?" do
183
+ user = MA[:user].new(valid_user_hash.without(:password_confirmation))
184
+ user.save
185
+ (user.errors.on(:password) || user.errors.on(:password_confirmation)).should_not be_nil
186
+ end
187
+
188
+ it "should fail when password is outside 4 and 40 chars" do
189
+ [3,41].each do |num|
190
+ user = MA[:user].new(valid_user_hash.with(:password => ("a" * num)))
191
+ user.valid?
192
+ user.errors.on(:password).should_not be_blank
193
+ end
194
+ end
195
+
196
+ it "should pass when password is within 4 and 40 chars" do
197
+ [4,30,40].each do |num|
198
+ user = MA[:user].new(valid_user_hash.with(:password => ("a" * num), :password_confirmation => ("a" * num)))
199
+ user.valid?
200
+ user.errors.on(:password).should be_blank
201
+ end
202
+ end
203
+
204
+ it "should autenticate against a password" do
205
+ user = MA[:user].new(valid_user_hash)
206
+ user.save
207
+ user.should be_authenticated(valid_user_hash[:password])
208
+ end
209
+
210
+ it "should not require a password when saving an existing user" do
211
+ hash = valid_user_hash
212
+ user = MA[:user].new(hash)
213
+ user.save
214
+ user.should_not be_a_new_record
215
+ user.login.should == hash[:login].downcase
216
+ user = MA[:user].find_with_conditions(:login => hash[:login].downcase)
217
+ user.password.should be_nil
218
+ user.password_confirmation.should be_nil
219
+ user.login = "some_different_login_to_allow_saving"
220
+ (user.save).should if user
221
+ end
222
+
223
+ end
224
+
225
+ describe "activation setup" do
226
+
227
+ before(:each) do
228
+ MA[:use_activation] = true
229
+ end
230
+
231
+ it "should have an activation_code as an attribute" do
232
+ @user.attributes.keys.any?{|a| a.to_s == "activation_code"}.should_not be_nil
233
+ end
234
+
235
+ it "should create an activation code on create" do
236
+ @user.activation_code.should be_nil
237
+ @user.save
238
+ @user.activation_code.should_not be_nil
239
+ end
240
+
241
+ it "should not be active when created" do
242
+ @user.should_not be_activated
243
+ @user.save
244
+ @user.should_not be_activated
245
+ end
246
+
247
+ it "should respond to activate" do
248
+ @user.should respond_to(:activate)
249
+ end
250
+
251
+ it "should respond to activated? & active?" do
252
+ @user.save
253
+ @user.should_not be_active
254
+ @user.should_not be_activated
255
+ @user.activate
256
+ @user.reload
257
+ @user.should be_active
258
+ @user.should be_activated
259
+ end
260
+
261
+ it "should activate a user when activate is called" do
262
+ @user.should_not be_activated
263
+ @user.save
264
+ @user.activate
265
+ @user.should be_activated
266
+ MA[:user].find_with_conditions(:email => @hash[:email]).should be_activated
267
+ end
268
+
269
+ it "should should show recently activated when the instance is activated" do
270
+ @user.should_not be_recently_activated
271
+ @user.activate
272
+ @user.should be_recently_activated
273
+ end
274
+
275
+ it "should not show recently activated when the instance is fresh" do
276
+ @user.activate
277
+ @user = nil
278
+ MA[:user].find_with_conditions(:email => @hash[:email]).should_not be_recently_activated
279
+ end
280
+
281
+ it "should send an email to ask for activation" do
282
+ MA[:use_activation] = true
283
+ MA::UserMailer.should_receive(:dispatch_and_deliver) do |action, mail_args, mailer_params|
284
+ action.should == :signup
285
+ mail_args.keys.should include(:from)
286
+ mail_args.keys.should include(:to)
287
+ mail_args.keys.should include(:subject)
288
+ mail_args[:subject].should_not be_blank
289
+ mail_args[:to].should == @user.email
290
+ mailer_params[:user].should == @user
291
+ end
292
+ @user.save
293
+ end
294
+
295
+ it "should not send an email to ask for activation when use_activation is not set" do
296
+ MA[:use_activation] = false
297
+ MA::UserMailer.should_not_receive(:dispatch_and_deliver)
298
+ @user.save
299
+ end
300
+
301
+ it "should send out a welcome email to confirm that the account is activated" do
302
+ @user.save
303
+ MA::UserMailer.should_receive(:dispatch_and_deliver) do |action, mail_args, mailer_params|
304
+ action.should == :activation
305
+ mail_args.keys.should include(:from)
306
+ mail_args.keys.should include(:to)
307
+ mail_args.keys.should include(:subject)
308
+ mail_args[:to].should == @user.email
309
+ mailer_params[:user].should == @user
310
+ end
311
+ @user.activate
312
+ end
313
+
314
+ it "should send a please activate email" do
315
+ user = MA[:user].new(valid_user_hash)
316
+ MA::UserMailer.should_receive(:dispatch_and_deliver) do |action, mail_args, mailer_params|
317
+ action.should == :signup
318
+ [:from, :to, :subject].each{ |f| mail_args.keys.should include(f)}
319
+ mail_args[:to].should == user.email
320
+ mailer_params[:user].should == user
321
+ end
322
+ user.save
323
+ user.should_not be_a_new_record
324
+ end
325
+
326
+ it "should not send a please activate email when updating" do
327
+ user = MA[:user].new(valid_user_hash)
328
+ user.save
329
+ MA[:user].should_not_receive(:signup_notification)
330
+ user.login = "not in the valid hash for login"
331
+ user.save
332
+ end
333
+
334
+ it "should check that a user is active if the configuration calls for activation" do
335
+ MA[:use_activation] = true
336
+ hash = valid_user_hash
337
+ hash2 = valid_user_hash
338
+ user = MA[:user].new(hash)
339
+ user.save
340
+ user.reload
341
+ MA[:user].authenticate(user.email, hash[:password]).should be_nil
342
+ MA[:use_activation] = false
343
+ u2 = MA[:user].new(hash2)
344
+ u2.save
345
+ u2.reload
346
+ MA[:user].authenticate(u2.email, hash2[:password]).should == u2
347
+ MA[:user].authenticate(user.email, hash[:passowrd]).should be_nil
348
+ MA[:use_activateion] = true
349
+ user.activate
350
+ user.reload
351
+ MA[:user].authenticate(user.email, hash[:password]).should == user
352
+ MA[:user].authenticate(u2.email, hash2[:password]).should == u2
353
+ end
354
+
355
+ it "should not activate the user when use_activation is true" do
356
+ MA[:use_activation] = true
357
+ u = MA[:user].new(valid_user_hash)
358
+ u.save
359
+ u.should_not be_activated
360
+ end
361
+
362
+ it "should set the use to active if there is no activation required" do
363
+ MA[:use_activation] = false
364
+ u = MA[:user].new(valid_user_hash)
365
+ u.save
366
+ u.should be_activated
367
+ end
368
+
369
+ end
370
+
371
+ describe "remember me" do
372
+ predicate_matchers[:remember_token] = :remember_token?
373
+
374
+ before do
375
+ MA[:user].clear_database_table
376
+ @user = MA[:user].new(valid_user_hash)
377
+ end
378
+
379
+ it "should have a remember_token_expires_at attribute" do
380
+ @user.attributes.keys.any?{|a| a.to_s == "remember_token_expires_at"}.should_not be_nil
381
+ end
382
+
383
+ it "should respond to remember_token?" do
384
+ @user.should respond_to(:remember_token?)
385
+ end
386
+
387
+ it "should return true if remember_token_expires_at is set and is in the future" do
388
+ @user.remember_token_expires_at = DateTime.now + 3600
389
+ @user.should remember_token
390
+ end
391
+
392
+ it "should set remember_token_expires_at to a specific date" do
393
+ time = DateTime.civil(2009,12,25)
394
+ @user.remember_me_until(time)
395
+ @user.remember_token_expires_at.should == time
396
+ end
397
+
398
+ it "should set the remember_me token when remembering" do
399
+ time = DateTime.civil(2009,12,25)
400
+ @user.remember_me_until(time)
401
+ @user.remember_token.should_not be_nil
402
+ @user.save
403
+ MA[:user].find_with_conditions(:login => @user.login).remember_token.should_not be_nil
404
+ end
405
+
406
+ it "should remember me for" do
407
+ t = DateTime.now
408
+ DateTime.stub!(:now).and_return(t)
409
+ today = DateTime.now
410
+ remember_until = today + (2* Merb::Const::WEEK) / Merb::Const::DAY
411
+ @user.remember_me_for( Merb::Const::WEEK * 2)
412
+ @user.remember_token_expires_at.should be_close(remember_until, 0.0001)
413
+ end
414
+
415
+ it "should remember_me for two weeks" do
416
+ t = DateTime.now
417
+ DateTime.stub!(:now).and_return(t)
418
+ @user.remember_me
419
+ @user.remember_token_expires_at.should be_close(DateTime.now + (2 * Merb::Const::WEEK ) / Merb::Const::DAY, 0.0001)
420
+ end
421
+
422
+ it "should forget me" do
423
+ @user.remember_me
424
+ @user.save
425
+ @user.forget_me
426
+ @user.remember_token.should be_nil
427
+ @user.remember_token_expires_at.should be_nil
428
+ end
429
+
430
+ it "should persist the forget me to the database" do
431
+ @user.remember_me
432
+ @user.save
433
+
434
+ @user = MA[:user].find_with_conditions(:email => @user.email)
435
+ @user.remember_token.should_not be_nil
436
+
437
+ @user.forget_me
438
+
439
+ @user = MA[:user].find_with_conditions(:email => @user.email)
440
+ @user.remember_token.should be_nil
441
+ @user.remember_token_expires_at.should be_nil
442
+ end
443
+ end
444
+
445
+ end