hyper-spec 1.0.alpha1.5 → 1.0.alpha1.6

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.
@@ -1,3 +1,3 @@
1
1
  module HyperSpec
2
- VERSION = '1.0.alpha1.5'
2
+ VERSION = '1.0.alpha1.6'
3
3
  end
@@ -29,7 +29,7 @@ module HyperSpec
29
29
  }
30
30
  })();
31
31
  CODE
32
- page.evaluate_script(jscode)
32
+ Capybara.page.evaluate_script(jscode)
33
33
  rescue Exception => e
34
34
  puts "wait_for_ajax failed while testing state of ajax requests: #{e}"
35
35
  end
@@ -0,0 +1,49 @@
1
+ each level copies instance variables from outer levels
2
+ there (seems) to be no way to create a config.before(:all) that works for each level of describe
3
+ but it could be done like this:
4
+
5
+ ```ruby
6
+ RSpec.configure do |config|
7
+ config.before(:each) do |example|
8
+ puts "#{example} - client_loaded: #{example.example_group.metadata[:client_loaded?]}"
9
+ unless example.example_group.metadata[:client_loaded?]
10
+ example.example_group.metadata[:client_loaded?] = true
11
+ # do whatever needs to be done once per context
12
+ end
13
+ end
14
+ end
15
+ ```
16
+
17
+ ```ruby
18
+ describe "outer describe" do
19
+ before(:all) do
20
+ # mount, before_mount, on_client, insert_html, etc all queue up
21
+ end
22
+ it "spec 1" do
23
+ # outer describe before(:all) client stuff executed here
24
+ puts "spec 1"
25
+ end
26
+ describe "inner describe 1" do
27
+ before(:all) do
28
+ # reload <- will restore client context to state at end of parent before(:all)
29
+ end
30
+ it "spec 1.1" do
31
+ puts "spec 1.1"
32
+ end
33
+ it "spec 1.2" do
34
+ puts "spec 1.2"
35
+ end
36
+ end
37
+ describe "inner describe 2" do
38
+ it "spec 2.1" do
39
+ puts "spec 2.1"
40
+ end
41
+ it "spec 1.2" do
42
+ puts "spec 2.2"
43
+ end
44
+ end
45
+ it "spec 2" do
46
+ puts "spec 2"
47
+ end
48
+ end
49
+ ```
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hyper-spec
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.alpha1.5
4
+ version: 1.0.alpha1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mitch VanDuyn
@@ -10,10 +10,10 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2019-06-19 00:00:00.000000000 Z
13
+ date: 2021-03-29 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- name: capybara
16
+ name: actionview
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
19
  - - ">="
@@ -27,35 +27,35 @@ dependencies:
27
27
  - !ruby/object:Gem::Version
28
28
  version: '0'
29
29
  - !ruby/object:Gem::Dependency
30
- name: chromedriver-helper
30
+ name: capybara
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
- - - '='
33
+ - - ">="
34
34
  - !ruby/object:Gem::Version
35
- version: 1.2.0
35
+ version: '0'
36
36
  type: :runtime
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
- - - '='
40
+ - - ">="
41
41
  - !ruby/object:Gem::Version
42
- version: 1.2.0
42
+ version: '0'
43
43
  - !ruby/object:Gem::Dependency
44
- name: libv8
44
+ name: chromedriver-helper
45
45
  requirement: !ruby/object:Gem::Requirement
46
46
  requirements:
47
- - - "~>"
47
+ - - '='
48
48
  - !ruby/object:Gem::Version
49
- version: 6.7.0
49
+ version: 1.2.0
50
50
  type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
- - - "~>"
54
+ - - '='
55
55
  - !ruby/object:Gem::Version
56
- version: 6.7.0
56
+ version: 1.2.0
57
57
  - !ruby/object:Gem::Dependency
58
- name: method_source
58
+ name: filecache
59
59
  requirement: !ruby/object:Gem::Requirement
60
60
  requirements:
61
61
  - - ">="
@@ -69,19 +69,19 @@ dependencies:
69
69
  - !ruby/object:Gem::Version
70
70
  version: '0'
71
71
  - !ruby/object:Gem::Dependency
72
- name: mini_racer
72
+ name: method_source
73
73
  requirement: !ruby/object:Gem::Requirement
74
74
  requirements:
75
- - - "~>"
75
+ - - ">="
76
76
  - !ruby/object:Gem::Version
77
- version: 0.2.4
77
+ version: '0'
78
78
  type: :runtime
79
79
  prerelease: false
80
80
  version_requirements: !ruby/object:Gem::Requirement
81
81
  requirements:
82
- - - "~>"
82
+ - - ">="
83
83
  - !ruby/object:Gem::Version
84
- version: 0.2.4
84
+ version: '0'
85
85
  - !ruby/object:Gem::Dependency
86
86
  name: opal
87
87
  requirement: !ruby/object:Gem::Requirement
@@ -91,7 +91,7 @@ dependencies:
91
91
  version: 0.11.0
92
92
  - - "<"
93
93
  - !ruby/object:Gem::Version
94
- version: 0.12.0
94
+ version: '2.0'
95
95
  type: :runtime
96
96
  prerelease: false
97
97
  version_requirements: !ruby/object:Gem::Requirement
@@ -101,7 +101,7 @@ dependencies:
101
101
  version: 0.11.0
102
102
  - - "<"
103
103
  - !ruby/object:Gem::Version
104
- version: 0.12.0
104
+ version: '2.0'
105
105
  - !ruby/object:Gem::Dependency
106
106
  name: parser
107
107
  requirement: !ruby/object:Gem::Requirement
@@ -117,21 +117,7 @@ dependencies:
117
117
  - !ruby/object:Gem::Version
118
118
  version: 2.3.3.1
119
119
  - !ruby/object:Gem::Dependency
120
- name: pry
121
- requirement: !ruby/object:Gem::Requirement
122
- requirements:
123
- - - ">="
124
- - !ruby/object:Gem::Version
125
- version: '0'
126
- type: :runtime
127
- prerelease: false
128
- version_requirements: !ruby/object:Gem::Requirement
129
- requirements:
130
- - - ">="
131
- - !ruby/object:Gem::Version
132
- version: '0'
133
- - !ruby/object:Gem::Dependency
134
- name: rspec-rails
120
+ name: rspec
135
121
  requirement: !ruby/object:Gem::Requirement
136
122
  requirements:
137
123
  - - ">="
@@ -220,34 +206,42 @@ dependencies:
220
206
  requirements:
221
207
  - - ">="
222
208
  - !ruby/object:Gem::Version
223
- version: 1.17.3
224
- - - "<"
225
- - !ruby/object:Gem::Version
226
- version: '2.1'
209
+ version: '0'
227
210
  type: :development
228
211
  prerelease: false
229
212
  version_requirements: !ruby/object:Gem::Requirement
230
213
  requirements:
231
214
  - - ">="
232
215
  - !ruby/object:Gem::Version
233
- version: 1.17.3
234
- - - "<"
235
- - !ruby/object:Gem::Version
236
- version: '2.1'
216
+ version: '0'
237
217
  - !ruby/object:Gem::Dependency
238
218
  name: hyper-component
239
219
  requirement: !ruby/object:Gem::Requirement
240
220
  requirements:
241
221
  - - '='
242
222
  - !ruby/object:Gem::Version
243
- version: 1.0.alpha1.5
223
+ version: 1.0.alpha1.6
244
224
  type: :development
245
225
  prerelease: false
246
226
  version_requirements: !ruby/object:Gem::Requirement
247
227
  requirements:
248
228
  - - '='
249
229
  - !ruby/object:Gem::Version
250
- version: 1.0.alpha1.5
230
+ version: 1.0.alpha1.6
231
+ - !ruby/object:Gem::Dependency
232
+ name: mini_racer
233
+ requirement: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - ">="
236
+ - !ruby/object:Gem::Version
237
+ version: '0'
238
+ type: :development
239
+ prerelease: false
240
+ version_requirements: !ruby/object:Gem::Requirement
241
+ requirements:
242
+ - - ">="
243
+ - !ruby/object:Gem::Version
244
+ version: '0'
251
245
  - !ruby/object:Gem::Dependency
252
246
  name: opal-browser
253
247
  requirement: !ruby/object:Gem::Requirement
@@ -266,14 +260,14 @@ dependencies:
266
260
  name: opal-rails
267
261
  requirement: !ruby/object:Gem::Requirement
268
262
  requirements:
269
- - - "~>"
263
+ - - ">="
270
264
  - !ruby/object:Gem::Version
271
265
  version: 0.9.4
272
266
  type: :development
273
267
  prerelease: false
274
268
  version_requirements: !ruby/object:Gem::Requirement
275
269
  requirements:
276
- - - "~>"
270
+ - - ">="
277
271
  - !ruby/object:Gem::Version
278
272
  version: 0.9.4
279
273
  - !ruby/object:Gem::Dependency
@@ -290,6 +284,20 @@ dependencies:
290
284
  - - ">="
291
285
  - !ruby/object:Gem::Version
292
286
  version: '0'
287
+ - !ruby/object:Gem::Dependency
288
+ name: pry-stack_explorer
289
+ requirement: !ruby/object:Gem::Requirement
290
+ requirements:
291
+ - - ">="
292
+ - !ruby/object:Gem::Version
293
+ version: '0'
294
+ type: :development
295
+ prerelease: false
296
+ version_requirements: !ruby/object:Gem::Requirement
297
+ requirements:
298
+ - - ">="
299
+ - !ruby/object:Gem::Version
300
+ version: '0'
293
301
  - !ruby/object:Gem::Dependency
294
302
  name: puma
295
303
  requirement: !ruby/object:Gem::Requirement
@@ -310,14 +318,20 @@ dependencies:
310
318
  requirements:
311
319
  - - ">="
312
320
  - !ruby/object:Gem::Version
313
- version: 4.0.0
321
+ version: 5.0.0
322
+ - - "<"
323
+ - !ruby/object:Gem::Version
324
+ version: '7.0'
314
325
  type: :development
315
326
  prerelease: false
316
327
  version_requirements: !ruby/object:Gem::Requirement
317
328
  requirements:
318
329
  - - ">="
319
330
  - !ruby/object:Gem::Version
320
- version: 4.0.0
331
+ version: 5.0.0
332
+ - - "<"
333
+ - !ruby/object:Gem::Version
334
+ version: '7.0'
321
335
  - !ruby/object:Gem::Dependency
322
336
  name: rake
323
337
  requirement: !ruby/object:Gem::Requirement
@@ -352,6 +366,20 @@ dependencies:
352
366
  - - "<"
353
367
  - !ruby/object:Gem::Version
354
368
  version: 2.5.0
369
+ - !ruby/object:Gem::Dependency
370
+ name: rspec-rails
371
+ requirement: !ruby/object:Gem::Requirement
372
+ requirements:
373
+ - - ">="
374
+ - !ruby/object:Gem::Version
375
+ version: '0'
376
+ type: :development
377
+ prerelease: false
378
+ version_requirements: !ruby/object:Gem::Requirement
379
+ requirements:
380
+ - - ">="
381
+ - !ruby/object:Gem::Version
382
+ version: '0'
355
383
  - !ruby/object:Gem::Dependency
356
384
  name: rspec-collection_matchers
357
385
  requirement: !ruby/object:Gem::Requirement
@@ -498,14 +526,24 @@ files:
498
526
  - lib/bin/firebug-2.0.13-fx.xpi
499
527
  - lib/bin/firebug-2.0.19-fx.xpi
500
528
  - lib/hyper-spec.rb
501
- - lib/hyper-spec/component_test_helpers.rb
502
- - lib/hyper-spec/time_cop.rb
503
- - lib/hyper-spec/unparser_patch.rb
529
+ - lib/hyper-spec/controller_helpers.rb
530
+ - lib/hyper-spec/expectations.rb
531
+ - lib/hyper-spec/helpers.rb
532
+ - lib/hyper-spec/internal/client_execution.rb
533
+ - lib/hyper-spec/internal/component_mount.rb
534
+ - lib/hyper-spec/internal/controller.rb
535
+ - lib/hyper-spec/internal/copy_locals.rb
536
+ - lib/hyper-spec/internal/patches.rb
537
+ - lib/hyper-spec/internal/rails_controller_helpers.rb
538
+ - lib/hyper-spec/internal/time_cop.rb
539
+ - lib/hyper-spec/internal/window_sizing.rb
540
+ - lib/hyper-spec/rack.rb
504
541
  - lib/hyper-spec/version.rb
505
542
  - lib/hyper-spec/wait_for_ajax.rb
506
543
  - lib/selenium/web_driver/firefox/profile.rb
507
544
  - lib/sources/lolex.js
508
545
  - lib/sources/top_level_rails_component.rb
546
+ - multi_level_how_it_works.md
509
547
  homepage: http://ruby-hyperloop.org
510
548
  licenses:
511
549
  - MIT
@@ -525,7 +563,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
525
563
  - !ruby/object:Gem::Version
526
564
  version: 1.3.1
527
565
  requirements: []
528
- rubygems_version: 3.0.4
566
+ rubygems_version: 3.0.8
529
567
  signing_key:
530
568
  specification_version: 4
531
569
  summary: Drive your Hyperloop client and server specs from RSpec and Capybara
@@ -1,365 +0,0 @@
1
- # see component_test_helpers_spec.rb for examples
2
- require 'parser/current'
3
- require 'unparser'
4
- require 'hyper-spec/unparser_patch'
5
- require 'method_source'
6
- require_relative '../../lib/hyper-spec/time_cop.rb'
7
-
8
- Parser::Builders::Default.emit_procarg0 = true
9
-
10
- module HyperSpec
11
- module ComponentTestHelpers
12
- TOP_LEVEL_COMPONENT_PATCH =
13
- Opal.compile(File.read(File.expand_path('../../sources/top_level_rails_component.rb', __FILE__)))
14
- TIME_COP_CLIENT_PATCH =
15
- Opal.compile(File.read(File.expand_path('../../hyper-spec/time_cop.rb', __FILE__))) +
16
- "\n#{File.read(File.expand_path('../../sources/lolex.js', __FILE__))}"
17
-
18
- class << self
19
- attr_accessor :current_example
20
- attr_accessor :description_displayed
21
-
22
- def display_example_description
23
- "<script type='text/javascript'>console.log('%c#{current_example.description}'"\
24
- ",'color:green; font-weight:bold; font-size: 200%')</script>"
25
- end
26
- end
27
-
28
- def build_test_url_for(controller)
29
- unless controller
30
- unless defined?(::HyperstackTestController)
31
- Object.const_set('HyperstackTestController', Class.new(::ActionController::Base))
32
- end
33
-
34
- controller = ::HyperstackTestController
35
- end
36
-
37
- route_root = controller.name.gsub(/Controller$/, '').underscore
38
-
39
- unless controller.method_defined?(:test)
40
- controller.class_eval do
41
- define_method(:test) do
42
- route_root = self.class.name.gsub(/Controller$/, '').underscore
43
- test_params = ::Rails.cache.read("/#{route_root}/#{params[:id]}")
44
- @component_name = test_params[0]
45
- @component_params = test_params[1]
46
- render_params = test_params[2]
47
- render_on = render_params.delete(:render_on) || :client_only
48
- _mock_time = render_params.delete(:mock_time)
49
- style_sheet = render_params.delete(:style_sheet)
50
- javascript = render_params.delete(:javascript)
51
- code = render_params.delete(:code)
52
-
53
- page = '<%= react_component @component_name, @component_params, '\
54
- "{ prerender: #{render_on != :client_only} } %>"
55
- unless render_on == :server_only
56
- page = "<script type='text/javascript'>\n#{TOP_LEVEL_COMPONENT_PATCH}\n</script>\n#{page}"
57
- page = "<script type='text/javascript'>\n#{code}\n</script>\n#{page}" if code
58
- end
59
-
60
- if render_on != :server_only || Lolex.initialized?
61
- page = "<script type='text/javascript'>\n#{TIME_COP_CLIENT_PATCH}\n</script>\n#{page}"
62
- end
63
-
64
- if (render_on != :server_only && !render_params[:layout]) || javascript
65
- page = "<%= javascript_include_tag '#{javascript || 'application'}' %>\n#{page}"
66
- end
67
-
68
- if !render_params[:layout] || style_sheet
69
- page = "<%= stylesheet_link_tag '#{style_sheet || 'application'}' %>\n#{page}"
70
- end
71
- page = "<script type='text/javascript'>go = function() "\
72
- "{window.hyper_spec_waiting_for_go = false}</script>\n#{page}"
73
-
74
- title = view_context.escape_javascript(ComponentTestHelpers.current_example.description)
75
- title = "#{title}...continued." if ComponentTestHelpers.description_displayed
76
-
77
- page = "<script type='text/javascript'>console.log('%c#{title}',"\
78
- "'color:green; font-weight:bold; font-size: 200%')</script>\n#{page}"
79
-
80
- ComponentTestHelpers.description_displayed = true
81
- render_params[:inline] = page
82
- render render_params
83
- end
84
- end
85
-
86
- begin
87
- routes = ::Rails.application.routes
88
- routes.disable_clear_and_finalize = true
89
- routes.clear!
90
- routes.draw do
91
- get "/#{route_root}/:id", to: "#{route_root}#test"
92
- end
93
- ::Rails.application.routes_reloader.paths.each { |path| load(path) }
94
- routes.finalize!
95
- ActiveSupport.on_load(:action_controller) { routes.finalize! }
96
- ensure
97
- routes.disable_clear_and_finalize = false
98
- end
99
- end
100
-
101
- "/#{route_root}/#{@test_id = (@test_id || 0) + 1}"
102
- end
103
-
104
- def isomorphic(&block)
105
- yield
106
- on_client(&block)
107
- end
108
-
109
- def evaluate_ruby(str = '', opts = {}, &block)
110
- insure_mount
111
- if block
112
- str = "#{str}\n#{Unparser.unparse Parser::CurrentRuby.parse(block.source).children.last}"
113
- end
114
- js = Opal.compile(str).gsub("// Prepare super implicit arguments\n", "")
115
- .delete("\n").gsub('(Opal);', '(Opal)')
116
- # workaround for firefox 58 and geckodriver 0.19.1, because firefox is unable to find .$to_json:
117
- # JSON.parse(evaluate_script("(function(){var a=Opal.Array.$new(); a[0]=#{js}; return a.$to_json();})();"), opts).first
118
- JSON.parse(evaluate_script("[#{js}].$to_json()"), opts).first
119
- end
120
-
121
- def expect_evaluate_ruby(str = '', opts = {}, &block)
122
- insure_mount
123
- expect(evaluate_ruby(add_opal_block(str, block), opts))
124
- end
125
-
126
- def add_opal_block(str, block)
127
- # big assumption here is that we are going to follow this with a .to
128
- # hence .children.first followed by .children.last
129
- # probably should do some kind of "search" to make this work nicely
130
- return str unless block
131
- "#{str}\n"\
132
- "#{Unparser.unparse Parser::CurrentRuby.parse(block.source).children.first.children.last}"
133
- end
134
-
135
- def evaluate_promise(str = '', opts = {}, &block)
136
- insure_mount
137
- str = "#{str}\n#{Unparser.unparse Parser::CurrentRuby.parse(block.source).children.last}" if block
138
- str = "#{str}.then { |args| args = [args]; `window.hyper_spec_promise_result = args` }"
139
- js = Opal.compile(str).gsub("\n","").gsub("(Opal);","(Opal)")
140
- page.evaluate_script("window.hyper_spec_promise_result = false")
141
- page.execute_script(js)
142
- Timeout.timeout(Capybara.default_max_wait_time) do
143
- loop do
144
- sleep 0.25
145
- break if page.evaluate_script("!!window.hyper_spec_promise_result")
146
- end
147
- end
148
- JSON.parse(page.evaluate_script("window.hyper_spec_promise_result.$to_json()"), opts).first
149
- end
150
-
151
- def expect_promise(str = '', opts = {}, &block)
152
- insure_mount
153
- expect(evaluate_promise(add_opal_block(str, block), opts))
154
- end
155
-
156
- def ppr(str)
157
- js = Opal.compile(str).delete("\n").gsub('(Opal);', '(Opal)')
158
- execute_script("console.log(#{js})")
159
- end
160
-
161
- def on_client(&block)
162
- @client_code =
163
- "#{@client_code}#{Unparser.unparse Parser::CurrentRuby.parse(block.source).children.last}\n"
164
- end
165
-
166
- def debugger
167
- `debugger`
168
- nil
169
- end
170
-
171
- def insure_mount
172
- # rescue in case page is not defined...
173
- mount unless page.instance_variable_get('@hyper_spec_mounted')
174
- end
175
-
176
- def client_option(opts = {})
177
- @client_options ||= {}
178
- @client_options.merge! opts
179
- end
180
-
181
- alias client_options client_option
182
-
183
- def mount(component_name = nil, params = nil, opts = {}, &block)
184
- unless params
185
- params = opts
186
- opts = {}
187
- end
188
-
189
- opts = client_options opts
190
- test_url = build_test_url_for(opts.delete(:controller))
191
-
192
- if block || @client_code || component_name.nil?
193
- block_with_helpers = <<-code
194
- module ComponentHelpers
195
- def self.js_eval(s)
196
- `eval(s)`
197
- end
198
- def self.dasherize(s)
199
- res = %x{
200
- s.replace(/[-_\\s]+/g, '-')
201
- .replace(/([A-Z\\d]+)([A-Z][a-z])/g, '$1-$2')
202
- .replace(/([a-z\\d])([A-Z])/g, '$1-$2')
203
- .toLowerCase()
204
- }
205
- res
206
- end
207
- def self.add_class(class_name, styles={})
208
- style = styles.collect { |attr, value| "\#{dasherize(attr)}:\#{value}" }.join("; ")
209
- cs = class_name.to_s
210
- %x{
211
- var style_el = document.createElement("style");
212
- var css = "." + cs + " { " + style + " }";
213
- style_el.type = "text/css";
214
- if (style_el.styleSheet){
215
- style_el.styleSheet.cssText = css;
216
- } else {
217
- style_el.appendChild(document.createTextNode(css));
218
- }
219
- document.head.appendChild(style_el);
220
- }
221
- end
222
- end
223
- class Hyperstack::Internal::Component::TestDummy
224
- include Hyperstack::Component
225
- render {}
226
- end
227
- #{@client_code}
228
- #{Unparser.unparse(Parser::CurrentRuby.parse(block.source).children.last) if block}
229
- code
230
- opts[:code] = Opal.compile(block_with_helpers)
231
- end
232
-
233
- component_name ||= 'Hyperstack::Internal::Component::TestDummy'
234
- ::Rails.cache.write(test_url, [component_name, params, opts])
235
- test_code_key = "hyper_spec_prerender_test_code.js"
236
- @@original_server_render_files ||= ::Rails.configuration.react.server_renderer_options[:files]
237
- if opts[:render_on] == :both || opts[:render_on] == :server_only
238
- unless opts[:code].blank?
239
- ::Rails.cache.write(test_code_key, opts[:code])
240
- ::Rails.configuration.react.server_renderer_options[:files] = @@original_server_render_files + [test_code_key]
241
- ::React::ServerRendering.reset_pool # make sure contexts are reloaded so they dont use code from cache, as the rails filewatcher doesnt look for cache changes
242
- else
243
- ::Rails.cache.delete(test_code_key)
244
- ::Rails.configuration.react.server_renderer_options[:files] = @@original_server_render_files
245
- ::React::ServerRendering.reset_pool # make sure contexts are reloaded so they dont use code from cache, as the rails filewatcher doesnt look for cache changes
246
- end
247
- end
248
- visit test_url
249
- wait_for_ajax unless opts[:no_wait]
250
- page.instance_variable_set('@hyper_spec_mounted', true)
251
- Lolex.init(self, client_options[:time_zone], client_options[:clock_resolution])
252
- end
253
-
254
- [:callback_history_for, :last_callback_for, :clear_callback_history_for,
255
- :event_history_for, :last_event_for, :clear_event_history_for].each do |method|
256
- define_method(method) do |event_name|
257
- evaluate_ruby("Hyperstack::Internal::Component::TopLevelRailsComponent.#{method}('#{event_name}')")
258
- end
259
- end
260
-
261
- def run_on_client(&block)
262
- script = Opal.compile(Unparser.unparse(Parser::CurrentRuby.parse(block.source).children.last))
263
- execute_script(script)
264
- end
265
-
266
- def add_class(class_name, style)
267
- @client_code = "#{@client_code}ComponentHelpers.add_class('#{class_name}', #{style})\n"
268
- end
269
-
270
- def open_in_chrome
271
- if false && ['linux', 'freebsd'].include?(`uname`.downcase)
272
- `google-chrome http://#{page.server.host}:#{page.server.port}#{page.current_path}`
273
- else
274
- `open http://#{page.server.host}:#{page.server.port}#{page.current_path}`
275
- end
276
-
277
- while true
278
- sleep 1.hour
279
- end
280
- end
281
-
282
- def pause(message = nil)
283
- if message
284
- puts message
285
- page.evaluate_script "console.log('#{message} (type go() to continue)')"
286
- end
287
-
288
- page.evaluate_script('window.hyper_spec_waiting_for_go = true')
289
- page.evaluate_script('go = function() {window.hyper_spec_waiting_for_go = false}')
290
- loop do
291
- sleep 0.25
292
- break unless page.evaluate_script('window.hyper_spec_waiting_for_go')
293
- end
294
- end
295
-
296
- def wait_for_size(width, height)
297
- start_time = Capybara::Helpers.monotonic_time
298
- stable_count_w = 0
299
- stable_count_h = 0
300
- prev_size = [0, 0]
301
- begin
302
- sleep 0.05
303
- curr_size = Capybara.current_session.current_window.size
304
- return if [width, height] == curr_size
305
- # some maximum or minimum is reached and size doesnt change anymore
306
- stable_count_w += 1 if prev_size[0] == curr_size[0]
307
- stable_count_h += 1 if prev_size[1] == curr_size[1]
308
- return if stable_count_w > 2 || stable_count_h > 2
309
- prev_size = curr_size
310
- end while (Capybara::Helpers.monotonic_time - start_time) < Capybara.current_session.config.default_max_wait_time
311
- raise Capybara::WindowError, "Window size not stable within #{Capybara.current_session.config.default_max_wait_time} seconds."
312
- end
313
-
314
- def size_window(width = nil, height = nil)
315
- # return if @window_cannot_be_resized
316
- # original_width = evaluate_script('window.innerWidth')
317
- # original_height = evaluate_script('window.innerHeight')
318
- width, height = [height, width] if width == :portrait
319
- width, height = width if width.is_a? Array
320
- portrait = true if height == :portrait
321
-
322
- case width
323
- when :small
324
- width, height = [480, 320]
325
- when :mobile
326
- width, height = [640, 480]
327
- when :tablet
328
- width, height = [960, 640]
329
- when :large
330
- width, height = [1920, 6000]
331
- when :default, nil
332
- width, height = [1024, 768]
333
- end
334
-
335
- width, height = [height, width] if portrait
336
-
337
- unless RSpec.configuration.debugger_width
338
- Capybara.current_session.current_window.resize_to(1000, 500)
339
- wait_for_size(1000, 500)
340
- inner_width = evaluate_script('window.innerWidth')
341
- RSpec.configuration.debugger_width = 1000 - inner_width
342
- end
343
- Capybara.current_session.current_window
344
- .resize_to(width + RSpec.configuration.debugger_width, height)
345
- wait_for_size(width + RSpec.configuration.debugger_width, height)
346
- end
347
- end
348
-
349
- RSpec.configure do |config|
350
- config.before(:each) do |example|
351
- ComponentTestHelpers.current_example = example
352
- ComponentTestHelpers.description_displayed = false
353
- end
354
-
355
- if defined?(ActiveRecord)
356
- config.before(:all) do
357
- ActiveRecord::Base.class_eval do
358
- def attributes_on_client(page)
359
- page.evaluate_ruby("#{self.class.name}.find(#{id}).attributes", symbolize_names: true)
360
- end
361
- end
362
- end
363
- end
364
- end
365
- end