Search code examples
ruby-on-railsseleniumcapybaraminitestapartment-gem

How to test Apartment, Minitest, Capybara & Selenium


I'm new with Minitest and Apartment and have difficulties to configure the environment correctly to run the test cases. I want to make acceptance testing using Capybara & Selenium. When I run my tests I get following error message:

Apartment::TenantNotFound:         Apartment::TenantNotFound: One of the following schema(s) is invalid: "test-tenant" "public"

So it seems tenant is not created correctly. Apartment gem has instructions of how to use it with Rspec but I don't know how to make similar setup in Minitest. How should tenants be defined so Minitest can see them?

My test_helpers.rb:

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require "minitest/reporters"
require "minitest/rails/capybara"
Minitest::Reporters.use!

class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all
end

class ActionController::TestCase
  include Devise::TestHelpers
end

class ActionDispatch::IntegrationTest
end

And the test case:

require "test_helper"

class LoginTest < Capybara::Rails::TestCase
  def setup
    Apartment::Tenant.drop( "test-tenant" ) rescue nil
    Apartment::Tenant.create( "test-tenant" ) rescue nil
    Apartment::Tenant.switch!( "test-tenant" )

    # Since we are using Apartment gem, we need to tell Capybara to connect our testing tenant URL + port number
    Capybara.server_port = 5000
    Capybara.always_include_port = true
    Capybara.app_host = "http://test-tenant.lvh.me"
  end

  feature "Login" do
    scenario "with correct credentials", js: true do
      visit '/accounts/sign_in'
      fill_in("account[email]", with: "#{accounts(:tenant_user).email}")
      fill_in("account[password]", with: "password")
      click_button("Sign in")
      page.must_have_content("Signed in successfully.")

      visit '/'
      page.must_have_content("Welcome")
    end
  end

end

Solution

  • I figured the answer out myself after testing some different combinations. The solution is actually quite simple. All Apartment & Capybara related configs should be defined in test_helpers.rb file.

    test_helpers.rb:

    ENV['RAILS_ENV'] ||= 'test'
    require File.expand_path('../../config/environment', __FILE__)
    require 'rails/test_help'
    require "minitest/reporters"
    require "minitest/rails/capybara"
    Minitest::Reporters.use!
    
    
    Apartment::Tenant.drop( "test-tenant" ) rescue nil
    Apartment::Tenant.create( "test-tenant" ) rescue nil
    Apartment::Tenant.switch!( "test-tenant" )
    
    
    class ActiveSupport::TestCase
      # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
      fixtures :all
    end
    
    class ActionController::TestCase
      include Devise::TestHelpers
    end
    
    class ActionDispatch::IntegrationTest
    end
    
    # Since we are using Apartment gem, we need to tell Capybara to connect our testing tenant URL + port number
    Capybara.server_port = 5000
    Capybara.always_include_port = true
    Capybara.app_host = "http://test-tenant.lvh.me"
    

    test case is simply:

    require "test_helper"
    
    
    class LoginTest < Capybara::Rails::TestCase
    
      def setup
      end
    
    
      feature "Login" do
        scenario "with correct credentials", js: true do
          visit '/accounts/sign_in'
          fill_in("account[email]", with: "#{accounts(:tenant_user).email}")
          fill_in("account[password]", with: "password")
          click_button("Sign in")
          page.must_have_content("Signed in successfully.")
    
          visit '/'
          page.must_have_content("Welcome")
        end
      end
    
    end