-
-
Save kinopyo/1338738 to your computer and use it in GitHub Desktop.
# in spec/support/omniauth_macros.rb | |
module OmniauthMacros | |
def mock_auth_hash | |
# The mock_auth configuration allows you to set per-provider (or default) | |
# authentication hashes to return during integration testing. | |
OmniAuth.config.mock_auth[:twitter] = { | |
'provider' => 'twitter', | |
'uid' => '123545', | |
'user_info' => { | |
'name' => 'mockuser', | |
'image' => 'mock_user_thumbnail_url' | |
}, | |
'credentials' => { | |
'token' => 'mock_token', | |
'secret' => 'mock_secret' | |
} | |
} | |
end | |
end |
# in spec/requests/spec_helper.rb | |
RSpec.configure do |config| | |
# ... | |
# include our macro | |
config.include(OmniauthMacros) | |
end | |
OmniAuth.config.test_mode = true |
# in spec/requests/top_spec.rb | |
describe "access top page" do | |
it "can sign in user with Twitter account" do | |
visit '/' | |
page.should have_content("Sign in with Twitter") | |
mock_auth_hash | |
click_link "Sign in" | |
page.should have_content("mockuser") # user name | |
page.should have_css('img', :src => 'mock_user_thumbnail_url') # user image | |
page.should have_content("Sign out") | |
end | |
it "can handle authentication error" do | |
OmniAuth.config.mock_auth[:twitter] = :invalid_credentials | |
visit '/' | |
page.should have_content("Sign in with Twitter") | |
click_link "Sign in" | |
page.should have_content('Authentication failed.') | |
end | |
end |
Thank you for the code! :)
There should be OmniAuth::AuthHash.new
in omniauth_macros.rb
which will contain that hash. This way behavior would be simulated in full. Having raw hash structure there makes it impossible to use things like auth_hash.info.email
(pseudo-objects) which can be used throughout application.
# in spec/support/omniauth_macros.rb
module OmniauthMacros
def mock_auth_hash
# The mock_auth configuration allows you to set per-provider (or default)
# authentication hashes to return during integration testing.
OmniAuth.config.mock_auth[:twitter] = OmniAuth::AuthHash.new({
'provider' => 'twitter',
'uid' => '123545',
'user_info' => {
'name' => 'mockuser',
'image' => 'mock_user_thumbnail_url'
},
'credentials' => {
'token' => 'mock_token',
'secret' => 'mock_secret'
}
})
end
end
@abitdodgy, try this:
before do
login_with_omniauth # maps to visit("auth/#{provider}")
user = User.find_by_uid_and_provider('123545', '#{provider}')
user.admin = true
user.save!
end
Worked for me. Let me know if you have issues.
Is spec/requests still the best place to put spec_helper.rb? It doesn't seem to get picked up.
mock_auth_hash
is undefined.
@indiesquidge awesome! thank you.
thanks for share :)
For google_oauth2
you need to use a info
key instead of user_info
. Here's the gems I'm using:
omniauth (1.3.1)
omniauth-google-oauth2 (0.3.1)
@dyatlov @kinopyo After deeper investigation I figured out that this code should actualy go to config/environments/test.rb
#in config/environments/test.rb
Rails.application.configure do
...
OmniAuth.config.test_mode = true
OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new({
'provider' => 'github',
'uid' => '123545',
'info' => {
'name' => 'mockuser',
'image' => 'mockuser_avatar_url'
}
})
...
end
I am trying with google and invalid credentials doesnt work. It successfully authenticates from google account. It works on facebook but not google. For google should i do something different? I appreciate any help! Thanks!
it "can handle authentication error" do
OmniAuth.config.mock_auth[:google] = :invalid_credentials
visit '/'
page.should have_content("Sign in with Twitter")
click_link "Sign in"
page.should have_content('Authentication failed.') #this fails
end
Is there anyway to make it so that the user can be made an admin conditionally? I try this, but it does not work for me:
But in some instances I need the user to be an admin, and I'm not sure how to mock an
admin
user.