فهرست منبع

Setup system tests with various driver options

Andrew Swistak 6 سال پیش
والد
کامیت
048086da85
3فایلهای تغییر یافته به همراه100 افزوده شده و 0 حذف شده
  1. 52 0
      spec/capybara_helper.rb
  2. 21 0
      spec/rails_helper.rb
  3. 27 0
      spec/systems/pokemon_spec.rb

+ 52 - 0
spec/capybara_helper.rb

@@ -0,0 +1,52 @@
+require 'capybara/rspec'
+require 'selenium/webdriver'
+
+Capybara.default_max_wait_time = 10
+Capybara.server = :puma, {Silent: true}
+
+# Headless firefox and chrome configuration. Useful for CI matrices.
+# See https://gist.github.com/bbonamin/4b01be9ed5dd1bdaf909462ff4fdca95
+
+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.headless! # added on https://github.com/SeleniumHQ/selenium/pull/4762
+
+  Capybara::Selenium::Driver.new(app, browser: :firefox, options: options)
+end
+
+options = Selenium::WebDriver::Chrome::Options.new
+options.add_preference(:download, prompt_for_download: false,
+                                  default_directory: '/tmp/downloads')
+options.add_preference(:browser, set_download_behavior: { behavior: 'allow' })
+
+Capybara.register_driver :chrome do |app|
+  Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
+end
+
+Capybara.register_driver :headless_chrome do |app|
+  options.add_argument('--headless')
+  options.add_argument('--disable-gpu')
+  options.add_argument('--window-size=1280,800')
+
+  driver = Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
+
+  ### Allow file downloads in Google Chrome when headless!!!
+  ### https://bugs.chromium.org/p/chromium/issues/detail?id=696481#c89
+  bridge = driver.browser.send(:bridge)
+
+  path = '/session/:session_id/chromium/send_command'
+  path[':session_id'] = bridge.session_id
+
+  bridge.http.call(:post, path, cmd: 'Page.setDownloadBehavior',
+                                params: {
+                                  behavior: 'allow',
+                                  downloadPath: '/tmp/downloads'
+                                })
+  ###
+
+  driver
+end

+ 21 - 0
spec/rails_helper.rb

@@ -6,6 +6,8 @@ require File.expand_path('../../config/environment', __FILE__)
 abort("The Rails environment is running in production mode!") if Rails.env.production?
 require 'rspec/rails'
 # Add additional requires below this line. Rails is not loaded until this point!
+require 'spec_helper'
+require 'capybara_helper'
 
 # Requires supporting ruby files with custom matchers and macros, etc, in
 # spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are
@@ -59,4 +61,23 @@ RSpec.configure do |config|
   config.filter_rails_from_backtrace!
   # arbitrary gems may also be filtered via:
   # config.filter_gems_from_backtrace("gem name")
+
+  config.include FactoryBot::Syntax::Methods
+
+  # Condtionally swap driver setup, defaults to `:headless_firefox`
+  driver = []
+  driver.push("headless") unless ENV["CAPYBARA_GUI_DRIVER"] == 'true'
+
+  if ENV["CAPYBARA_JS_DRIVER"] == "chrome"
+    driver.push("chrome")
+  elsif ENV["CAPYBARA_JS_DRIVER"] == "firefox"
+    driver.push("firefox")
+  else
+    driver.push("firefox")
+  end
+  driver = driver.join("_").to_sym
+
+  config.before(:each, type: :system) do
+    driven_by driver
+  end
 end

+ 27 - 0
spec/systems/pokemon_spec.rb

@@ -0,0 +1,27 @@
+require 'rails_helper'
+
+RSpec.describe 'Pokemon', type: :system do
+  let!(:pokemon) { create_list(:pokemon, 10) }
+
+  context 'viewing' do
+    context 'on the index page' do
+      before { visit('/pokemon') }
+
+      it 'shows me pokemon' do
+        pokemon.each do |pkmn|
+          expect(page).to have_text pkmn.nickname
+        end
+      end
+    end
+
+    context 'individual pokemon' do
+      let!(:random_pokemon) { pokemon.sample }
+      before { visit("/pokemon/#{random_pokemon.id}") }
+
+      it 'shows me the pokemon' do
+        expect(page).to have_text random_pokemon.id
+        expect(page).to have_text random_pokemon.nickname
+      end
+    end
+  end
+end