X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/b346f8754f5d4840ad80aa97bd910f3a6844b413..8d61948fecccfc60db2f18ba4daf7c01ddf3d3c8:/apps/workbench/test/integration_helper.rb diff --git a/apps/workbench/test/integration_helper.rb b/apps/workbench/test/integration_helper.rb index 88aec2ca69..f0c811aac2 100644 --- a/apps/workbench/test/integration_helper.rb +++ b/apps/workbench/test/integration_helper.rb @@ -4,10 +4,164 @@ require 'capybara/poltergeist' require 'uri' require 'yaml' +def available_port for_what + begin + Addrinfo.tcp("0.0.0.0", 0).listen do |srv| + port = srv.connect_address.ip_port + # Selenium needs an additional locking port, check if it's available + # and retry if necessary. + if for_what == 'selenium' + locking_port = port - 1 + Addrinfo.tcp("0.0.0.0", locking_port).listen.close + end + STDERR.puts "Using port #{port} for #{for_what}" + return port + end + rescue Errno::EADDRINUSE, Errno::EACCES + retry + end +end + +def selenium_opts + { + port: available_port('selenium'), + } +end + +def poltergeist_opts + { + phantomjs_options: ['--ignore-ssl-errors=true'], + port: available_port('poltergeist'), + window_size: [1200, 800], + } +end + +Capybara.register_driver :poltergeist do |app| + Capybara::Poltergeist::Driver.new app, poltergeist_opts +end + +Capybara.register_driver :poltergeist_debug do |app| + Capybara::Poltergeist::Driver.new app, poltergeist_opts.merge(inspector: true) +end + +Capybara.register_driver :poltergeist_with_fake_websocket do |app| + js = File.expand_path '../support/fake_websocket.js', __FILE__ + Capybara::Poltergeist::Driver.new app, poltergeist_opts.merge(extensions: [js]) +end + +Capybara.register_driver :poltergeist_without_file_api do |app| + js = File.expand_path '../support/remove_file_api.js', __FILE__ + Capybara::Poltergeist::Driver.new app, poltergeist_opts.merge(extensions: [js]) +end + +Capybara.register_driver :selenium do |app| + Capybara::Selenium::Driver.new app, selenium_opts +end + +Capybara.register_driver :selenium_with_download do |app| + profile = Selenium::WebDriver::Firefox::Profile.new + profile['browser.download.dir'] = DownloadHelper.path.to_s + profile['browser.download.downloadDir'] = DownloadHelper.path.to_s + profile['browser.download.defaultFolder'] = DownloadHelper.path.to_s + profile['browser.download.folderList'] = 2 # "save to user-defined location" + profile['browser.download.manager.showWhenStarting'] = false + profile['browser.helperApps.alwaysAsk.force'] = false + profile['browser.helperApps.neverAsk.saveToDisk'] = 'text/plain,application/octet-stream' + Capybara::Selenium::Driver.new app, selenium_opts.merge(profile: profile) +end + +module WaitForAjax + Capybara.default_max_wait_time = 10 + def wait_for_ajax + Timeout.timeout(Capybara.default_max_wait_time) do + loop until finished_all_ajax_requests? + end + end + + def finished_all_ajax_requests? + page.evaluate_script('jQuery.active').zero? + end +end + +module AssertDomEvent + # Yield the supplied block, then wait for an event to arrive at a + # DOM element. + def assert_triggers_dom_event events, target='body' + magic = 'received-dom-event-' + rand(2**30).to_s(36) + page.evaluate_script < api_token) - "#{path}#{sep}#{q_string}" + path_parts.insert(1, "#{sep}#{q_string}") + path_parts.join("") + end + + # Find a page element, but return false instead of raising an + # exception if not found. Use this with assertions to explain that + # the error signifies a failed test rather than an unexpected error + # during a testing procedure. + def find? *args + begin + find *args + rescue Capybara::ElementNotFound + false + end + end + + @@screenshot_count = 1 + def screenshot + image_file = "./tmp/workbench-fail-#{@@screenshot_count}.png" + begin + page.save_screenshot image_file + rescue Capybara::NotSupportedByDriverError + # C'est la vie. + else + puts "Saved #{image_file}" + @@screenshot_count += 1 + end + end + + teardown do + if not passed? + screenshot + end + if Capybara.current_driver == :selenium + page.execute_script("window.localStorage.clear()") + end + Capybara.reset_sessions! end end