From c3e02c20b953c4a07ffa9d45a9539596f28d70fc Mon Sep 17 00:00:00 2001 From: Andrew Kvalheim Date: Sun, 5 Apr 2020 12:51:30 -0700 Subject: [PATCH] Use Rails transactional tests As of Rails 5.1: - Rails has built-in support for running tests within database transactions, so Database Cleaner is no longer needed for this. - Rails automatically shares the database connection across threads, so transactional_capybara is no longer needed. Changes: - Enable `use_transactional_tests`. - Remove transactional_capybara. - Remove the Database Cleaner test wrapper. This resolves: - transactional_capybara mismanages the shared database connection, causing the connection to falsely report as idle after the first test. At 6 minutes (idle_timeout + reaping_frequency) into testing, the connection is closed, causing e.g. `PG::ConnectionBad` errors. --- Gemfile | 1 - Gemfile.lock | 3 --- spec/features/commercials_spec.rb | 2 -- spec/features/proposals_spec.rb | 1 - spec/features/versions_spec.rb | 2 +- spec/spec_helper.rb | 9 ++------- spec/support/database_cleaner.rb | 9 --------- 7 files changed, 3 insertions(+), 24 deletions(-) diff --git a/Gemfile b/Gemfile index b4f036c7..c7867eb2 100644 --- a/Gemfile +++ b/Gemfile @@ -242,7 +242,6 @@ group :test do gem 'database_cleaner' gem 'geckodriver-helper' gem 'rspec-rails' - gem 'transactional_capybara' gem 'webdrivers' # for measuring test coverage gem 'simplecov-cobertura' diff --git a/Gemfile.lock b/Gemfile.lock index 2a8f64c5..ea8191f6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -568,8 +568,6 @@ GEM thread_safe (0.3.6) tilt (2.0.9) timecop (0.9.1) - transactional_capybara (0.2.0) - capybara transitions (1.2.1) ttfunk (1.7.0) turbolinks (5.2.1) @@ -714,7 +712,6 @@ DEPENDENCIES stripe stripe-ruby-mock timecop - transactional_capybara transitions turbolinks uglifier (>= 1.3.0) diff --git a/spec/features/commercials_spec.rb b/spec/features/commercials_spec.rb index a0710f86..eaf0db72 100644 --- a/spec/features/commercials_spec.rb +++ b/spec/features/commercials_spec.rb @@ -85,7 +85,6 @@ feature Commercial do click_button 'Update' page.find('#flash') expect(flash).to eq('Commercial was successfully updated.') - TransactionalCapybara::AjaxHelpers.wait_for_ajax(page) expect(event.commercials.count).to eq(1) commercial.reload expect(commercial.url).to eq('https://www.youtube.com/watch?v=M9bq_alk-sw') @@ -118,7 +117,6 @@ feature Commercial do end page.find('#flash') expect(flash).to eq('Commercial was successfully destroyed.') - TransactionalCapybara::AjaxHelpers.wait_for_ajax(page) expect(event.commercials.count).to eq(0) end end diff --git a/spec/features/proposals_spec.rb b/spec/features/proposals_spec.rb index 665b20e4..2f44e579 100644 --- a/spec/features/proposals_spec.rb +++ b/spec/features/proposals_spec.rb @@ -138,7 +138,6 @@ feature Event do page.find('#flash') expect(page).to have_content 'Proposal was successfully submitted.' - TransactionalCapybara::AjaxHelpers.wait_for_ajax(page) expect(current_path).to eq(conference_program_proposals_path(conference.short_title)) expect(Event.count).to eq(expected_count) end diff --git a/spec/features/versions_spec.rb b/spec/features/versions_spec.rb index a7793e2e..4c02cee7 100644 --- a/spec/features/versions_spec.rb +++ b/spec/features/versions_spec.rb @@ -392,7 +392,7 @@ feature 'Version' do click_link 'Comments (0)' fill_in 'comment_body', with: 'Sample comment' click_button 'Add Comment' - TransactionalCapybara::AjaxHelpers.wait_for_ajax(page) + expect(page).to have_text('Comments (1)') Comment.last.destroy PaperTrail::Version.last.reify.save diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 4e43fb06..a8f8b405 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -20,9 +20,6 @@ require 'webdrivers' # all migrations applied ActiveRecord::Migration.maintain_test_schema! -# Keep capybara and the database on the same page -require 'transactional_capybara/rspec' - # Adds rspec helper provided by paper_trail # makes it easier to control when PaperTrail is enabled during testing. require 'paper_trail/frameworks/rspec' @@ -49,10 +46,8 @@ RSpec.configure do |config| # config.mock_with :flexmock # config.mock_with :rr - # If you're not using ActiveRecord, or you'd prefer not to run each of your - # examples within a transaction, remove the following line or assign false - # instead of true. - config.use_transactional_fixtures = false + # Test within database transactions + config.use_transactional_examples = true # Run specs in random order to surface order dependencies. If you find an # order dependency and want to debug it, you can fix the order by providing diff --git a/spec/support/database_cleaner.rb b/spec/support/database_cleaner.rb index 651e1474..722e270d 100644 --- a/spec/support/database_cleaner.rb +++ b/spec/support/database_cleaner.rb @@ -5,13 +5,4 @@ RSpec.configure do |config| DatabaseCleaner.clean_with(:truncation) Rails.application.load_seed end - - config.before(:each) do - DatabaseCleaner.start - end - - config.after(:each) do |example| - TransactionalCapybara::AjaxHelpers.wait_for_ajax(page) if example.metadata[:js] - DatabaseCleaner.clean - end end