From 771afe9cdf27fd8203627430fa0c88672ebd8c65 Mon Sep 17 00:00:00 2001 From: Will Read Date: Sun, 17 Apr 2016 15:55:21 -0700 Subject: [PATCH 1/3] Improves wait time when writing test you expect to fail - reduces default wait time from 60 seconds to 2 seconds - makes use of Capybara's built in polling negative matchers to increase test stability - adds a helper method to take a screenshot and open it to help understand what's happening in a test --- Gemfile | 5 +++-- Gemfile.lock | 1 + spec/capybara_helper.rb | 6 ++++-- spec/features/admin_users_spec.rb | 8 ++++---- spec/features/create_an_agent_spec.rb | 2 +- spec/helpers/capybara_poltergeist_screenshot.rb | 12 ++++++++++++ 6 files changed, 25 insertions(+), 9 deletions(-) create mode 100644 spec/helpers/capybara_poltergeist_screenshot.rb diff --git a/Gemfile b/Gemfile index edc382d4..848fc2fd 100644 --- a/Gemfile +++ b/Gemfile @@ -142,9 +142,10 @@ group :development do group :test do gem 'coveralls', require: false - gem 'delorean' - gem 'poltergeist' gem 'capybara-select2', require: false + gem 'delorean' + gem 'launchy', require: false + gem 'poltergeist' gem 'pry-rails' gem 'rr' gem 'rspec', '~> 3.2' diff --git a/Gemfile.lock b/Gemfile.lock index 73de03d6..12550326 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -627,6 +627,7 @@ DEPENDENCIES jsonpath (~> 0.5.6) kaminari (~> 0.16.1) kramdown (~> 1.3.3) + launchy letter_opener_web liquid (~> 3.0.3) listen (~> 3.0.5) diff --git a/spec/capybara_helper.rb b/spec/capybara_helper.rb index 5cf9024f..1de227fe 100644 --- a/spec/capybara_helper.rb +++ b/spec/capybara_helper.rb @@ -2,16 +2,18 @@ require 'rails_helper' require 'capybara/rails' require 'capybara/poltergeist' require 'capybara-select2' +require 'helpers/capybara_poltergeist_screenshot' Capybara.register_driver :poltergeist do |app| - Capybara::Poltergeist::Driver.new(app, timeout: 60) + Capybara::Poltergeist::Driver.new(app, timeout: 2) end Capybara.javascript_driver = :poltergeist -Capybara.default_max_wait_time = 60 +Capybara.default_max_wait_time = 2 RSpec.configure do |config| config.include Warden::Test::Helpers + config.include Capybara::PoltergeistScreenshot config.before :suite do Warden.test_mode! end diff --git a/spec/features/admin_users_spec.rb b/spec/features/admin_users_spec.rb index ac19b279..40b50038 100644 --- a/spec/features/admin_users_spec.rb +++ b/spec/features/admin_users_spec.rb @@ -22,7 +22,7 @@ describe Admin::UsersController do visit admin_users_path find(:css, "a[href='/admin/users/#{users(:bob).id}']").click expect(page).to have_text("User 'bob' was deleted.") - expect(page).not_to have_text('bob@example.com') + expect(page).to have_no_text('bob@example.com') end context "creating new users" do @@ -82,12 +82,12 @@ describe Admin::UsersController do context "(de)activating users" do it "does not show deactivation buttons for the current user" do visit admin_users_path - expect(page).not_to have_css("a[href='/admin/users/#{users(:jane).id}/deactivate']") + expect(page).to have_no_css("a[href='/admin/users/#{users(:jane).id}/deactivate']") end it "deactivates an existing user" do visit admin_users_path - expect(page).not_to have_text('inactive') + expect(page).to have_no_text('inactive') find(:css, "a[href='/admin/users/#{users(:bob).id}/deactivate']").click expect(page).to have_text('inactive') users(:bob).reload @@ -98,7 +98,7 @@ describe Admin::UsersController do users(:bob).deactivate! visit admin_users_path find(:css, "a[href='/admin/users/#{users(:bob).id}/activate']").click - expect(page).not_to have_text('inactive') + expect(page).to have_no_text('inactive') users(:bob).reload expect(users(:bob)).to be_active end diff --git a/spec/features/create_an_agent_spec.rb b/spec/features/create_an_agent_spec.rb index 8fc055be..cd2f87ff 100644 --- a/spec/features/create_an_agent_spec.rb +++ b/spec/features/create_an_agent_spec.rb @@ -13,4 +13,4 @@ describe "Creating a new agent", js: true do expect(page).to have_text("Test Trigger Agent") end -end \ No newline at end of file +end diff --git a/spec/helpers/capybara_poltergeist_screenshot.rb b/spec/helpers/capybara_poltergeist_screenshot.rb new file mode 100644 index 00000000..164f0e81 --- /dev/null +++ b/spec/helpers/capybara_poltergeist_screenshot.rb @@ -0,0 +1,12 @@ +require 'launchy' + +module Capybara + module PoltergeistScreenshot + def screenshot_and_open_image(full: false) + timestamp = Time.now.strftime('%Y-%m-%d-%H-%M-%S') + screenshot_path = "tmp/capybara/screenshot_#{timestamp}_#{SecureRandom.hex}.png" + page.save_screenshot(screenshot_path, full: full) + Launchy.open screenshot_path + end + end +end From 7c9fe1749355b6b808c2d342fc08c42658ddd582 Mon Sep 17 00:00:00 2001 From: Will Read Date: Sun, 17 Apr 2016 16:45:49 -0700 Subject: [PATCH 2/3] 2 seconds may have been a bit tight, increasing to 5 --- spec/capybara_helper.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/capybara_helper.rb b/spec/capybara_helper.rb index 1de227fe..a8f0541d 100644 --- a/spec/capybara_helper.rb +++ b/spec/capybara_helper.rb @@ -5,11 +5,11 @@ require 'capybara-select2' require 'helpers/capybara_poltergeist_screenshot' Capybara.register_driver :poltergeist do |app| - Capybara::Poltergeist::Driver.new(app, timeout: 2) + Capybara::Poltergeist::Driver.new(app, timeout: 5) end Capybara.javascript_driver = :poltergeist -Capybara.default_max_wait_time = 2 +Capybara.default_max_wait_time = 5 RSpec.configure do |config| config.include Warden::Test::Helpers From 8a7f3fe4f1d2d0fa1b5a7f718778453635c7cb16 Mon Sep 17 00:00:00 2001 From: Will Read Date: Mon, 18 Apr 2016 21:00:46 -0700 Subject: [PATCH 3/3] Removes unnecessary screenshot helper Switches timeout based on being on slow CI, or fast dev boxes - can use Capybara's built in `save_and_open_screenshot` --- Gemfile | 1 - Gemfile.lock | 1 - spec/capybara_helper.rb | 8 ++++---- spec/helpers/capybara_poltergeist_screenshot.rb | 12 ------------ 4 files changed, 4 insertions(+), 18 deletions(-) delete mode 100644 spec/helpers/capybara_poltergeist_screenshot.rb diff --git a/Gemfile b/Gemfile index 848fc2fd..84b3de39 100644 --- a/Gemfile +++ b/Gemfile @@ -144,7 +144,6 @@ group :development do gem 'coveralls', require: false gem 'capybara-select2', require: false gem 'delorean' - gem 'launchy', require: false gem 'poltergeist' gem 'pry-rails' gem 'rr' diff --git a/Gemfile.lock b/Gemfile.lock index 12550326..73de03d6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -627,7 +627,6 @@ DEPENDENCIES jsonpath (~> 0.5.6) kaminari (~> 0.16.1) kramdown (~> 1.3.3) - launchy letter_opener_web liquid (~> 3.0.3) listen (~> 3.0.5) diff --git a/spec/capybara_helper.rb b/spec/capybara_helper.rb index a8f0541d..d0c8104e 100644 --- a/spec/capybara_helper.rb +++ b/spec/capybara_helper.rb @@ -2,18 +2,18 @@ require 'rails_helper' require 'capybara/rails' require 'capybara/poltergeist' require 'capybara-select2' -require 'helpers/capybara_poltergeist_screenshot' + +CAPYBARA_TIMEOUT = ENV['CI'] == 'true' ? 60 : 5 Capybara.register_driver :poltergeist do |app| - Capybara::Poltergeist::Driver.new(app, timeout: 5) + Capybara::Poltergeist::Driver.new(app, timeout: CAPYBARA_TIMEOUT) end Capybara.javascript_driver = :poltergeist -Capybara.default_max_wait_time = 5 +Capybara.default_max_wait_time = CAPYBARA_TIMEOUT RSpec.configure do |config| config.include Warden::Test::Helpers - config.include Capybara::PoltergeistScreenshot config.before :suite do Warden.test_mode! end diff --git a/spec/helpers/capybara_poltergeist_screenshot.rb b/spec/helpers/capybara_poltergeist_screenshot.rb deleted file mode 100644 index 164f0e81..00000000 --- a/spec/helpers/capybara_poltergeist_screenshot.rb +++ /dev/null @@ -1,12 +0,0 @@ -require 'launchy' - -module Capybara - module PoltergeistScreenshot - def screenshot_and_open_image(full: false) - timestamp = Time.now.strftime('%Y-%m-%d-%H-%M-%S') - screenshot_path = "tmp/capybara/screenshot_#{timestamp}_#{SecureRandom.hex}.png" - page.save_screenshot(screenshot_path, full: full) - Launchy.open screenshot_path - end - end -end