Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🚧🥒 Reduce Capybara / Cucumber config #3911

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion features/step_definitions/cms/page_template_steps.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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});")
Expand Down
2 changes: 0 additions & 2 deletions features/step_definitions/cms/sidebar_steps.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 3 additions & 1 deletion features/step_definitions/provider_steps.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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|
Expand Down Expand Up @@ -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')
Expand Down
8 changes: 2 additions & 6 deletions features/step_definitions/web_steps.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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|
Expand Down
116 changes: 24 additions & 92 deletions features/support/capybara.rb
Original file line number Diff line number Diff line change
@@ -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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I remember this @javascript tag was heavily patched by us. I had some updates to upstream capybara/cucumber but IIRC it required Ruby 3. So I can check about this now we have Ruby 3.1 merged.

Capybara.javascript_driver = :headless_chrome
Capybara.match = :prefer_exact # TODO: this is Capybara v1 default, we should use :one or :smart
jlledom marked this conversation as resolved.
Show resolved Hide resolved
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')
jlledom marked this conversation as resolved.
Show resolved Hide resolved
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
8 changes: 6 additions & 2 deletions features/support/helpers/capybara_helpers.rb
Original file line number Diff line number Diff line change
@@ -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)
Expand Down
4 changes: 0 additions & 4 deletions features/support/helpers/js_helpers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 0 additions & 4 deletions features/support/helpers/requests_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down
5 changes: 4 additions & 1 deletion features/support/hooks.rb
Original file line number Diff line number Diff line change
@@ -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)
Expand Down Expand Up @@ -28,7 +32,6 @@

Before '@javascript' do
stub_core_reset!
@javascript = true
end

AfterStep('@javascript') do
Expand Down