`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
<[email protected]> 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 <[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/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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rspec/CAAk5Ok8VS8Vj_sDUL%2BtLyjxvgqkQHS1Oobd8UvUmzPAv%3D-9%2ByA%40mail.gmail.com.

Reply via email to