X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/5923d0fa912c73e3725e52c869d72793304ae44a..35ba053c83b7ad18e1a336d50d3a8d5a53adce9f:/apps/workbench/test/integration_helper.rb diff --git a/apps/workbench/test/integration_helper.rb b/apps/workbench/test/integration_helper.rb index 39fdf4b260..0c66e59c8c 100644 --- a/apps/workbench/test/integration_helper.rb +++ b/apps/workbench/test/integration_helper.rb @@ -1,35 +1,101 @@ +# Copyright (C) The Arvados Authors. All rights reserved. +# +# SPDX-License-Identifier: AGPL-3.0 + require 'test_helper' require 'capybara/rails' require 'capybara/poltergeist' require 'uri' require 'yaml' -POLTERGEIST_OPTS = { - window_size: [1200, 800], - phantomjs_options: ['--ignore-ssl-errors=true'], - inspector: true, -} +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'), + desired_capabilities: Selenium::WebDriver::Remote::Capabilities.firefox( + acceptInsecureCerts: true, + ), + } +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 + 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]) + 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_wait_time = 5 + # FIXME: Huge side effect here + # The following line changes the global default Capybara wait time, affecting + # every test which follows this one. This should be removed and the failing tests + # should have their individual wait times increased, if appropriate, using + # the using_wait_time(N) construct to temporarily change the wait time. + # Note: the below is especially bad because there are places that increase wait + # times using a multiplier e.g. using_wait_time(3 * Capybara.default_max_wait_time) + Capybara.default_max_wait_time = 10 def wait_for_ajax - Timeout.timeout(Capybara.default_wait_time) do - loop until finished_all_ajax_requests? + timeout = 10 + count = 0 + while page.evaluate_script("jQuery.active").to_i > 0 + count += 1 + raise "AJAX request took more than #{timeout} seconds" if count > timeout * 10 + sleep(0.1) end end - def finished_all_ajax_requests? - page.evaluate_script('jQuery.active').zero? - end end module AssertDomEvent @@ -37,21 +103,23 @@ module AssertDomEvent # DOM element. def assert_triggers_dom_event events, target='body' magic = 'received-dom-event-' + rand(2**30).to_s(36) - page.evaluate_script <