Damian Cardozo Damian Cardozo - 7 months ago 27
Ruby Question

Browser gem testing with capybara

I am using the gem Browser
to detect mobile devices and redirect them to a different landing on a rails app. The code I'm using is this one :

Rails.configuration.middleware.use Browser::Middleware do
redirect_to mobile_landing_path if browser.device.mobile? || browser.device.ipad? || browser.device.tablet?
end


Now I need to do a feature test using Rspec and capybara, and I'm a little lost here. Really appreciate the help .

Tests I have right now is using capybara user agent and looks like this: but it seems it stills gets the base landing and not the mobile one

feature 'Visiting the site from an' do
context 'Android device' do
background do
set_user_agent(:android)
end

scenario 'I should be redirected to mobile landing' do
visit root_path
expect(page).to have_current_path(mobile_landing_path)
end
end
end

Answer

The browser gem middleware will only be run when the HTTP_ACCEPT header is set and matches %r[(text/html|/)] . By default the rack-test driver doesn't set any headers. You can either overwrite the provided driver registration like

Capybara.register_driver :rack_test do |app|
  Capybara::RackTest::Driver.new(app, :headers => { 'HTTP_ACCEPT' => 'text/html' })
end

or you can create a new driver registration

Capybara.register_driver :rack_test_with_html_accept do |app|
  Capybara::RackTest::Driver.new(app, :headers => { 'HTTP_ACCEPT' => 'text/html' })
end

and then add driver: :rack_test_with_html_accept metadata to your tests that need that header to be set

feature 'Visiting the site from an', driver: :rack_test_with_html_accept do
  ...
end