X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/694e7cdb8bce9e18ca63fab78c3201232b8aab77..351a497c96770f379acdfe58ebeff34262e1308b:/apps/workbench/test/integration_helper.rb diff --git a/apps/workbench/test/integration_helper.rb b/apps/workbench/test/integration_helper.rb index cd9fa5106a..cb07725350 100644 --- a/apps/workbench/test/integration_helper.rb +++ b/apps/workbench/test/integration_helper.rb @@ -4,19 +4,92 @@ require 'capybara/poltergeist' require 'uri' require 'yaml' -$ARV_API_SERVER_DIR = File.expand_path('../../../../services/api', __FILE__) +Capybara.register_driver :poltergeist do |app| + Capybara::Poltergeist::Driver.new app, { + window_size: [1200, 800], + phantomjs_options: ['--ignore-ssl-errors=true'], + inspector: true, + } +end + +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 + +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 -end -class IntegrationTestRunner < MiniTest::Unit - # Don't try to re-use the current Bundle environment when we launch the - # API server. - @@APIENV = ENV.map { |item| (item[0] =~ /^BUNDLE_/) ? [item[0], nil] : nil }. - compact.to_h + # 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 - def _system(*cmd) - if not system(@@APIENV, *cmd) - raise RuntimeError, "#{cmd[0]} returned exit code #{$?.exitstatus}" + @@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 - 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') - pid_path = 'tmp/pids/server.pid' - timeout = Time.now.tv_sec + 5 - while (not File.exists? pid_path) and (Time.now.tv_sec < timeout) - sleep 0.2 - end - IO.read(pid_path).to_i + teardown do + if not passed? + screenshot end - begin - super(args) - ensure - Process.kill('TERM', server_pid) + if Capybara.current_driver == :selenium + page.execute_script("window.localStorage.clear()") end + Capybara.reset_sessions! end end - -MiniTest::Unit.runner = IntegrationTestRunner.new