From 154f5c95d8571479b61b83f783ace88644342a41 Mon Sep 17 00:00:00 2001 From: josemigallas Date: Fri, 11 Oct 2024 09:52:05 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=A7=F0=9F=94=A7=F0=9F=A5=92=20reduce?= =?UTF-8?q?=20capybara=20config=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cms/page_template_steps.rb | 2 +- .../step_definitions/cms/sidebar_steps.rb | 2 - features/step_definitions/provider_steps.rb | 4 +- features/step_definitions/web_steps.rb | 8 +- features/support/capybara.rb | 116 ++++-------------- features/support/helpers/capybara_helpers.rb | 8 +- features/support/helpers/js_helpers.rb | 4 - features/support/helpers/requests_helper.rb | 4 - features/support/hooks.rb | 5 +- 9 files changed, 40 insertions(+), 113 deletions(-) diff --git a/features/step_definitions/cms/page_template_steps.rb b/features/step_definitions/cms/page_template_steps.rb index c361db56ad..a79efea268 100644 --- a/features/step_definitions/cms/page_template_steps.rb +++ b/features/step_definitions/cms/page_template_steps.rb @@ -9,7 +9,7 @@ end def fill_draft(text) - raise 'Please mark this scenario with @javascript if you want to work with codemirror.' unless @javascript + raise 'Please mark this scenario with @javascript if you want to work with codemirror.' unless javascript_test? find('#cms_template_draft', visible: :all) execute_script("$('#cms_template_draft').data('codemirror').setValue(#{text.inspect});") diff --git a/features/step_definitions/cms/sidebar_steps.rb b/features/step_definitions/cms/sidebar_steps.rb index e88743b287..61771375be 100644 --- a/features/step_definitions/cms/sidebar_steps.rb +++ b/features/step_definitions/cms/sidebar_steps.rb @@ -5,8 +5,6 @@ end When /^I switch to (builtin|3scale) content$/ do |group| - ensure_javascript - within "#cms-sidebar-filter-origin" do li = page.find("li[data-filter-origin='builtin']") li.click diff --git a/features/step_definitions/provider_steps.rb b/features/step_definitions/provider_steps.rb index 212b29fae3..907bf9ad21 100644 --- a/features/step_definitions/provider_steps.rb +++ b/features/step_definitions/provider_steps.rb @@ -3,7 +3,7 @@ def import_simple_layout(provider) simple_layout = SimpleLayout.new(provider) simple_layout.import_pages! - simple_layout.import_js_and_css! if @javascript + simple_layout.import_js_and_css! if javascript_test? end Given "a provider signed up to {plan}" do |plan| @@ -237,6 +237,8 @@ def setup_provider(login) set_current_domain(@provider.external_admin_domain) stub_integration_errors_dashboard + @provider.users.first.user_sessions.create! # Prevents welcome flash from showing up + return unless login try_provider_login('foo.3scale.localhost', 'supersecret') diff --git a/features/step_definitions/web_steps.rb b/features/step_definitions/web_steps.rb index 5aa38cc956..2f4082ca04 100644 --- a/features/step_definitions/web_steps.rb +++ b/features/step_definitions/web_steps.rb @@ -143,14 +143,10 @@ def with_scope(locator) Then /^(.+) and confirm the dialog(?: "(.*)")?$/ do |original, text| ActiveSupport::Deprecation.warn "🥒 Replace with step 'And confirm the dialog'" - if rack_test? + accept_confirm(text) do step original - else - accept_confirm(text) do - step original - end - wait_for_requests end + wait_for_requests end Then "(they )should see the following details(:)" do |table| diff --git a/features/support/capybara.rb b/features/support/capybara.rb index 69592a80a2..cbda879728 100644 --- a/features/support/capybara.rb +++ b/features/support/capybara.rb @@ -1,117 +1,49 @@ # frozen_string_literal: true require 'selenium/webdriver' -require 'capybara/minitest' -include Capybara::Minitest::Assertions -# in case firefox is needed! -#Capybara.register_driver :selenium do |app| -# Capybara::Selenium::Driver.new(app, :browser => :firefox) -#end - -DEFAULT_JS_DRIVER = :headless_chrome -# in case firefox is needed! -# DEFAULT_JS_DRIVER = :headless_firefox - -Capybara.default_driver = :rack_test -Capybara.javascript_driver = DEFAULT_JS_DRIVER -Capybara.default_selector = :css +# Capybara.default_max_wait_time = 10 Capybara.disable_animation = true - -# Capybara 3 changes the default server to Puma. It can be reverted to the previous default of WEBRick by specifying: -Capybara.server = :webrick - -# see http://www.elabs.se/blog/60-introducing-capybara-2-1 -Capybara.configure do |config| - config.default_driver = :rack_test - config.javascript_driver = DEFAULT_JS_DRIVER - config.raise_server_errors = true - config.match = :prefer_exact - config.always_include_port = true - config.default_max_wait_time = 10 -end - -# Needed because cucumber-rails requires capybara/cucumber -# https://github.com/cucumber/cucumber-rails/blob/7b47bf1dda3368247bf2d45bcb17a224e80ec6fd/lib/cucumber/rails/capybara.rb#L3 -# https://github.com/teamcapybara/capybara/blob/2.18.0/lib/capybara/cucumber.rb#L17-L19 -Before '@javascript' do - Capybara.current_driver = DEFAULT_JS_DRIVER -end +Capybara.javascript_driver = :headless_chrome +Capybara.match = :prefer_exact # TODO: this is Capybara v1 default, we should use :one or :smart +Capybara.server = :webrick # default is :puma + +BASE_DRIVER_OPTIONS = { + args: [ + # This is added in Capybara's default drivers. See https://github.com/teamcapybara/capybara/blob/0480f90168a40780d1398c75031a255c1819dce8/lib/capybara/registrations/drivers.rb#L37-L38 + # Workaround https://bugs.chromium.org/p/chromedriver/issues/detail?id=2650&q=load&sort=-id&colspec=ID%20Status%20Pri%20Owner%20Summary + '--disable-site-isolation-trials', + # When width < 1200px, vertical navigation overlaps the page's main content and that will make + # some cucumbers fail + '--window-size=1200,2048', + ] +}.freeze Before '@chrome' do Capybara.current_driver = :chrome end -Before '@firefox' do - Capybara.current_driver = :firefox -end - -Around '@security' do |scenario, block| - with_forgery_protection(&block) -end - -# monkeypatch to fix -# not opened for reading (IOError) -# /cucumber-1.3.20/lib/cucumber/formatter/interceptor.rb:33:in `each' -# /cucumber-1.3.20/lib/cucumber/formatter/interceptor.rb:33:in `collect' -# /cucumber-1.3.20/lib/cucumber/formatter/interceptor.rb:33:in `method_missing' -require 'cucumber/formatter/interceptor' -class Cucumber::Formatter::Interceptor::Pipe - def is_a?(klass) - super || klass == IO - end -end - -Capybara.register_driver :firefox do |app| - Capybara::Selenium::Driver.new(app, browser: :firefox) -end - -Capybara.register_driver :headless_firefox do |app| - options = Selenium::WebDriver::Firefox::Options.new - - options.add_argument('-headless') - options.add_argument('--window-size=1280,2048') - - driver = Capybara::Selenium::Driver.new(app, browser: :firefox, options: options) - - driver -end - -Capybara.register_driver :firefox do |app| - options = Selenium::WebDriver::Firefox::Options.new - - options.add_argument('--window-size=1280,2048') - - driver = Capybara::Selenium::Driver.new(app, browser: :firefox, options: options) - - driver -end - +# Use this driver to debug scenarios locally by adding tag @chrome on top of the scenario Capybara.register_driver :chrome do |app| - options = Selenium::WebDriver::Chrome::Options.new - options.add_argument('--window-size=1280,2048') - options.add_argument('--disable-search-engine-choice-screen') + options = Selenium::WebDriver::Options.chrome(**BASE_DRIVER_OPTIONS) + Capybara::Selenium::Driver.new(app, browser: :chrome, options: options) end Capybara.register_driver :headless_chrome do |app| - options = Selenium::WebDriver::Options.chrome( - logging_prefs: { performance: 'ALL', browser: 'ALL' }, - perf_logging_prefs: { enableNetwork: true } - ) + options = Selenium::WebDriver::Options.chrome(**BASE_DRIVER_OPTIONS) + + options.logging_prefs = { performance: 'ALL', browser: 'ALL' } + + options.add_option(:perf_logging_prefs, enableNetwork: true) options.add_argument('--headless=new') options.add_argument('--no-sandbox') options.add_argument('--disable-popup-blocking') - options.add_argument('--window-size=1280,2048') options.add_argument('--host-resolver-rules=MAP * ~NOTFOUND , EXCLUDE *localhost*') - options.add_argument('--disable-search-engine-choice-screen') options.add_argument('--disable-gpu') options.add_preference(:browser, set_download_behavior: { behavior: 'allow' }) - timeout = 120 # default 60 - client = Selenium::WebDriver::Remote::Http::Default.new(open_timeout: timeout, read_timeout: timeout) - - Capybara::Selenium::Driver.new(app, browser: :chrome, options: options, http_client: client) + Capybara::Selenium::Driver.new(app, browser: :chrome, options: options, timeout: 120) end diff --git a/features/support/helpers/capybara_helpers.rb b/features/support/helpers/capybara_helpers.rb index 97a299d543..ab82f7b7c0 100644 --- a/features/support/helpers/capybara_helpers.rb +++ b/features/support/helpers/capybara_helpers.rb @@ -1,14 +1,18 @@ # frozen_string_literal: true +require 'capybara/minitest' + module CapybaraHelpers + include Capybara::Minitest::Assertions + FLASH_SELECTOR = [ '#flash-messages', '#flashWrapper span', '#flashWrapper p' ].join(', ').freeze - def rack_test? - %I[webkit selenium webkit_debug headless_chrome chrome headless_firefox firefox].exclude? Capybara.current_driver + def javascript_test? + Capybara.current_driver == Capybara.javascript_driver end def assert_flash(message) diff --git a/features/support/helpers/js_helpers.rb b/features/support/helpers/js_helpers.rb index 9a588f8b98..8e4993432f 100644 --- a/features/support/helpers/js_helpers.rb +++ b/features/support/helpers/js_helpers.rb @@ -6,10 +6,6 @@ def bypass_confirm_dialog page.evaluate_script('window.confirm = function() { return true; }') end - def ensure_javascript - raise 'This step requires JS enabled' unless @javascript - end - def local_storage(key) Capybara.current_session.driver.browser.local_storage.[](key) end diff --git a/features/support/helpers/requests_helper.rb b/features/support/helpers/requests_helper.rb index 740bb45725..a83d03a208 100644 --- a/features/support/helpers/requests_helper.rb +++ b/features/support/helpers/requests_helper.rb @@ -103,10 +103,6 @@ def finished_all_ajax_requests? Capybara.page.evaluate_script('jQuery.active').zero? end - - def javascript_test? - Capybara.current_driver == Capybara.javascript_driver - end end diff --git a/features/support/hooks.rb b/features/support/hooks.rb index 8d499bb048..8317a8d35d 100644 --- a/features/support/hooks.rb +++ b/features/support/hooks.rb @@ -1,5 +1,9 @@ # frozen_string_literal: true +Around '@security' do |scenario, block| + with_forgery_protection(&block) +end + Before '@onpremises' do ThreeScale.config.stubs(onpremises: true) ThreeScale.config.stubs(saas?: false) @@ -28,7 +32,6 @@ Before '@javascript' do stub_core_reset! - @javascript = true end AfterStep('@javascript') do