login de usuário múltiplo omniauth

Para sites multiusuário / sociais que frequentemente precisam testar as interações do usuário (como ações de amigos), você precisa de uma maneira de testar 2 ou mais usuários interagindo ao mesmo tempo. Então, aqui está um snippet que usei:

Cenário de amostra de capivara:

scenario "User's friends recipes show up on his home page", :js => true do
user
= FactoryGirl.create(:user)
friend = add_friend_for(user)

in_browser
(:friend) do
login
(friend)
add_recipe
("Apple pie)
end


in_browser(:user) do

login(user)

click_on "
Home"
page.should have_css('.friend_recipes .recipe', :text => "
Apple pie")
end

end

E aqui está o que você precisa para fazer funcionar:

# /spec/support/omniauth.rb
OmniAuth.config.test_mode = true

def omniauth_mock(user = nil)
user
||= FactoryGirl.create(:user)

OmniAuth.config.mock_auth[:facebook] = {
:uid => user.uid,
:provider => user.provider,
:info => {:name => user.name, :nickname => 'fbuser'},
:credentials => {:token => user.email, :expires_at => 2.days.from_now},
:extra => {"user_hash" => {:id => user.id, :email => user.email}}
}
end

# /spec/factories/users.rb
FactoryGirl.define do
sequence
:email do |n|
"test#{n}@email.com"
end

factory
:user do
sequence
(:name) { |n| "John Doe#{n}" }
email
{ FactoryGirl.generate(:email) }
sequence
(:provider) { |n| "facebook#{n}" } # Hack-ish way to log in multiple users at the same time
sequence
(:uid) {|n| "uid#{n}"}
oauth_token
"1234567890"
end
end

# capybara helper (I put helpers in /spec/support/common_steps.rb)
def login(user = nil)
omniauth_mock
(user)
visit root_path

click_on
"Login"
end

def in_browser(name)
Capybara.session_name = name
yield
end