Sam Lim
Sam Lim

Reputation: 197

Google Omniauth2 Rails Giving me "Example User" when testing

I am attempting to stub out an omniauth authentication hash to test my integration with RSpec. For some reason my User model is being fed an "Example User," that does not have all the info a regular signed in Google user would have.

This is the param given to User that is breaking the tests: {"provider"=>"default", "uid"=>"1234", "info"=>{"name"=>"Example User"}}

This is what it should be, and if I step to the next iteration with pry, it works:

{:provider=>"google",
 :uid=>"12345678910",
 :info=>{:email=>"[email protected]", :first_name=>"Sam", :last_name=>"Lim"},
 :credentials=>{:token=>"abcdefg12345", :refresh_token=>"12345abcdefg", :expires_at=>Thu, 16 Nov 2017 15:27:23 -0700}}

Here is my spec:

    require 'rails_helper'

def stub_omniauth
  OmniAuth.config.test_mode = true
  OmniAuth.config.mock_auth[:google] = OmniAuth::AuthHash.new({
    provider: "google_oauth2",
      uid: "12345678910",
      info: {
        email: "[email protected]",
        first_name: "Sam",
        last_name: "Lim"
      },
      credentials: {
        token: "abcdefg12345",
        refresh_token: "abcdefg12345",
        expires_at: DateTime.now,
      }
    })
  end

RSpec.feature "user logs in" do
  scenario "using google oauth2 'omniauth'" do
    stub_omniauth

    visit root_path

    expect(page).to have_link("Sign in with Google")

    click_link "Sign in with Google"

    expect(page).to have_content("Sam Lim")
    expect(page).to have_content("Logout")
  end
end

And here is my User model method:

def self.update_or_create(auth)
    user = User.find_by(uid: auth[:uid]) || User.new
    binding.pry
    user.attributes = {
      provider: auth[:provider],
      uid: auth[:uid],
      email: auth[:info][:email],
      first_name: auth[:info][:first_name],
      last_name: auth[:info][:last_name],
      token: auth[:credentials][:token],
      refresh_token: auth[:credentials][:refresh_token],
      oauth_expires_at: auth[:credentials][:expires_at]
    }
    user.save!
    user
  end

I call that method in my sessions controller here:

def create
    user = User.update_or_create(request.env["omniauth.auth"])
    session[:id] = user.id
    redirect_to root_path
  end

Upvotes: 1

Views: 502

Answers (1)

Duong Do
Duong Do

Reputation: 11

I came across exactly this issue some days ago. The problem is in def stub_omniauth. You should change OmniAuth.config.mock_auth[:google] => OmniAuth.config.mock_auth[:google_oauth2]

Upvotes: 1

Related Questions