yerforkferchips
yerforkferchips

Reputation: 1985

Capybara authentication in integration tests by filling out a form?

My application uses Devise for authentication. I want to write integration specs for testing against proper authentication and access prevention.

Somehow, the two don't seem to work together very well. On the devise repo, the README says this on the sign_in and sign_out helpers that Devise gives you for testing:

These helpers are not going to work for integration tests driven by Capybara or Webrat. They are meant to be used with functional tests only. Instead, fill in the form or explicitly set the user in session

So what I'm trying to do to authenticate is filling out the form. I wrote this (spec/support/signin_helpers.rb):

module SignInHelpers
    def sign_in(user)
        visit users_login_path
        fill_in "Email", with: user.email
        fill_in "Passwort", with: "rickroll"
        click_button "Einloggen"
    end

    def login_admin
        before(:each) do
            sign_in FactoryGirl.create(:admin) # Using factory girl as an example
        end
    end

    def login_user
        before(:each) do
            user = FactoryGirl.create(:user)
            sign_in user
        end
    end
end

And my tests look like this:

describe "unauthorized access" do
    login_user

    describe "to Companies#new" do
        before { get new_company_path }
        specify { response.should redirect_to(root_path) }
    end
    .
    .
    .
end

Which seems to work, per se, perfectly fine. No "real" errors thrown. But somehow, somewhere, the authentication gets lost:

5) CompaniesManagement unauthorized access to Companies#index should redirect to "/"
     Failure/Error: specify { response.should redirect_to(root_path) }
         Expected response to be a redirect to <http://www.example.com/> but was a redirect to <http://www.example.com/users/login>
     # ./spec/requests/companies_management_spec.rb:60:in `block (4 levels) in <top (required)>'

What am I doing wrong?

Upvotes: 2

Views: 582

Answers (1)

Siva Gollapalli
Siva Gollapalli

Reputation: 646

You have put before(:each) in your spec file instead of in support. I mean

describe "unauthorized access" do
    before { login_user }

    describe "to Companies#new" do
       before { get new_company_path }
       specify { response.should redirect_to(root_path) }
    end
.
.
.
end

In spec/support/signin_helpers.rb you have to write

def login_user
   user = FactoryGirl.create(:user)
   sign_in user
end

Upvotes: 2

Related Questions