X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/bb45025e80abc00f8da524d9a78c0bab976d4f3a..6d5e04a731edc9ce8944ecea637070afbdadeb05:/apps/workbench/test/integration_helper.rb diff --git a/apps/workbench/test/integration_helper.rb b/apps/workbench/test/integration_helper.rb index 88aec2ca69..81ea67c3c5 100644 --- a/apps/workbench/test/integration_helper.rb +++ b/apps/workbench/test/integration_helper.rb @@ -4,13 +4,32 @@ require 'capybara/poltergeist' require 'uri' require 'yaml' +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 @@API_AUTHS = self.api_fixture('api_client_authorizations') + def setup + reset_session! + super + end + def page_with_token(token, path='/') # Generate a page path with an embedded API token. # Typical usage: visit page_with_token('token_name', page) @@ -22,4 +41,38 @@ class ActionDispatch::IntegrationTest q_string = URI.encode_www_form('api_token' => api_token) "#{path}#{sep}#{q_string}" 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 + end end