hyper-spec 0.1.2 → 0.99.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.
- checksums.yaml +5 -5
- data/.gitignore +3 -0
- data/.travis.yml +26 -0
- data/Gemfile +3 -2
- data/Gemfile.lock +222 -193
- data/README.md +3 -1
- data/Rakefile +6 -0
- data/hyper-spec.gemspec +45 -57
- data/lib/bin/firebug-2.0.19-fx.xpi +0 -0
- data/lib/hyper-spec.rb +57 -38
- data/lib/hyper-spec/component_test_helpers.rb +91 -37
- data/lib/hyper-spec/time_cop.rb +152 -2
- data/lib/hyper-spec/version.rb +1 -1
- data/lib/hyper-spec/wait_for_ajax.rb +23 -8
- data/lib/react/top_level_rails_component.rb +37 -47
- data/lib/selenium/web_driver/firefox/profile.rb +3 -3
- data/lib/sources/lolex.js +733 -0
- metadata +136 -87
- data/.rubocop.yml +0 -107
- data/CODE_OF_CONDUCT.md +0 -49
- data/LICENSE.txt +0 -21
- data/lib/hyper-spec/component_helpers.rb +0 -368
- data/lib/hyper-spec/lolex.rb +0 -66
- data/lib/hyper-spec/rails/engine.rb +0 -8
- data/lib/react/isomorphic_helpers.rb +0 -7
- data/vendor/assets/javascripts/lolex.js +0 -658
- data/vendor/assets/javascripts/time_cop.rb +0 -190
@@ -1,190 +0,0 @@
|
|
1
|
-
if RUBY_ENGINE == 'opal'
|
2
|
-
require 'lolex'
|
3
|
-
require 'time'
|
4
|
-
|
5
|
-
# Wrap the Lolex js package
|
6
|
-
class Lolex
|
7
|
-
class << self
|
8
|
-
def stack
|
9
|
-
@stack ||= []
|
10
|
-
end
|
11
|
-
|
12
|
-
def push(time, scale = 1, resolution = 10)
|
13
|
-
puts "Lolex.push(#{time}, #{scale}, #{resolution})"
|
14
|
-
time = Time.parse(time) if time.is_a? String
|
15
|
-
stack << [Time.now, @scale, @resolution]
|
16
|
-
update_lolex(time, scale, resolution)
|
17
|
-
end
|
18
|
-
|
19
|
-
def pop
|
20
|
-
update_lolex(*stack.pop) unless stack.empty?
|
21
|
-
end
|
22
|
-
|
23
|
-
def unmock(time, resolution)
|
24
|
-
push(time, 1, resolution)
|
25
|
-
@backup_stack = stack
|
26
|
-
@stack = []
|
27
|
-
end
|
28
|
-
|
29
|
-
def restore
|
30
|
-
@stack = @backup_stack
|
31
|
-
pop
|
32
|
-
end
|
33
|
-
|
34
|
-
def tick
|
35
|
-
real_clock = `(new #{@lolex}['_Date']).getTime()`
|
36
|
-
mock_clock = Time.now.to_f * 1000
|
37
|
-
real_elapsed_time = real_clock - @real_start_time
|
38
|
-
mock_elapsed_time = mock_clock - @mock_start_time
|
39
|
-
|
40
|
-
ticks = real_elapsed_time * @scale - mock_elapsed_time
|
41
|
-
|
42
|
-
`#{@lolex}.tick(#{ticks.to_i})`
|
43
|
-
nil
|
44
|
-
end
|
45
|
-
|
46
|
-
def create_ticker
|
47
|
-
return unless @scale && @scale > 0
|
48
|
-
ticker = %x{
|
49
|
-
#{@lolex}['_setInterval'].call(
|
50
|
-
window,
|
51
|
-
function() { #{tick} },
|
52
|
-
#{@resolution}
|
53
|
-
)
|
54
|
-
}
|
55
|
-
ticker
|
56
|
-
end
|
57
|
-
|
58
|
-
def update_lolex(time, scale, resolution)
|
59
|
-
`#{@lolex}.uninstall()` && return if scale.nil?
|
60
|
-
@mock_start_time = time.to_f * 1000
|
61
|
-
|
62
|
-
if @lolex
|
63
|
-
`#{@lolex}['_clearInterval'].call(window, #{@ticker})` if @ticker
|
64
|
-
@real_start_time = `(new #{@lolex}['_Date']).getTime()`
|
65
|
-
`#{@lolex}.tick(#{@mock_start_time - Time.now.to_f * 1000})`
|
66
|
-
else
|
67
|
-
@real_start_time = Time.now.to_f * 1000
|
68
|
-
@lolex = `lolex.install(window, #{@mock_start_time})`
|
69
|
-
end
|
70
|
-
|
71
|
-
@scale = scale
|
72
|
-
@resolution = resolution
|
73
|
-
@ticker = create_ticker
|
74
|
-
nil # must return nil otherwise we try to return a timer to server!
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
else
|
80
|
-
require 'timecop'
|
81
|
-
|
82
|
-
# Interface to the Lolex package running on the client side
|
83
|
-
# Below we will monkey patch Timecop to call these methods
|
84
|
-
class Lolex
|
85
|
-
class << self
|
86
|
-
def init(page, client_time_zone, resolution)
|
87
|
-
@capybara_page = page
|
88
|
-
@resolution = resolution || 10
|
89
|
-
@client_time_zone = client_time_zone
|
90
|
-
run_pending_evaluations
|
91
|
-
@initialized = true
|
92
|
-
end
|
93
|
-
|
94
|
-
def initialized?
|
95
|
-
@initialized
|
96
|
-
end
|
97
|
-
|
98
|
-
def push(mock_type, *args)
|
99
|
-
scale = if mock_type == :freeze
|
100
|
-
0
|
101
|
-
elsif mock_type == :scale
|
102
|
-
args[0]
|
103
|
-
else
|
104
|
-
1
|
105
|
-
end
|
106
|
-
evaluate_ruby do
|
107
|
-
"Lolex.push('#{time_string_in_zone}', #{scale}, #{@resolution})"
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
def pop
|
112
|
-
evaluate_ruby { 'Lolex.pop' }
|
113
|
-
end
|
114
|
-
|
115
|
-
def unmock
|
116
|
-
evaluate_ruby { "Lolex.unmock('#{time_string_in_zone}', #{@resolution})" }
|
117
|
-
end
|
118
|
-
|
119
|
-
def restore
|
120
|
-
evaluate_ruby { 'Lolex.restore' }
|
121
|
-
end
|
122
|
-
|
123
|
-
private
|
124
|
-
|
125
|
-
def time_string_in_zone
|
126
|
-
Time.now.in_time_zone(@client_time_zone).strftime('%Y/%m/%d %H:%M:%S %z')
|
127
|
-
end
|
128
|
-
|
129
|
-
def pending_evaluations
|
130
|
-
@pending_evaluations ||= []
|
131
|
-
end
|
132
|
-
|
133
|
-
def evaluate_ruby(&block)
|
134
|
-
if @capybara_page
|
135
|
-
@capybara_page.evaluate_ruby(yield)
|
136
|
-
else
|
137
|
-
pending_evaluations << block
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
def run_pending_evaluations
|
142
|
-
return if pending_evaluations.empty?
|
143
|
-
@capybara_page.evaluate_ruby(pending_evaluations.collect(&:call).join("\n"))
|
144
|
-
@pending_evaluations ||= []
|
145
|
-
end
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
# Monkey patches to call our Lolex interface
|
150
|
-
class Timecop
|
151
|
-
private
|
152
|
-
|
153
|
-
def travel(mock_type, *args, &block)
|
154
|
-
raise SafeModeException if Timecop.safe_mode? && !block_given?
|
155
|
-
|
156
|
-
stack_item = TimeStackItem.new(mock_type, *args)
|
157
|
-
|
158
|
-
stack_backup = @_stack.dup
|
159
|
-
@_stack << stack_item
|
160
|
-
|
161
|
-
Lolex.push(mock_type, *args)
|
162
|
-
|
163
|
-
if block_given?
|
164
|
-
begin
|
165
|
-
yield stack_item.time
|
166
|
-
ensure
|
167
|
-
Lolex.pop
|
168
|
-
@_stack.replace stack_backup
|
169
|
-
end
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
def return(&block)
|
174
|
-
current_stack = @_stack
|
175
|
-
current_baseline = @baseline
|
176
|
-
unmock!
|
177
|
-
yield
|
178
|
-
ensure
|
179
|
-
Lolex.restore
|
180
|
-
@_stack = current_stack
|
181
|
-
@baseline = current_baseline
|
182
|
-
end
|
183
|
-
|
184
|
-
def unmock! #:nodoc:
|
185
|
-
@baseline = nil
|
186
|
-
@_stack = []
|
187
|
-
Lolex.unmock
|
188
|
-
end
|
189
|
-
end
|
190
|
-
end
|