rails developer consumerkey cucumber capybara omniauth omniauth-twitter

cucumber - developer - Callback redirect no conservando sesión



twitter developer login (1)

Tengo un escenario que funciona bien cuando uso omniauth real, pero falla cuando lo ejecuto con la autenticación simulada en cucumber / capybara.

En la devolución de llamada, cuando hago sign_in @user , se crea correctamente el usuario y se inicia sesión ... se establece current_user . Pero cuando hago redirect_to request.env[''omniauth.origin''] || ''/'' redirect_to request.env[''omniauth.origin''] || ''/'' , dentro de la acción que sigue, current_user ahora es nulo.

He confirmado mediante capturas de pantalla / pausando el navegador que no funciona con la autenticación simulada. El mismo error ocurre en los controladores de Firefox y Chrome.

¿Alguna idea de por qué esto estaría pasando?

/features/support/env.rb:

Cucumber::Rails::Database.javascript_strategy = :truncation

Guión:

@javascript Scenario: Given I am on the home page When I press "Login" And I should see "Login with Twitter" in the selector "#login-modal" Given Omniauth returns a user with provider "twitter" and uid "1" and nickname "foo" When I login with Twitter Then I should be logged in as "foo"

Definiciones de los pasos:

Given(/^Omniauth returns a user with provider "(.*?)" and uid "(.*?)" and nickname "(.*?)"$/) do |provider, uid, nickname| OmniAuth.config.test_mode = true OmniAuth.config.add_mock(provider.to_sym, { :uid => uid, :info => { :name => nickname } }) end Then(/^I should be logged in as "(.*?)"$/) do |nickname| expect(page).to have_content(nickname) end

Devolución de llamada de autenticación:

def twitter @user = User.from_omniauth(request.env["omniauth.auth"]) # this works-- I get the mock sign_in @user puts ">> in auth callback: just signed in user #{current_user.id}" redirect_to request.env[''omniauth.origin''] || ''/'' end

Controlador:

def new puts ">> in my_controller#new: current_user = #{current_user.id if current_user}" end

Salida de pepino:

Given Omniauth returns a user with provider "twitter" and uid "1" and nickname "foo" >> in auth callback: just signed in user 1 >> in my_controller#new: current_user = When I login with Twitter Then I should be logged in as "foo" expected to find text "foo" in [redacted] (RSpec::Expectations::ExpectationNotMetError)


@user el usuario y lo recopila en la nueva variable @user pero mientras llama al método sign_in nuevamente, inicializó la nueva variable con la que el usuario estaba usando (por ejemplo, @user )