Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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
like image 897
talakoski Avatar asked Oct 19 '22 17:10

talakoski


1 Answers

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
like image 111
talakoski Avatar answered Nov 01 '22 14:11

talakoski