ruby 2.6.6
rails 4.2.11
rspec-rails 3.7.2

I'm having trouble setting up a test on a SessionsController to show that 
after a User is created with omniauth, an authorization is then created 
that has all of its correct values. 

I hope I'm not giving too much context here, but if anyone is willing to 
look at this, I don't want to waste their time by not having all the 
context (and there is a lot of it!)

My students are learning Agile Development and are using *Cucumber* for 
their Acceptance testing and *RSpec* for their Unit testing.  Many of them 
are asking me about this or similar problems they are having with tests 
involving proxy objects created via associations, and I honestly don't have 
an answer for them.  I'm scouring all of my books and the internet to find 
a solution.

code in controller:
*    user = User.create_with_omniauth(auth_hash['info'])*
*    auth = user.authorizations.create_with_omniauth(auth_hash)*
*    private*
*      def auth_hash*
*    # ensures availability but only retrieved once per cycle*
*    @auth_hash ||= request.env['omniauth.auth']*
*  end*

schema:

*ActiveRecord::Schema.define(version: 20210414024936) do*
*  create_table "authorizations", force: :cascade do |t|*
*    t.string   "provider"*
*    t.string   "uid"*
*    t.integer  "user_id"*
*    t.datetime "created_at", null: false*
*    t.datetime "updated_at", null: false*
*  end*

*  add_index "authorizations", ["user_id"], name: 
"index_authorizations_on_user_id"*

*  create_table "users", force: :cascade do |t|*
*    t.string   "name"*
*    t.string   "email"*
*    t.datetime "created_at", null: false*
*    t.datetime "updated_at", null: false*
*  end*
*end*

code in models:


*class User < ActiveRecord::Base*
*  has_many :authorizations*
*  validates :name, :email, :presence => true*
  
*  # save new user info*
*  def self.create_with_omniauth info*
*    create!(name: info['name'], email: info['email'])*
*  end*
*end*

*class Authorization < ActiveRecord::Base*
*  belongs_to :user*
*  validates :provider, :uid, :presence => true*
*  validates_uniqueness_of :uid, scope: :provider*
    
*  # create new authorization*
*  def self.create_with_omniauth auth*
*    create!(uid: auth['uid'], provider: auth['provider'])*
*  end*
*end*

spec_helper.rb:
*require 'omniauth'*

*OmniAuth.config.test_mode = true*
*omniauth_hash = { 'provider' => 'github',*
*                  'uid' => "12345",*
*                  'info' => {*
*                      'name' => "SUNY Tester",*
*                      'email' =>"stes...@binghamton.edu",*
*                  }*
*}*
*OmniAuth.config.add_mock(:github, omniauth_hash)*

rails_helper.rb
*Rails.application.env_config["omniauth.auth"] = 
OmniAuth.config.mock_auth[:github]   *

sessions_controller_spec.rb:

*require 'rails_helper'*
*RSpec.describe SessionsController, type: :controller do*
*  describe "GET #create" do*
*    context 'register with github' do*
*      describe 'When signing up for first time' do*
*        let(:user1) {instance_double('User', name: 'SUNY Tester', email: 
'stes...@binghamton.edu')} *
*        let(:authorization1) {instance_double('Authorization', provider: 
'github', uid: '12345', user_id: '1')}   *
*        it "creates a User" do*
*          expect(User).to 
receive(:create_with_omniauth).with(OmniAuth.config.mock_auth[:github]['info']).and_return(user1)*
*          post :create, provider: :github  *
*        end*

*       # none of the following work, just a couple examples  of what I've 
tried *
*        it "creates an Authorization" do*
*          #allow(user1).to 
receive(:authorizations.create_with_omniauth).with(OmniAuth.config.mock_auth[:github]['info']).and_return(user1)*
*         # expect(authorization1).to be_a_new(Authorization)*
*        #  expect(user1.authorizations).to 
receive(:create_with_omniauth).with(OmniAuth.config.mock_auth[:github]).and_return(authorization1)*
*          post :create, provider: :github*
*        end*

The error messages are always something along the lines of:
*SessionsController GET #create register with github When signing up for 
first time creates a User*
*     Failure/Error: user.authorizations.create_with_omniauth(auth_hash)*
*       #<InstanceDouble(User) (anonymous)> received unexpected message 
:authorizations with (no args)*

If I try to create the authorization directly instead of with the proxy 
object, the user_id doesn't get set.

No matter how I go about it, I can't seem to find a way to mock a proxy 
object (the instance of user that is just created* .authorizations )*

Ironically, All my code as well as the students' code is working, but I 
can't seem to find a proper way to test it.



-- 
You received this message because you are subscribed to the Google Groups 
"rspec" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rspec+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rspec/6cea440c-85b1-4aba-856c-3a518e421835n%40googlegroups.com.

Reply via email to