hyper-spec 1.0.alpha1.8 → 1.0.0.lap28

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,50 +0,0 @@
1
- module HyperSpec
2
- module Internal
3
- module RailsControllerHelpers
4
- def self.included(base)
5
- base.include ControllerHelpers
6
- base.include Helpers
7
- routes = ::Rails.application.routes
8
- routes.disable_clear_and_finalize = true
9
- routes.clear!
10
- routes.draw { get "/#{base.route_root}/:id", to: "#{base.route_root}#test" }
11
- ::Rails.application.routes_reloader.paths.each { |path| load(path) }
12
- routes.finalize!
13
- ActiveSupport.on_load(:action_controller) { routes.finalize! }
14
- ensure
15
- routes.disable_clear_and_finalize = false
16
- end
17
-
18
- module Helpers
19
- def ping!
20
- head(:no_content)
21
- nil
22
- end
23
-
24
- def mount_component!
25
- @page << '<%= react_component @component_name, @component_params, '\
26
- "{ prerender: #{@render_on != :client_only} } %>"
27
- end
28
-
29
- def application!(file)
30
- @page << "<%= javascript_include_tag '#{file}' %>"
31
- end
32
-
33
- def style_sheet!(file)
34
- @page << "<%= stylesheet_link_tag '#{file}' %>"
35
- end
36
-
37
- def deliver!
38
- @render_params[:inline] = @page
39
- response.headers['Cache-Control'] = 'max-age=120'
40
- response.headers['X-Tracking-ID'] = '123456'
41
- render @render_params
42
- end
43
-
44
- def server_only?
45
- @render_on == :server_only
46
- end
47
- end
48
- end
49
- end
50
- end
@@ -1,73 +0,0 @@
1
- module HyperSpec
2
- module Internal
3
- module WindowSizing
4
- private
5
-
6
- STD_SIZES = {
7
- small: [480, 320],
8
- mobile: [640, 480],
9
- tablet: [960, 640],
10
- large: [1920, 6000],
11
- default: [1024, 768]
12
- }
13
-
14
- def determine_size(width, height)
15
- width, height = [height, width] if width == :portrait
16
- width, height = width if width.is_a? Array
17
- portrait = true if height == :portrait
18
- width ||= :default
19
- width, height = STD_SIZES[width] if STD_SIZES[width]
20
- width, height = [height, width] if portrait
21
- [width + debugger_width, height]
22
- end
23
-
24
- def debugger_width
25
- RSpec.configuration.debugger_width ||= begin
26
- hs_internal_resize_to(1000, 500) do
27
- sleep RSpec.configuration.wait_for_initialization_time
28
- end
29
- inner_width = evaluate_script('window.innerWidth')
30
- 1000 - inner_width
31
- end
32
- RSpec.configuration.debugger_width
33
- end
34
-
35
- def hs_internal_resize_to(width, height)
36
- Capybara.current_session.current_window.resize_to(width, height)
37
- yield if block_given?
38
- wait_for_size(width, height)
39
- end
40
-
41
- def wait_for_size(width, height)
42
- @start_time = Capybara::Helpers.monotonic_time
43
- @stable_count_w = @stable_count_h = 0
44
- prev_size = [0, 0]
45
- loop do
46
- sleep 0.05
47
- curr_size = evaluate_script('[window.innerWidth, window.innerHeight]')
48
-
49
- return true if curr_size == [width, height] || stalled?(prev_size, curr_size)
50
-
51
- prev_size = curr_size
52
- check_time!
53
- end
54
- end
55
-
56
- def check_time!
57
- if (Capybara::Helpers.monotonic_time - @start_time) >
58
- Capybara.current_session.config.default_max_wait_time
59
- raise Capybara::WindowError,
60
- 'Window size not stable within '\
61
- "#{Capybara.current_session.config.default_max_wait_time} seconds."
62
- end
63
- end
64
-
65
- def stalled?(prev_size, curr_size)
66
- # some maximum or minimum is reached and size doesn't change anymore
67
- @stable_count_w += 1 if prev_size[0] == curr_size[0]
68
- @stable_count_h += 1 if prev_size[1] == curr_size[1]
69
- @stable_count_w > 4 || @stable_count_h > 4
70
- end
71
- end
72
- end
73
- end
@@ -1,67 +0,0 @@
1
- require 'hyper-spec'
2
-
3
- class HyperSpecTestController < SimpleDelegator
4
- include HyperSpec::ControllerHelpers
5
-
6
- class << self
7
- attr_reader :sprocket_server
8
- attr_reader :asset_path
9
-
10
- def wrap(app:, append_path: 'app', asset_path: '/assets')
11
- @sprocket_server = Opal::Sprockets::Server.new do |s|
12
- s.append_path append_path
13
- end
14
-
15
- @asset_path = asset_path
16
-
17
- ::Rack::Builder.app(app) do
18
- map "/#{HyperSpecTestController.route_root}" do
19
- use HyperSpecTestController
20
- end
21
- end
22
- end
23
- end
24
-
25
- def sprocket_server
26
- self.class.sprocket_server
27
- end
28
-
29
- def asset_path
30
- self.class.asset_path
31
- end
32
-
33
- def ping!
34
- [204, {}, []]
35
- end
36
-
37
- def application!(file)
38
- @page << Opal::Sprockets.javascript_include_tag(
39
- file,
40
- debug: true,
41
- sprockets: sprocket_server.sprockets,
42
- prefix: asset_path
43
- )
44
- end
45
-
46
- def json!
47
- @page << Opal::Sprockets.javascript_include_tag(
48
- 'json',
49
- debug: true,
50
- sprockets: sprocket_server.sprockets,
51
- prefix: asset_path
52
- )
53
- end
54
-
55
-
56
- def style_sheet!(_file_); end
57
-
58
- def deliver!
59
- [200, { 'Content-Type' => 'text/html' }, [@page]]
60
- end
61
-
62
- def call(env)
63
- __setobj__(Rack::Request.new(env))
64
- params[:id] = path.split('/').last
65
- test
66
- end
67
- end
@@ -1,103 +0,0 @@
1
- module Hyperstack
2
- module Internal
3
- module Component
4
- class TopLevelRailsComponent
5
-
6
- # original class declares these params:
7
- # param :component_name
8
- # param :controller
9
- # param :render_params
10
-
11
- class << self
12
- attr_accessor :event_history
13
-
14
- def callback_history_for(proc_name)
15
- event_history[proc_name]
16
- end
17
-
18
- def last_callback_for(proc_name)
19
- event_history[proc_name].last
20
- end
21
-
22
- def clear_callback_history_for(proc_name)
23
- event_history[proc_name] = []
24
- end
25
-
26
- def event_history_for(event_name)
27
- event_history["on_#{event_name}"]
28
- end
29
-
30
- def last_event_for(event_name)
31
- event_history["on_#{event_name}"].last
32
- end
33
-
34
- def clear_event_history_for(event_name)
35
- event_history["on_#{event_name}"] = []
36
- end
37
- end
38
-
39
- def component
40
- return @component if @component
41
- paths_searched = []
42
- component = nil
43
- if @ComponentName.start_with?('::')
44
- # if absolute path of component is given, look it up and fail if not found
45
- paths_searched << @ComponentName
46
- component = begin
47
- Object.const_get(@ComponentName)
48
- rescue NameError
49
- nil
50
- end
51
- else
52
- # if relative path is given, look it up like this
53
- # 1) we check each path + controller-name + component-name
54
- # 2) if we can't find it there we check each path + component-name
55
- # if we can't find it we just try const_get
56
- # so (assuming controller name is Home)
57
- # ::Foo::Bar will only resolve to some component named ::Foo::Bar
58
- # but Foo::Bar will check (in this order) ::Home::Foo::Bar, ::Components::Home::Foo::Bar, ::Foo::Bar, ::Components::Foo::Bar
59
- self.class.search_path.each do |scope|
60
- paths_searched << "#{scope.name}::#{@Controller}::#{@ComponentName}"
61
- component = begin
62
- scope.const_get(@Controller, false).const_get(@ComponentName, false)
63
- rescue NameError
64
- nil
65
- end
66
- break if component != nil
67
- end
68
- unless component
69
- self.class.search_path.each do |scope|
70
- paths_searched << "#{scope.name}::#{@ComponentName}"
71
- component = begin
72
- scope.const_get(@ComponentName, false)
73
- rescue NameError
74
- nil
75
- end
76
- break if component != nil
77
- end
78
- end
79
- end
80
- @component = component
81
- return @component if @component && @component.method_defined?(:render)
82
- raise "Could not find component class '#{@ComponentName}' for @Controller '#{@Controller}' in any component directory. Tried [#{paths_searched.join(", ")}]"
83
- end
84
-
85
- before_mount do
86
- TopLevelRailsComponent.event_history = Hash.new { |h, k| h[k] = [] }
87
- component.validator.rules.each do |name, rules|
88
- next unless rules[:type] == Proc
89
-
90
- TopLevelRailsComponent.event_history[name] = []
91
- @RenderParams[name] = lambda do |*args|
92
- TopLevelRailsComponent.event_history[name] << args
93
- end
94
- end
95
- end
96
-
97
- def render
98
- Hyperstack::Internal::Component::RenderingContext.render(component, @RenderParams)
99
- end
100
- end
101
- end
102
- end
103
- end
@@ -1,49 +0,0 @@
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
- ```