devise 3.5.3 → 3.5.10
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of devise might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +37 -1
- data/Gemfile +1 -0
- data/Gemfile.lock +39 -35
- data/gemfiles/Gemfile.rails-3.2-stable.lock +44 -44
- data/gemfiles/Gemfile.rails-4.0-stable +1 -0
- data/gemfiles/Gemfile.rails-4.0-stable.lock +34 -34
- data/gemfiles/Gemfile.rails-4.1-stable +1 -0
- data/gemfiles/Gemfile.rails-4.1-stable.lock +58 -59
- data/gemfiles/Gemfile.rails-4.2-stable +1 -0
- data/gemfiles/Gemfile.rails-4.2-stable.lock +76 -77
- data/lib/devise/controllers/rememberable.rb +8 -1
- data/lib/devise/hooks/timeoutable.rb +3 -2
- data/lib/devise/models/confirmable.rb +2 -1
- data/lib/devise/models/lockable.rb +5 -1
- data/lib/devise/models/recoverable.rb +1 -1
- data/lib/devise/models/rememberable.rb +42 -21
- data/lib/devise/models/timeoutable.rb +0 -6
- data/lib/devise/strategies/rememberable.rb +3 -6
- data/lib/devise/version.rb +1 -1
- data/test/integration/rememberable_test.rb +41 -3
- data/test/integration/timeoutable_test.rb +1 -1
- data/test/models/confirmable_test.rb +23 -1
- data/test/models/lockable_test.rb +22 -0
- data/test/models/rememberable_test.rb +60 -95
- data/test/time_helpers.rb +137 -0
- metadata +5 -3
@@ -25,8 +25,7 @@ module Devise
|
|
25
25
|
end
|
26
26
|
|
27
27
|
if validate(resource)
|
28
|
-
remember_me(resource)
|
29
|
-
extend_remember_me_period(resource)
|
28
|
+
remember_me(resource) if extend_remember_me?(resource)
|
30
29
|
resource.after_remembered
|
31
30
|
success!(resource)
|
32
31
|
end
|
@@ -43,10 +42,8 @@ module Devise
|
|
43
42
|
|
44
43
|
private
|
45
44
|
|
46
|
-
def
|
47
|
-
|
48
|
-
resource.extend_remember_period = mapping.to.extend_remember_period
|
49
|
-
end
|
45
|
+
def extend_remember_me?(resource)
|
46
|
+
resource.respond_to?(:extend_remember_period) && resource.extend_remember_period
|
50
47
|
end
|
51
48
|
|
52
49
|
def remember_me?
|
data/lib/devise/version.rb
CHANGED
@@ -1,10 +1,15 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class RememberMeTest < ActionDispatch::IntegrationTest
|
4
|
+
if (Rails::VERSION::MAJOR < 4) || (Rails::VERSION::MAJOR >= 4 && Rails::VERSION::MINOR < 1)
|
5
|
+
require 'time_helpers'
|
6
|
+
include ActiveSupport::Testing::TimeHelpers
|
7
|
+
end
|
8
|
+
|
4
9
|
def create_user_and_remember(add_to_token='')
|
5
10
|
user = create_user
|
6
11
|
user.remember_me!
|
7
|
-
raw_cookie = User.serialize_into_cookie(user).tap { |a| a
|
12
|
+
raw_cookie = User.serialize_into_cookie(user).tap { |a| a[1] << add_to_token }
|
8
13
|
cookies['remember_user_token'] = generate_signed_cookie(raw_cookie)
|
9
14
|
user
|
10
15
|
end
|
@@ -92,7 +97,6 @@ class RememberMeTest < ActionDispatch::IntegrationTest
|
|
92
97
|
assert_response :success
|
93
98
|
assert warden.authenticated?(:user)
|
94
99
|
assert warden.user(:user) == user
|
95
|
-
assert_match /remember_user_token[^\n]*HttpOnly/, response.headers["Set-Cookie"], "Expected Set-Cookie header in response to set HttpOnly flag on remember_user_token cookie."
|
96
100
|
end
|
97
101
|
|
98
102
|
test 'remember the user before sign up and redirect them to their home' do
|
@@ -118,6 +122,40 @@ class RememberMeTest < ActionDispatch::IntegrationTest
|
|
118
122
|
end
|
119
123
|
end
|
120
124
|
|
125
|
+
test 'extends remember period when extend remember period config is true' do
|
126
|
+
swap Devise, extend_remember_period: true, remember_for: 1.year do
|
127
|
+
user = create_user_and_remember
|
128
|
+
old_remember_token = nil
|
129
|
+
|
130
|
+
travel_to 1.day.ago do
|
131
|
+
get root_path
|
132
|
+
old_remember_token = request.cookies['remember_user_token']
|
133
|
+
end
|
134
|
+
|
135
|
+
get root_path
|
136
|
+
current_remember_token = request.cookies['remember_user_token']
|
137
|
+
|
138
|
+
refute_equal old_remember_token, current_remember_token
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
test 'does not extend remember period when extend period config is false' do
|
143
|
+
swap Devise, extend_remember_period: false, remember_for: 1.year do
|
144
|
+
user = create_user_and_remember
|
145
|
+
old_remember_token = nil
|
146
|
+
|
147
|
+
travel_to 1.day.ago do
|
148
|
+
get root_path
|
149
|
+
old_remember_token = request.cookies['remember_user_token']
|
150
|
+
end
|
151
|
+
|
152
|
+
get root_path
|
153
|
+
current_remember_token = request.cookies['remember_user_token']
|
154
|
+
|
155
|
+
assert_equal old_remember_token, current_remember_token
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
121
159
|
test 'do not remember other scopes' do
|
122
160
|
create_user_and_remember
|
123
161
|
get root_path
|
@@ -135,7 +173,7 @@ class RememberMeTest < ActionDispatch::IntegrationTest
|
|
135
173
|
|
136
174
|
test 'do not remember with expired token' do
|
137
175
|
create_user_and_remember
|
138
|
-
swap Devise, remember_for: 0 do
|
176
|
+
swap Devise, remember_for: 0.days do
|
139
177
|
get users_path
|
140
178
|
assert_not warden.authenticated?(:user)
|
141
179
|
assert_redirected_to new_user_session_path
|
@@ -175,7 +175,7 @@ class SessionTimeoutTest < ActionDispatch::IntegrationTest
|
|
175
175
|
assert warden.authenticated?(:user)
|
176
176
|
end
|
177
177
|
|
178
|
-
test 'does not
|
178
|
+
test 'does not crash when the last_request_at is a String' do
|
179
179
|
user = sign_in_as_user
|
180
180
|
|
181
181
|
get edit_form_user_path(user, last_request_at: Time.now.utc.to_s)
|
@@ -114,7 +114,7 @@ class ConfirmableTest < ActiveSupport::TestCase
|
|
114
114
|
|
115
115
|
assert_email_not_sent do
|
116
116
|
user.save!
|
117
|
-
|
117
|
+
assert_not user.confirmed?
|
118
118
|
end
|
119
119
|
end
|
120
120
|
|
@@ -401,6 +401,14 @@ class ReconfirmableTest < ActiveSupport::TestCase
|
|
401
401
|
assert_match "new_test@example.com", ActionMailer::Base.deliveries.last.body.encoded
|
402
402
|
end
|
403
403
|
|
404
|
+
test 'should send confirmation instructions by email after changing email from nil' do
|
405
|
+
admin = create_admin(email: nil)
|
406
|
+
assert_email_sent "new_test@example.com" do
|
407
|
+
assert admin.update_attributes(email: 'new_test@example.com')
|
408
|
+
end
|
409
|
+
assert_match "new_test@example.com", ActionMailer::Base.deliveries.last.body.encoded
|
410
|
+
end
|
411
|
+
|
404
412
|
test 'should not send confirmation by email after changing password' do
|
405
413
|
admin = create_admin
|
406
414
|
assert admin.confirm
|
@@ -486,4 +494,18 @@ class ReconfirmableTest < ActiveSupport::TestCase
|
|
486
494
|
:unconfirmed_email
|
487
495
|
]
|
488
496
|
end
|
497
|
+
|
498
|
+
test 'should not require reconfirmation after creating a record' do
|
499
|
+
admin = create_admin
|
500
|
+
assert !admin.pending_reconfirmation?
|
501
|
+
end
|
502
|
+
|
503
|
+
test 'should not require reconfirmation after creating a record with #save called in callback' do
|
504
|
+
class Admin::WithSaveInCallback < Admin
|
505
|
+
after_create :save
|
506
|
+
end
|
507
|
+
|
508
|
+
admin = Admin::WithSaveInCallback.create(valid_attributes.except(:username))
|
509
|
+
assert !admin.pending_reconfirmation?
|
510
|
+
end
|
489
511
|
end
|
@@ -325,4 +325,26 @@ class LockableTest < ActiveSupport::TestCase
|
|
325
325
|
user.lock_access!
|
326
326
|
assert_equal :locked, user.unauthenticated_message
|
327
327
|
end
|
328
|
+
|
329
|
+
test 'unlock_strategy_enabled? should return true for both, email, and time strategies if :both is used' do
|
330
|
+
swap Devise, unlock_strategy: :both do
|
331
|
+
user = create_user
|
332
|
+
assert_equal true, user.unlock_strategy_enabled?(:both)
|
333
|
+
assert_equal true, user.unlock_strategy_enabled?(:time)
|
334
|
+
assert_equal true, user.unlock_strategy_enabled?(:email)
|
335
|
+
assert_equal false, user.unlock_strategy_enabled?(:none)
|
336
|
+
assert_equal false, user.unlock_strategy_enabled?(:an_undefined_strategy)
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
test 'unlock_strategy_enabled? should return true only for the configured strategy' do
|
341
|
+
swap Devise, unlock_strategy: :email do
|
342
|
+
user = create_user
|
343
|
+
assert_equal false, user.unlock_strategy_enabled?(:both)
|
344
|
+
assert_equal false, user.unlock_strategy_enabled?(:time)
|
345
|
+
assert_equal true, user.unlock_strategy_enabled?(:email)
|
346
|
+
assert_equal false, user.unlock_strategy_enabled?(:none)
|
347
|
+
assert_equal false, user.unlock_strategy_enabled?(:an_undefined_strategy)
|
348
|
+
end
|
349
|
+
end
|
328
350
|
end
|
@@ -13,6 +13,19 @@ class RememberableTest < ActiveSupport::TestCase
|
|
13
13
|
user = create_user
|
14
14
|
user.expects(:valid?).never
|
15
15
|
user.remember_me!
|
16
|
+
assert user.remember_created_at
|
17
|
+
end
|
18
|
+
|
19
|
+
test 'remember_me should not generate a new token if valid token exists' do
|
20
|
+
user = create_user
|
21
|
+
user.singleton_class.send(:attr_accessor, :remember_token)
|
22
|
+
User.to_adapter.expects(:find_first).returns(nil)
|
23
|
+
|
24
|
+
user.remember_me!
|
25
|
+
existing_token = user.remember_token
|
26
|
+
|
27
|
+
user.remember_me!
|
28
|
+
assert_equal existing_token, user.remember_token
|
16
29
|
end
|
17
30
|
|
18
31
|
test 'forget_me should not clear remember token if using salt' do
|
@@ -33,13 +46,57 @@ class RememberableTest < ActiveSupport::TestCase
|
|
33
46
|
test 'serialize into cookie' do
|
34
47
|
user = create_user
|
35
48
|
user.remember_me!
|
36
|
-
|
49
|
+
id, token, date = User.serialize_into_cookie(user)
|
50
|
+
assert_equal id, user.to_key
|
51
|
+
assert_equal token, user.authenticatable_salt
|
52
|
+
assert date.is_a?(String)
|
37
53
|
end
|
38
54
|
|
39
55
|
test 'serialize from cookie' do
|
40
56
|
user = create_user
|
41
57
|
user.remember_me!
|
42
|
-
assert_equal user, User.serialize_from_cookie(user.to_key, user.authenticatable_salt)
|
58
|
+
assert_equal user, User.serialize_from_cookie(user.to_key, user.authenticatable_salt, Time.now.utc)
|
59
|
+
end
|
60
|
+
|
61
|
+
test 'serialize from cookie should accept a String with the datetime seconds and microseconds' do
|
62
|
+
user = create_user
|
63
|
+
user.remember_me!
|
64
|
+
assert_equal user, User.serialize_from_cookie(user.to_key, user.authenticatable_salt, Time.now.utc.to_f.to_json)
|
65
|
+
end
|
66
|
+
|
67
|
+
test 'serialize from cookie should return nil with invalid datetime' do
|
68
|
+
user = create_user
|
69
|
+
user.remember_me!
|
70
|
+
assert_nil User.serialize_from_cookie(user.to_key, user.authenticatable_salt, "2013")
|
71
|
+
end
|
72
|
+
|
73
|
+
test 'serialize from cookie should return nil if no resource is found' do
|
74
|
+
assert_nil resource_class.serialize_from_cookie([0], "123", Time.now.utc)
|
75
|
+
end
|
76
|
+
|
77
|
+
test 'serialize from cookie should return nil if no timestamp' do
|
78
|
+
user = create_user
|
79
|
+
user.remember_me!
|
80
|
+
assert_nil User.serialize_from_cookie(user.to_key, user.authenticatable_salt)
|
81
|
+
end
|
82
|
+
|
83
|
+
test 'serialize from cookie should return nil if timestamp is earlier than token creation' do
|
84
|
+
user = create_user
|
85
|
+
user.remember_me!
|
86
|
+
assert_nil User.serialize_from_cookie(user.to_key, user.authenticatable_salt, 1.day.ago)
|
87
|
+
end
|
88
|
+
|
89
|
+
test 'serialize from cookie should return nil if timestamp is older than remember_for' do
|
90
|
+
user = create_user
|
91
|
+
user.remember_created_at = 1.month.ago
|
92
|
+
user.remember_me!
|
93
|
+
assert_nil User.serialize_from_cookie(user.to_key, user.authenticatable_salt, 3.weeks.ago)
|
94
|
+
end
|
95
|
+
|
96
|
+
test 'serialize from cookie me return nil if is a valid resource with invalid token' do
|
97
|
+
user = create_user
|
98
|
+
user.remember_me!
|
99
|
+
assert_nil User.serialize_from_cookie(user.to_key, "123", Time.now.utc)
|
43
100
|
end
|
44
101
|
|
45
102
|
test 'raises a RuntimeError if authenticatable_salt is nil or empty' do
|
@@ -93,28 +150,7 @@ class RememberableTest < ActiveSupport::TestCase
|
|
93
150
|
resource.forget_me!
|
94
151
|
end
|
95
152
|
|
96
|
-
test 'remember
|
97
|
-
assert create_resource.remember_expired?
|
98
|
-
end
|
99
|
-
|
100
|
-
test 'serialize should return nil if no resource is found' do
|
101
|
-
assert_nil resource_class.serialize_from_cookie([0], "123")
|
102
|
-
end
|
103
|
-
|
104
|
-
test 'remember me return nil if is a valid resource with invalid token' do
|
105
|
-
resource = create_resource
|
106
|
-
assert_nil resource_class.serialize_from_cookie([resource.id], "123")
|
107
|
-
end
|
108
|
-
|
109
|
-
test 'remember for should fallback to devise remember for default configuration' do
|
110
|
-
swap Devise, remember_for: 1.day do
|
111
|
-
resource = create_resource
|
112
|
-
resource.remember_me!
|
113
|
-
assert_not resource.remember_expired?
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
test 'remember expires at should sum date of creation with remember for configuration' do
|
153
|
+
test 'remember expires at uses remember for configuration' do
|
118
154
|
swap Devise, remember_for: 3.days do
|
119
155
|
resource = create_resource
|
120
156
|
resource.remember_me!
|
@@ -125,77 +161,6 @@ class RememberableTest < ActiveSupport::TestCase
|
|
125
161
|
end
|
126
162
|
end
|
127
163
|
|
128
|
-
test 'remember should be expired if remember_for is zero' do
|
129
|
-
swap Devise, remember_for: 0.days do
|
130
|
-
Devise.remember_for = 0.days
|
131
|
-
resource = create_resource
|
132
|
-
resource.remember_me!
|
133
|
-
assert resource.remember_expired?
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
test 'remember should be expired if it was created before limit time' do
|
138
|
-
swap Devise, remember_for: 1.day do
|
139
|
-
resource = create_resource
|
140
|
-
resource.remember_me!
|
141
|
-
resource.remember_created_at = 2.days.ago
|
142
|
-
resource.save
|
143
|
-
assert resource.remember_expired?
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
test 'remember should not be expired if it was created within the limit time' do
|
148
|
-
swap Devise, remember_for: 30.days do
|
149
|
-
resource = create_resource
|
150
|
-
resource.remember_me!
|
151
|
-
resource.remember_created_at = (30.days.ago + 2.minutes)
|
152
|
-
resource.save
|
153
|
-
assert_not resource.remember_expired?
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
test 'if extend_remember_period is false, remember_me! should generate a new timestamp if expired' do
|
158
|
-
swap Devise, remember_for: 5.minutes do
|
159
|
-
resource = create_resource
|
160
|
-
resource.remember_me!(false)
|
161
|
-
assert resource.remember_created_at
|
162
|
-
|
163
|
-
resource.remember_created_at = old = 10.minutes.ago
|
164
|
-
resource.save
|
165
|
-
|
166
|
-
resource.remember_me!(false)
|
167
|
-
assert_not_equal old.to_i, resource.remember_created_at.to_i
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
test 'if extend_remember_period is false, remember_me! should not generate a new timestamp' do
|
172
|
-
swap Devise, remember_for: 1.year do
|
173
|
-
resource = create_resource
|
174
|
-
resource.remember_me!(false)
|
175
|
-
assert resource.remember_created_at
|
176
|
-
|
177
|
-
resource.remember_created_at = old = 10.minutes.ago.utc
|
178
|
-
resource.save
|
179
|
-
|
180
|
-
resource.remember_me!(false)
|
181
|
-
assert_equal old.to_i, resource.remember_created_at.to_i
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
test 'if extend_remember_period is true, remember_me! should always generate a new timestamp' do
|
186
|
-
swap Devise, remember_for: 1.year do
|
187
|
-
resource = create_resource
|
188
|
-
resource.remember_me!(true)
|
189
|
-
assert resource.remember_created_at
|
190
|
-
|
191
|
-
resource.remember_created_at = old = 10.minutes.ago
|
192
|
-
resource.save
|
193
|
-
|
194
|
-
resource.remember_me!(true)
|
195
|
-
assert_not_equal old, resource.remember_created_at
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
164
|
test 'should have the required_fields array' do
|
200
165
|
assert_same_content Devise::Models::Rememberable.required_fields(User), [
|
201
166
|
:remember_created_at
|
@@ -0,0 +1,137 @@
|
|
1
|
+
# A copy of Rails time helpers. With this file we can support the `travel_to`
|
2
|
+
# helper for Rails versions prior 4.1.
|
3
|
+
# File origin: https://github.com/rails/rails/blob/52ce6ece8c8f74064bb64e0a0b1ddd83092718e1/activesupport/lib/active_support/testing/time_helpers.rb
|
4
|
+
module ActiveSupport
|
5
|
+
module Testing
|
6
|
+
class SimpleStubs # :nodoc:
|
7
|
+
Stub = Struct.new(:object, :method_name, :original_method)
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@stubs = {}
|
11
|
+
end
|
12
|
+
|
13
|
+
def stub_object(object, method_name, return_value)
|
14
|
+
key = [object.object_id, method_name]
|
15
|
+
|
16
|
+
if stub = @stubs[key]
|
17
|
+
unstub_object(stub)
|
18
|
+
end
|
19
|
+
|
20
|
+
new_name = "__simple_stub__#{method_name}"
|
21
|
+
|
22
|
+
@stubs[key] = Stub.new(object, method_name, new_name)
|
23
|
+
|
24
|
+
object.singleton_class.send :alias_method, new_name, method_name
|
25
|
+
object.define_singleton_method(method_name) { return_value }
|
26
|
+
end
|
27
|
+
|
28
|
+
def unstub_all!
|
29
|
+
@stubs.each_value do |stub|
|
30
|
+
unstub_object(stub)
|
31
|
+
end
|
32
|
+
@stubs = {}
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def unstub_object(stub)
|
38
|
+
singleton_class = stub.object.singleton_class
|
39
|
+
singleton_class.send :undef_method, stub.method_name
|
40
|
+
singleton_class.send :alias_method, stub.method_name, stub.original_method
|
41
|
+
singleton_class.send :undef_method, stub.original_method
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Contains helpers that help you test passage of time.
|
46
|
+
module TimeHelpers
|
47
|
+
# Changes current time to the time in the future or in the past by a given time difference by
|
48
|
+
# stubbing +Time.now+, +Date.today+, and +DateTime.now+.
|
49
|
+
#
|
50
|
+
# Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
|
51
|
+
# travel 1.day
|
52
|
+
# Time.current # => Sun, 10 Nov 2013 15:34:49 EST -05:00
|
53
|
+
# Date.current # => Sun, 10 Nov 2013
|
54
|
+
# DateTime.current # => Sun, 10 Nov 2013 15:34:49 -0500
|
55
|
+
#
|
56
|
+
# This method also accepts a block, which will return the current time back to its original
|
57
|
+
# state at the end of the block:
|
58
|
+
#
|
59
|
+
# Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
|
60
|
+
# travel 1.day do
|
61
|
+
# User.create.created_at # => Sun, 10 Nov 2013 15:34:49 EST -05:00
|
62
|
+
# end
|
63
|
+
# Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
|
64
|
+
def travel(duration, &block)
|
65
|
+
travel_to Time.now + duration, &block
|
66
|
+
end
|
67
|
+
|
68
|
+
# Changes current time to the given time by stubbing +Time.now+,
|
69
|
+
# +Date.today+, and +DateTime.now+ to return the time or date passed into this method.
|
70
|
+
#
|
71
|
+
# Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
|
72
|
+
# travel_to Time.new(2004, 11, 24, 01, 04, 44)
|
73
|
+
# Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00
|
74
|
+
# Date.current # => Wed, 24 Nov 2004
|
75
|
+
# DateTime.current # => Wed, 24 Nov 2004 01:04:44 -0500
|
76
|
+
#
|
77
|
+
# Dates are taken as their timestamp at the beginning of the day in the
|
78
|
+
# application time zone. <tt>Time.current</tt> returns said timestamp,
|
79
|
+
# and <tt>Time.now</tt> its equivalent in the system time zone. Similarly,
|
80
|
+
# <tt>Date.current</tt> returns a date equal to the argument, and
|
81
|
+
# <tt>Date.today</tt> the date according to <tt>Time.now</tt>, which may
|
82
|
+
# be different. (Note that you rarely want to deal with <tt>Time.now</tt>,
|
83
|
+
# or <tt>Date.today</tt>, in order to honor the application time zone
|
84
|
+
# please always use <tt>Time.current</tt> and <tt>Date.current</tt>.)
|
85
|
+
#
|
86
|
+
# Note that the usec for the time passed will be set to 0 to prevent rounding
|
87
|
+
# errors with external services, like MySQL (which will round instead of floor,
|
88
|
+
# leading to off-by-one-second errors).
|
89
|
+
#
|
90
|
+
# This method also accepts a block, which will return the current time back to its original
|
91
|
+
# state at the end of the block:
|
92
|
+
#
|
93
|
+
# Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
|
94
|
+
# travel_to Time.new(2004, 11, 24, 01, 04, 44) do
|
95
|
+
# Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00
|
96
|
+
# end
|
97
|
+
# Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
|
98
|
+
def travel_to(date_or_time)
|
99
|
+
if date_or_time.is_a?(Date) && !date_or_time.is_a?(DateTime)
|
100
|
+
now = date_or_time.midnight.to_time
|
101
|
+
else
|
102
|
+
now = date_or_time.to_time.change(usec: 0)
|
103
|
+
end
|
104
|
+
|
105
|
+
simple_stubs.stub_object(Time, :now, now)
|
106
|
+
simple_stubs.stub_object(Date, :today, now.to_date)
|
107
|
+
simple_stubs.stub_object(DateTime, :now, now.to_datetime)
|
108
|
+
|
109
|
+
if block_given?
|
110
|
+
begin
|
111
|
+
yield
|
112
|
+
ensure
|
113
|
+
travel_back
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
# Returns the current time back to its original state, by removing the stubs added by
|
119
|
+
# `travel` and `travel_to`.
|
120
|
+
#
|
121
|
+
# Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
|
122
|
+
# travel_to Time.new(2004, 11, 24, 01, 04, 44)
|
123
|
+
# Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00
|
124
|
+
# travel_back
|
125
|
+
# Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
|
126
|
+
def travel_back
|
127
|
+
simple_stubs.unstub_all!
|
128
|
+
end
|
129
|
+
|
130
|
+
private
|
131
|
+
|
132
|
+
def simple_stubs
|
133
|
+
@simple_stubs ||= SimpleStubs.new
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: devise
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.5.
|
4
|
+
version: 3.5.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- José Valim
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2016-05-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: warden
|
@@ -363,6 +363,7 @@ files:
|
|
363
363
|
- test/test_helper.rb
|
364
364
|
- test/test_helpers_test.rb
|
365
365
|
- test/test_models.rb
|
366
|
+
- test/time_helpers.rb
|
366
367
|
homepage: https://github.com/plataformatec/devise
|
367
368
|
licenses:
|
368
369
|
- MIT
|
@@ -383,7 +384,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
383
384
|
version: '0'
|
384
385
|
requirements: []
|
385
386
|
rubyforge_project:
|
386
|
-
rubygems_version: 2.
|
387
|
+
rubygems_version: 2.5.1
|
387
388
|
signing_key:
|
388
389
|
specification_version: 4
|
389
390
|
summary: Flexible authentication solution for Rails with Warden
|
@@ -519,3 +520,4 @@ test_files:
|
|
519
520
|
- test/test_helper.rb
|
520
521
|
- test/test_helpers_test.rb
|
521
522
|
- test/test_models.rb
|
523
|
+
- test/time_helpers.rb
|