Skip to content

Instantly share code, notes, and snippets.

@kinopyo
Created November 4, 2011 05:44
Show Gist options
  • Save kinopyo/1338738 to your computer and use it in GitHub Desktop.
Save kinopyo/1338738 to your computer and use it in GitHub Desktop.
Integration test with Omniauth. This example is using twitter, and assume you've installed rspec and capybara. Official document is here: https://github.com/intridea/omniauth/wiki/Integration-Testing
# 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
@adamjgrant
Copy link

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.

@biglovisa
Copy link

@indiesquidge awesome! thank you.

@vinhnglx
Copy link

vinhnglx commented Oct 2, 2015

thanks for share :)

@iloveitaly
Copy link

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)

@jedrekdomanski
Copy link

jedrekdomanski commented Nov 12, 2017

@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

@sanjaygir
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment