lib/hyper-spec.rb in hyper-spec-1.0.alpha1.5 vs lib/hyper-spec.rb in hyper-spec-1.0.alpha1.6
- old
+ new
@@ -1,35 +1,161 @@
-require 'capybara/rspec'
+# hyper-spec
+require 'action_view'
require 'opal'
+require 'unparser'
+require 'method_source'
+require 'filecache'
+
+require 'capybara/rspec'
+require 'hyper-spec/internal/client_execution'
+require 'hyper-spec/internal/component_mount'
+require 'hyper-spec/internal/controller'
+require 'hyper-spec/internal/copy_locals'
+require 'hyper-spec/internal/patches'
+require 'hyper-spec/internal/rails_controller_helpers'
+require 'hyper-spec/internal/time_cop.rb'
+require 'hyper-spec/internal/window_sizing'
+
+require 'hyper-spec/controller_helpers'
+
+require 'hyper-spec/wait_for_ajax'
+
+require 'hyper-spec/helpers'
+require 'hyper-spec/expectations'
+
+require 'parser/current'
+if defined?(Selenium::WebDriver::Firefox)
+ require 'selenium/web_driver/firefox/profile'
+end
require 'selenium-webdriver'
-require 'hyper-spec/component_test_helpers'
require 'hyper-spec/version'
-require 'hyper-spec/wait_for_ajax'
-require 'selenium/web_driver/firefox/profile'
+
+begin
+ require 'pry'
+rescue LoadError
+ nil
+end
+
+Parser::Builders::Default.emit_procarg0 = true
+
+# not available in parser 2.3
+if Parser::Builders::Default.respond_to? :emit_arg_inside_procarg0
+ Parser::Builders::Default.emit_arg_inside_procarg0 = true
+end
+
+module HyperSpec
+ if defined? Pry
+ # add a before eval hook to pry so we can capture the source
+ class << self
+ attr_accessor :current_pry_code_block
+ Pry.hooks.add_hook(:before_eval, 'hyper_spec_code_capture') do |code|
+ HyperSpec.current_pry_code_block = code
+ end
+ end
+ end
+
+ def self.reset_between_examples
+ @reset_between_examples ||= []
+ end
+
+ def self.reset_between_examples?
+ RSpec.configuration.reset_between_examples
+ end
+
+ def self.reset_sessions!
+ Capybara.old_reset_sessions!
+ end
+end
+
+# TODO: figure out why we need this patch - its because we are on an old version
+# of Selenium Webdriver, but why?
+require 'selenium-webdriver'
+
+module Selenium
+ module WebDriver
+ module Chrome
+ module Bridge
+ COMMANDS = remove_const(:COMMANDS).dup
+ COMMANDS[:get_log] = [:post, 'session/:session_id/log']
+ COMMANDS.freeze
+
+ def log(type)
+ data = execute :get_log, {}, type: type.to_s
+
+ Array(data).map do |l|
+ begin
+ LogEntry.new l.fetch('level', 'UNKNOWN'), l.fetch('timestamp'), l.fetch('message')
+ rescue KeyError
+ next
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+module Capybara
+ class << self
+ alias old_reset_sessions! reset_sessions!
+ def reset_sessions!
+ old_reset_sessions! if HyperSpec.reset_between_examples?
+ end
+ end
+end
+
RSpec.configure do |config|
- config.include HyperSpec::ComponentTestHelpers
+ config.add_setting :reset_between_examples, default: true
+ config.before(:all, no_reset: true) do
+ HyperSpec.reset_between_examples << RSpec.configuration.reset_between_examples
+ RSpec.configuration.reset_between_examples = false
+ end
+ config.before(:all, no_reset: false) do
+ HyperSpec.reset_between_examples << RSpec.configuration.reset_between_examples
+ RSpec.configuration.reset_between_examples = true
+ end
+ config.after(:all) do
+ HyperSpec.reset_sessions! unless HyperSpec.reset_between_examples?
+ # If rspecs step is used first in a file, it will NOT call config.before(:all) causing the
+ # reset_between_examples stack to be mismatched, so we check, if its already empty we
+ # just leave.
+ next if HyperSpec.reset_between_examples.empty?
+
+ RSpec.configuration.reset_between_examples = HyperSpec.reset_between_examples.pop
+ end
+ config.before(:each) do |example|
+ insure_page_loaded(true) if example.metadata[:js] && !HyperSpec.reset_between_examples?
+ end
+end
+
+RSpec.configure do |config|
+ config.include HyperSpec::Helpers
config.include HyperSpec::WaitForAjax
config.include Capybara::DSL
config.mock_with :rspec
config.add_setting :debugger_width, default: nil
config.before(:each) do
- Hyperstack.class_eval do
- def self.on_server?
- true
+ if defined?(Hyperstack)
+ Hyperstack.class_eval do
+ def self.on_server?
+ true
+ end
end
- end if defined?(Hyperstack)
+ end
# for compatibility with HyperMesh
- HyperMesh.class_eval do
- def self.on_server?
- true
+ if defined?(HyperMesh)
+ HyperMesh.class_eval do
+ def self.on_server?
+ true
+ end
end
- end if defined?(HyperMesh)
+ end
end
config.before(:each, js: true) do
size_window
end
@@ -41,54 +167,63 @@
config.after(:each) do |example|
unless example.exception
PusherFake::Channel.reset if defined? PusherFake
end
end
-
end
# Capybara config
-RSpec.configure do |_config|
+RSpec.configure do |config|
+ config.before(:each) do |example|
+ HyperSpec::Internal::Controller.current_example = example
+ HyperSpec::Internal::Controller.description_displayed = false
+ end
+
+ config.add_setting :wait_for_initialization_time
+ config.wait_for_initialization_time = 3
+
Capybara.default_max_wait_time = 10
Capybara.register_driver :chrome do |app|
options = {}
options.merge!(
- args: %w[auto-open-devtools-for-tabs],
- prefs: { 'devtools.open_docked' => false, "devtools.currentDockState" => "undocked", devtools: {currentDockState: :undocked} }
- ) unless ENV['NO_DEBUGGER']
- # this does not seem to work properly. Don't document this feature yet.
+ w3c: false,
+ args: %w[auto-open-devtools-for-tabs]
+ )
options['mobileEmulation'] = { 'deviceName' => ENV['DEVICE'].tr('-', ' ') } if ENV['DEVICE']
- capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(chromeOptions: options)
+ capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
+ chromeOptions: options, 'goog:loggingPrefs' => { browser: 'ALL' }
+ )
Capybara::Selenium::Driver.new(app, browser: :chrome, desired_capabilities: capabilities)
end
+ Capybara.register_driver :firefox do |app|
+ Capybara::Selenium::Driver.new(app, browser: :firefox)
+ end
+
Capybara.register_driver :chrome_headless_docker_travis do |app|
options = ::Selenium::WebDriver::Chrome::Options.new
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
- Capybara::Selenium::Driver.new(app, browser: :chrome, :driver_path => "/usr/lib/chromium-browser/chromedriver", options: options)
+ Selenium::WebDriver::Chrome::Service.driver_path = '/usr/lib/chromium-browser/chromedriver'
+ Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end
- Capybara.register_driver :firefox do |app|
- Capybara::Selenium::Driver.new(app, browser: :firefox)
- end
-
Capybara.register_driver :firefox_headless do |app|
options = Selenium::WebDriver::Firefox::Options.new
options.headless!
Capybara::Selenium::Driver.new(app, browser: :firefox, options: options)
- end
+ end if defined?(Selenium::WebDriver::Firefox)
Capybara.register_driver :selenium_with_firebug do |app|
profile = Selenium::WebDriver::Firefox::Profile.new
ENV['FRAME_POSITION'] && profile.frame_position = ENV['FRAME_POSITION']
profile.enable_firebug
options = Selenium::WebDriver::Firefox::Options.new(profile: profile)
Capybara::Selenium::Driver.new(app, browser: :firefox, options: options)
- end
+ end if defined?(Selenium::WebDriver::Firefox)
Capybara.register_driver :safari do |app|
Capybara::Selenium::Driver.new(app, browser: :safari)
end
@@ -101,7 +236,6 @@
when 'headless' then :selenium_chrome_headless
when 'safari' then :safari
when 'travis' then :chrome_headless_docker_travis
else :selenium_chrome_headless
end
-
end