Module: TestSuiteTimeMachine
- Defined in:
- lib/test_suite_time_machine.rb,
lib/test_suite_time_machine/version.rb
Defined Under Namespace
Modules: RSpecHelpers
Classes: TimeTravelError
Constant Summary
collapse
- DAY =
60 * 60 * 24
- VERSION =
"2.0.0".freeze
Class Method Summary
collapse
Class Method Details
.advance ⇒ Object
50
51
52
|
# File 'lib/test_suite_time_machine.rb', line 50
def self.advance
advance_time_by(1)
end
|
.advance_time_by(duration, **kwargs) ⇒ Object
46
47
48
|
# File 'lib/test_suite_time_machine.rb', line 46
def self.advance_time_by(duration, **kwargs)
advance_time_to(now + duration, **kwargs)
end
|
.advance_time_to(datetime, **kwargs) ⇒ Object
37
38
39
40
41
42
43
44
|
# File 'lib/test_suite_time_machine.rb', line 37
def self.advance_time_to(datetime, **kwargs)
if parse(datetime) < now
raise TimeTravelError,
"TestSuiteTimeMachine.advance_time_to cannot be called with a date in the past (#{datetime})"
end
travel_permanently_to(datetime, **kwargs)
end
|
.baseline ⇒ Object
86
87
88
|
# File 'lib/test_suite_time_machine.rb', line 86
def self.baseline
Thread.current[:tstm_baseline_set]
end
|
.baseline=(datetime) ⇒ Object
90
91
92
|
# File 'lib/test_suite_time_machine.rb', line 90
def self.baseline=(datetime)
Thread.current[:tstm_baseline_set] = datetime
end
|
.days_from_now(days) ⇒ Object
112
113
114
115
116
117
118
|
# File 'lib/test_suite_time_machine.rb', line 112
def self.days_from_now(days)
if days.respond_to?(:days)
days.days.from_now
else
now + (days * DAY)
end
end
|
.now ⇒ Object
94
95
96
97
98
99
100
|
# File 'lib/test_suite_time_machine.rb', line 94
def self.now
if Time.respond_to?(:zone)
Time.zone.now
else
Time.now
end
end
|
.parse(datetime) ⇒ Object
102
103
104
105
106
107
108
109
110
|
# File 'lib/test_suite_time_machine.rb', line 102
def self.parse(datetime)
return datetime unless datetime.is_a?(String)
if Time.respond_to?(:zone)
Time.zone.parse(datetime)
else
Time.parse(datetime)
end
end
|
.pretend_it_is(datetime) ⇒ Object
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
# File 'lib/test_suite_time_machine.rb', line 7
def self.pretend_it_is(datetime)
if baseline
raise TimeTravelError, "TestSuiteTimeMachine.pretend_it_is cannot be called more than once per test run (currently set to `#{baseline}`, use `travel_temporarily_to` instead)."
end
datetime = "real_world" if datetime.nil? || datetime.strip.empty?
self.baseline = Timecop.baseline = case datetime
when "real_world"
now
when /\A(\d+).days.from_now\z/
days_from_now(::Regexp.last_match(1).to_i)
else
parse(datetime)
end
Timecop.safe_mode = false
Timecop.freeze
end
|
.reset ⇒ Object
62
63
64
65
66
67
68
69
70
71
72
73
|
# File 'lib/test_suite_time_machine.rb', line 62
def self.reset
unless baseline
raise TimeTravelError, "a baseline time must be set first (#{baseline})"
end
Timecop.return_to_baseline
Timecop.freeze(baseline)
if now.to_i != baseline.to_i
raise TimeTravelError, "Time leak! Expected '#{now}' to be at baseline '#{baseline}' after a reset"
end
end
|
.revert_to_real_world_time ⇒ Object
75
76
77
78
79
80
|
# File 'lib/test_suite_time_machine.rb', line 75
def self.revert_to_real_world_time
Timecop.return.tap do
Timecop.safe_mode = true
self.baseline = nil
end
end
|
.travel_permanently_to(*datetime, freeze: true) ⇒ Object
54
55
56
57
58
59
60
|
# File 'lib/test_suite_time_machine.rb', line 54
def self.travel_permanently_to(*datetime, freeze: true)
if freeze
Timecop.freeze(*datetime)
else
Timecop.travel(*datetime)
end
end
|
.travel_temporarily_to(*datetime, freeze: true, &block) ⇒ Object
27
28
29
30
31
32
33
34
35
|
# File 'lib/test_suite_time_machine.rb', line 27
def self.travel_temporarily_to(*datetime, freeze: true, &block)
raise TimeTravelError, "TestSuiteTimeMachine.travel_temporarily_to requires a block" unless block_given?
if freeze
Timecop.freeze(*datetime, &block)
else
Timecop.travel(*datetime, &block)
end
end
|
.unfreeze! ⇒ Object
82
83
84
|
# File 'lib/test_suite_time_machine.rb', line 82
def self.unfreeze!
Timecop.travel(now)
end
|