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
@abitdodgy
Copy link

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:

  before do
    login_with_omniauth # maps to visit("auth/#{provider}")
    user = User.last
    user.admin = true
    user.save!
  end

But in some instances I need the user to be an admin, and I'm not sure how to mock an admin user.

@subhashb
Copy link

Thank you for the code! :)

@dyatlov
Copy link

dyatlov commented Mar 16, 2015

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

@indiesquidge
Copy link

@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.

@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