How can I write a Rails 4 test to create a session with omniauth-google-oauth2 stone?

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 
+6
source share
1 answer

I believe this blog has an answer to your question: http://natashatherobot.com/rails-test-omniauth-sessions-controller/

Basically you need to edit rails_helper / spec_helper to set the Omniauth check mode to true and create omniauth_hash, which will be used in your tests:

 OmniAuth.config.test_mode = true omniauth_hash = { 'provider' => 'github', 'uid' => '12345', 'info' => { 'name' => 'natasha', 'email' => ' hi@natashatherobot.com ', 'nickname' => 'NatashaTheRobot' }, 'extra' => {'raw_info' => { 'location' => 'San Francisco', 'gravatar_id' => '123456789' } } } OmniAuth.config.add_mock(:github, omniauth_hash) 

Then you require it before any tests:

 before do request.env['omniauth.auth'] = OmniAuth.config.mock_auth[:github] end 

Now you can create users using Omniauth, as in this example:

 describe SessionsController do it "should successfully create a user" do expect { post :create, provider: :github }.to change{ User.count }.by(1) end end 

All Natasha credits from http://natashatherobot.com for posting this answer on her blog.

+1
source

Source: https://habr.com/ru/post/981493/


All Articles