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