samedi 24 janvier 2015

How can I write a Rails 4 test for creating a session with the omniauth-google-oauth2 gem?

I'm attempting to write a test for the creation of a session with the omniauth-google-oauth2 gem. Do I need to pass the env["omniauth.auth"] variable with the post :create? Perhaps when I was attempting to do that I was doing it incorrectly. The error I'm getting is shown below...


Rake Test Error



1) Error:
SessionsControllerTest#test_should_get_create:
NoMethodError: undefined method `provider' for nil:NilClass
app/models/user.rb:6:in `from_omniauth'
app/controllers/sessions_controller.rb:4:in `create'
test/controllers/sessions_controller_test.rb:13:in `block in <class:SessionsControllerTest>'


The following is my attempt at writing the test...


SessionsControllerTest



require 'test_helper'

class SessionsControllerTest < ActionController::TestCase

setup :prepare_omniauth

test "should get create" do
post :create
redirect_to root_path, notice: "Signed in!"
end

test "should get destroy" do
get :destroy
assert session[:user_id].blank?, "user_id should no longer exist"
assert_redirected_to root_path, notice: "Signed out!"
end

private

def prepare_omniauth
OmniAuth.config.test_mode = true
OmniAuth.config.mock_auth[:google] = OmniAuth::AuthHash.new({
:provider => 'google',
:uid => '123545'
})
request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:google]
end

end


Sessions Controller



class SessionsController < ApplicationController

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

def destroy
session[:user_id] = nil unless session[:user_id].blank?
redirect_to root_path
end

end


User Model



class User < ActiveRecord::Base

def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_initialize.tap do |user|
user.provider = auth.provider
user.uid = auth.uid
user.name = auth.info.name
user.oauth_token = auth.credentials.token
user.oauth_expires_at = Time.at(auth.credentials.expires_at)
user.save!
end
end

end

Aucun commentaire:

Enregistrer un commentaire