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
)