I am still not seeing where this problem is coming from.  I've configure 
the db strategy to be using transactions, via a block in my 
spec_helper.rb.  Your statement looks somewhat different.  Where would I 
put it?
On Thursday, April 15, 2021 at 4:41:39 AM UTC-4 pirj...@gmail.com wrote:

> `puts caller_locations` in your `create_with_omniauth` should help to
> pinpoint the problem.
>
> Sanity check: you're cleaning up the DB between examples with
> `use_transactional_fixtures!`, right?
>
> On Thu, Apr 15, 2021 at 4:17 AM 'Rose M Williams' via rspec
> <rs...@googlegroups.com> wrote:
> >
> > Still no joy, I've tried a number of solutions. the best so far is 
> resulting in what looks like a very silly and easy to fix error, but I 
> haven't had any luck with it yet.
> > Now I get the following error:
> > Failure/Error: create!(uid: auth['uid'], provider: auth['provider'])
> >
> > ActiveRecord::RecordInvalid:
> > Validation failed: Uid has already been taken
> >
> > From the error message, it sounds like there is already a record in the 
> database with I run the test, but when I look at it, it appears to be 
> empty, so for the life of my I can't figure out where a duplicate uid is 
> showing up.
> >
> > On Wednesday, April 14, 2021 at 4:44:06 PM UTC-4 Rose M Williams wrote:
> >>
> >> 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 <ro...@binghamton.edu> 
> 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 <pirj...@gmail.com> 
> 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
> >>>> <rs...@googlegroups.com> 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' =>"ste...@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: '
> ste...@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+un...@googlegroups.com.
> >>>> > 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 
> rspec+un...@googlegroups.com.
> >>>> 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 rspec+un...@googlegroups.com.
> > To view this discussion on the web visit 
> https://groups.google.com/d/msgid/rspec/84c65fd4-81f6-4701-93bf-f64b02541f3fn%40googlegroups.com
> .
>

-- 
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/b9781b95-cbfa-470c-94da-b4427ad067dcn%40googlegroups.com.

Reply via email to