Although it's Authorizations I'm having trouble with. User is working fine, actually, but maybe this approach would work on authorizations also.
On Wed, Apr 14, 2021 at 4:41 PM Rose M Williams <[email protected]> wrote: > That sounds promising! I'll try it right after this class is over . . . > THANKS! > > On Wed, Apr 14, 2021 at 3:45 PM Phil Pirozhkov <[email protected]> wrote: > >> Will >> >> ``` >> expect { post :create, provider: :github } >> .to change { User.last }.to(having_attributes(name: ..., email: ...)) >> ``` >> work for you? >> >> On Wed, Apr 14, 2021 at 8:40 PM 'Rose M Williams' via rspec >> <[email protected]> wrote: >> > >> > 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' =>"[email protected]", >> > } >> > } >> > 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: '[email protected]')} >> > 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 [email protected]. >> > To view this discussion on the web visit >> https://groups.google.com/d/msgid/rspec/6cea440c-85b1-4aba-856c-3a518e421835n%40googlegroups.com >> . >> >> -- >> You received this message because you are subscribed to a topic in the >> Google Groups "rspec" group. >> To unsubscribe from this topic, visit >> https://groups.google.com/d/topic/rspec/H_ADLjDiV9I/unsubscribe. >> To unsubscribe from this group and all its topics, send an email to >> [email protected]. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/rspec/CAAk5Ok_BwG20jHXoEixZWkEndgoPffaXfENoG2Dy7_xo5rogxg%40mail.gmail.com >> . >> > > > -- > -- > > *Rose Williams* > > *Lecturer* > > *Department of Computer Science* > > *Binghamton University* > > *-----------------------------------------------* > > > *We are what we think. * > > *All that we are arises** with* > * our thoughts. * > > *With our thoughts,** we** make the world.* > > > > *Shakyamuni** Buddha* > -- -- *Rose Williams* *Lecturer* *Department of Computer Science* *Binghamton University* *-----------------------------------------------* *We are what we think. * *All that we are arises** with* * our thoughts. * *With our thoughts,** we** make the world.* *Shakyamuni** Buddha* -- 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 [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/rspec/CAFf4wh7VvWfrGgRuNbBC_rJKDGMK2r_r%3DxZA_g5pSc88st5C%2BQ%40mail.gmail.com.
