X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/7ca1198b2e64cdd823f424c1bd009f364abfe2d0..b91db14a4dced9d6ea124e86be3c796e6f2c8e8c:/apps/workbench/test/integration_helper.rb diff --git a/apps/workbench/test/integration_helper.rb b/apps/workbench/test/integration_helper.rb index 30643bc722..a8788ceb53 100644 --- a/apps/workbench/test/integration_helper.rb +++ b/apps/workbench/test/integration_helper.rb @@ -4,20 +4,26 @@ require 'capybara/poltergeist' require 'uri' require 'yaml' -$ARV_API_SERVER_DIR = File.expand_path('../../../../services/api', __FILE__) -SERVER_PID_PATH = 'tmp/pids/server.pid' +module WaitForAjax + Capybara.default_wait_time = 5 + def wait_for_ajax + Timeout.timeout(Capybara.default_wait_time) do + loop until finished_all_ajax_requests? + end + end + + def finished_all_ajax_requests? + page.evaluate_script('jQuery.active').zero? + end +end class ActionDispatch::IntegrationTest # Make the Capybara DSL available in all integration tests include Capybara::DSL + include ApiFixtureLoader + include WaitForAjax - def self.api_fixture(name) - # Returns the data structure from the named API server test fixture. - path = File.join($ARV_API_SERVER_DIR, 'test', 'fixtures', "#{name}.yml") - YAML.load(IO.read(path)) - end - - @@API_AUTHS = api_fixture('api_client_authorizations') + @@API_AUTHS = self.api_fixture('api_client_authorizations') def page_with_token(token, path='/') # Generate a page path with an embedded API token. @@ -30,49 +36,16 @@ class ActionDispatch::IntegrationTest q_string = URI.encode_www_form('api_token' => api_token) "#{path}#{sep}#{q_string}" end -end - -class IntegrationTestRunner < MiniTest::Unit - # Make a hash that unsets Bundle's environment variables. - # We'll use this environment when we launch Bundle commands in the API - # server. Otherwise, those commands will try to use Workbench's gems, etc. - @@APIENV = Hash[ENV.map { |key, val| - (key =~ /^BUNDLE_/) ? [key, nil] : nil - }.compact] - def _system(*cmd) - if not system(@@APIENV, *cmd) - raise RuntimeError, "#{cmd[0]} returned exit code #{$?.exitstatus}" - end - end - - def _run(args=[]) - Capybara.javascript_driver = :poltergeist - server_pid = Dir.chdir($ARV_API_SERVER_DIR) do |apidir| - _system('bundle', 'exec', 'rake', 'db:test:load') - _system('bundle', 'exec', 'rake', 'db:fixtures:load') - _system('bundle', 'exec', 'rails', 'server', '-d') - timeout = Time.now.tv_sec + 10 - begin - sleep 0.2 - begin - server_pid = IO.read(SERVER_PID_PATH).to_i - good_pid = (server_pid > 0) and (Process.kill(0, pid) rescue false) - rescue Errno::ENOENT - good_pid = false - end - end while (not good_pid) and (Time.now.tv_sec < timeout) - if not good_pid - raise RuntimeError, "could not find API server Rails pid" - end - server_pid - 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 - super(args) - ensure - Process.kill('TERM', server_pid) + find *args + rescue Capybara::ElementNotFound + false end end end - -MiniTest::Unit.runner = IntegrationTestRunner.new