I am trying to write a test to create a session with the omniauth-google-oauth2 . Do I need to pass env["omniauth.auth"] variable using post :create ? Perhaps when I tried to do this, I did it wrong. The error I get 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 to write a 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
Session 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
source share