This is how I initialize my instance variables:
context "when the inviter is being deleted and invited HAS accepted invitation" do
before :each do
@user1 = create(:user, gender: 0)
@user2 = create(:user)
@membership1 = create(:membership, member: nil, family_tree: @user1.family_tree, inviter: @user1, invited: @user2, relation: "sister", relative_type: 1)
@membership2 = create(:membership, member: nil, family_tree: @user2.family_tree, inviter: @user2, invited: @user1, relation: "brother", relative_type: 1)
@connection = create(:connection, inviter_membership: @membership1, invited_membership: @membership2, inviter_user: @user1, invited_user: @user2, request_status: 1)
sign_in @user1
end
Yet, when I run this test:
it "should NOT delete the inviter_membership record" do
inviter_membership = @membership1
delete :destroy, id: @user1
expect(Membership.find(inviter_membership.id)).to be inviter_membership
end
I get this error:
ActiveRecord::RecordNotFound: Couldn't find Membership with 'id'=1441
When I explore my DB at the PRY console that is generated with this test failure, these are my results:
[1] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> inviter_membership
=> #<Membership id: nil, family_tree_id: 31704, user_id: 13101, created_at: "2016-01-28 20:46:58", updated_at: "2016-01-28 20:46:58", relation: "sister", member_id: nil, invited_id: 13102, relative_type: 1>
[2] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @membership1
=> #<Membership id: nil, family_tree_id: 31704, user_id: 13101, created_at: "2016-01-28 20:46:58", updated_at: "2016-01-28 20:46:58", relation: "sister", member_id: nil, invited_id: 13102, relative_type: 1>
Not the initial membership.id: nil
value. I see something similar when I examine my other records:
[5] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @user1
=> #<User id: nil, email: "[email protected]", encrypted_password: "$2a$04$lROCfnS8rHf3Y2CKp0Ozw.9zsqa4rXTmxU6QvpGUm9S...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2016-01-28 20:46:58", updated_at: "2016-01-28 20:46:58", first_name: "Murphy", confirmation_token: nil, confirmed_at: "2016-01-28 20:46:56", confirmation_sent_at: nil, unconfirmed_email: nil, invitation_relation: "a", avatar: nil, invitation_token: nil, invitation_created_at: nil, invitation_sent_at: nil, invitation_accepted_at: nil, invitation_limit: nil, invited_by_id: nil, invited_by_type: nil, invitations_count: 0, bio: "Facere consequatur odio recusandae aut ipsa repudi...", last_name: "Haag", gender: 0, birthday: nil>
[6] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @user2
=> #<User id: nil, email: "[email protected]", encrypted_password: "$2a$04$ju0c8gr/RUaPeRNneh5rVOAN3QtUoMEzy9UwM4.a.D3...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2016-01-28 20:46:58", updated_at: "2016-01-28 20:46:58", first_name: "Neva", confirmation_token: nil, confirmed_at: "2016-01-28 20:46:56", confirmation_sent_at: nil, unconfirmed_email: nil, invitation_relation: "voluptatem", avatar: nil, invitation_token: nil, invitation_created_at: nil, invitation_sent_at: nil, invitation_accepted_at: nil, invitation_limit: nil, invited_by_id: nil, invited_by_type: nil, invitations_count: 0, bio: "Reiciendis optio mollitia et vel. Adipisci odit el...", last_name: "Rippin", gender: 1, birthday: nil>
[7] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @membership2
=> #<Membership id: nil, family_tree_id: 31706, user_id: 13102, created_at: "2016-01-28 20:46:58", updated_at: "2016-01-28 20:46:58", relation: "brother", member_id: nil, invited_id: 13101, relative_type: 1>
Not sure if it has to do with saving, but the weird thing is that my @connection
value actually has a valid id:
[4] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @connection
=> #<Connection id: 1892, membership_id: 1441, sent_at: "2016-01-23 01:58:47", responded_at: "2016-02-12 11:17:20", send_limit: 5, times_sent: 1, removed_at: "2016-01-28 20:46:58", created_at: "2016-01-28 20:46:58", updated_at: "2016-01-28 20:46:58", request_status: 1, invited_membership_id: 1442, invited_user_id: 13102, inviter_user_id: 13101>
The only thing I can think of, is in my code, I actually call connection.update(...)
on the equivalent of this @connection
. So maybe that call saves the record?
If that's the case, either how do I save my records in Rspec (and do I want to??) or how do I find that record in the database? I need to verify that it hasn't been deleted.
Edit 1
If I use build
in my @membership1
initialization instead of create
and dig into it deeper, this is what I get:
[1] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @membership1
=> #<Membership id: nil, family_tree_id: 31799, user_id: 13146, created_at: "2016-01-28 21:08:09", updated_at: "2016-01-28 21:08:09", relation: "sister", member_id: nil, invited_id: 13147, relative_type: 1>
[2] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> inviter_membership
=> #<Membership id: nil, family_tree_id: 31799, user_id: 13146, created_at: "2016-01-28 21:08:09", updated_at: "2016-01-28 21:08:09", relation: "sister", member_id: nil, invited_id: 13147, relative_type: 1>
[3] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @membership1.valid?
=> true
[5] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @membership1.errors
=> #<ActiveModel::Errors:0x007fbd2f9fb458
@base=
#<Membership id: nil, family_tree_id: 31799, user_id: 13146, created_at: "2016-01-28 21:08:09", updated_at: "2016-01-28 21:08:09", relation: "sister", member_id: nil, invited_id: 13147, relative_type: 1>,
@messages={}>
Edit 2
So here is the weird thing, I put a binding.pry
in the before :each
at the top to just check the values that are generated before it sends execution to each it
block. Those values DO have IDs.
51: @membership1 = build(:membership, member: nil, family_tree: @user1.family_tree, inviter: @user1, invited: @user2, relation: "sister", relative_type: 1)
52: @membership2 = create(:membership, member: nil, family_tree: @user2.family_tree, inviter: @user2, invited: @user1, relation: "brother", relative_type: 1)
53: @membership3 = build_stubbed(:membership)
54: @connection = create(:connection, inviter_membership: @membership1, invited_membership: @membership2, inviter_user: @user1, invited_user: @user2, request_status: 1)
55: sign_in @user1
=> 56: binding.pry
57: end
58:
59: it "should confirm that inviter_membership has nil member_id" do
60: expect(@user1.inviter_memberships.first.member).to be nil
61: end
[1] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @membership1
=> #<Membership id: 1474, family_tree_id: 31878, user_id: 13183, created_at: "2016-01-28 21:37:38", updated_at: "2016-01-28 21:37:38", relation: "sister", member_id: nil, invited_id: 13184, relative_type: 1>
[2] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @membership2
=> #<Membership id: 1473, family_tree_id: 31880, user_id: 13184, created_at: "2016-01-28 21:37:38", updated_at: "2016-01-28 21:37:38", relation: "brother", member_id: nil, invited_id: 13183, relative_type: 1>
[3] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @membership3
=> #<Membership id: 1007, family_tree_id: 1001, user_id: 1003, created_at: nil, updated_at: nil, relation: "possimus", member_id: 1006, invited_id: 1005, relative_type: 0>
However, in the it
block I am concerned with, it seems to override the id
value of each instance variable except for one I just added with the build_stubbed
method rather than create
:
71: inviter_membership = @membership1
72: delete :destroy, id: @user1
=> 73: expect(Membership.find(inviter_membership.id)).to be inviter_membership
74: end
75:
76: it "should create a member record with inviter_user's info" do
77: expect {
78: delete :destroy, id: @user1
ActiveRecord::RecordNotFound: Couldn't find Membership with 'id'=1478
from /gems/activerecord-.1.14/lib/active_record/relation/finder_methods.rb:320:in `raise_record_not_found_exception!'
[1] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @membership1
=> #<Membership id: nil, family_tree_id: 31886, user_id: 13187, created_at: "2016-01-28 21:38:23", updated_at: "2016-01-28 21:38:23", relation: "sister", member_id: nil, invited_id: 13188, relative_type: 1>
[2] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @membership2
=> #<Membership id: nil, family_tree_id: 31888, user_id: 13188, created_at: "2016-01-28 21:38:23", updated_at: "2016-01-28 21:38:23", relation: "brother", member_id: nil, invited_id: 13187, relative_type: 1>
[3] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @membership3
=> #<Membership id: 1021, family_tree_id: 1015, user_id: 1017, created_at: nil, updated_at: nil, relation: "at", member_id: 1020, invited_id: 1019, relative_type: 0>
What could be overriding the id
value within the it
block?
Edit 3
So something strange is happening with the authentication.
If I do sign_in @user2
, then the test that is failing now passes.
This is the test that fails with sign_in @user1
, but passes with sign_in @user2
:
it "should NOT delete the inviter_membership record" do
expect {
delete :destroy, id: @user1
}.not_to change(Membership,:count)
end
I tried commenting out the sign_in
line altogether, and that also causes the above test to pass.
What's strange is that on my user
model, I have a before_destroy :callback
, and when I place a binding.pry
in that method it doesn't execute on that test, for both a failing and passing test. So it seems that the callback is not being called, which is super strange.
I am not 100% sure if this is the answer and correct explanation, but the errors that Rspec was throwing at me are finally fixed.
I believe what is happening is that in the before :each
it successfully creates and saves the object to the DB. But, when the spec fails....it basically 'builds' the object and shows me that rebuilt object AFTER the spec failed. So that's why I don't see an object.id
.
I believe that's the case because if I put a regular binding.pry
inside each unit test that doesn't fail and then I query the instance variables initialized in the before :each
, it looks normal. For instance:
it "should NOT delete the inviter_membership record" do
sign_in @user2
binding.pry
expect {
delete :destroy, id: @user1
}.not_to change(Membership,:count)
end
Results in this:
[1] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @user1
=> #<User id: 13667, email: "[email protected]", encrypted_password: "$2a$04$h.2yrLwRb1J1uJoWtFKUOuG.IW.UnchqXbfC7v.bJic...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2016-01-30 22:27:12", updated_at: "2016-01-30 22:27:12", first_name: "Daisy", confirmation_token: nil, confirmed_at: "2016-01-30 22:27:10", confirmation_sent_at: nil, unconfirmed_email: nil, invitation_relation: "vel", avatar: nil, invitation_token: nil, invitation_created_at: nil, invitation_sent_at: nil, invitation_accepted_at: nil, invitation_limit: nil, invited_by_id: nil, invited_by_type: nil, invitations_count: 0, bio: "Maxime vitae dolorem atque perferendis sed fuga. A...", last_name: "Rohan", gender: 0, birthday: nil>
[2] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @user2
=> #<User id: 13668, email: "[email protected]", encrypted_password: "$2a$04$x3XvAGUAaxE0Kk8mtgcFCOb7FrGnPc3IS0wET/xauQU...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2016-01-30 22:27:12", updated_at: "2016-01-30 22:27:12", first_name: "Elliott", confirmation_token: nil, confirmed_at: "2016-01-30 22:27:10", confirmation_sent_at: nil, unconfirmed_email: nil, invitation_relation: "ducimus", avatar: nil, invitation_token: nil, invitation_created_at: nil, invitation_sent_at: nil, invitation_accepted_at: nil, invitation_limit: nil, invited_by_id: nil, invited_by_type: nil, invitations_count: 0, bio: "Aperiam ut quia ea inventore non ad. Nobis nisi di...", last_name: "Hickle", gender: 1, birthday: nil>
[3] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @membership1
=> #<Membership id: 1747, family_tree_id: 32888, user_id: 13667, created_at: "2016-01-30 22:27:12", updated_at: "2016-01-30 22:27:12", relation: "sister", member_id: nil, invited_id: 13668, relative_type: 1>
[4] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @membership2
=> #<Membership id: 1748, family_tree_id: 32890, user_id: 13668, created_at: "2016-01-30 22:27:12", updated_at: "2016-01-30 22:27:12", relation: "brother", member_id: nil, invited_id: 13667, relative_type: 1>
[5] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @connection
=> #<Connection id: 2351, membership_id: 1747, sent_at: "2016-01-25 01:35:36", responded_at: "2016-02-07 13:16:04", send_limit: 5, times_sent: 1, removed_at: "2016-01-30 22:27:12", created_at: "2016-01-30 22:27:12", updated_at: "2016-01-30 22:27:12", request_status: 1, invited_membership_id: 1748, invited_user_id: 13668, inviter_user_id: 13667>
It is only if the spec fails, that it shows me the non-persisted objects like so:
RSpec::Expectations::ExpectationNotMetError: expected #count to have changed, but is still 2
from /gems/rspec-expectations-3.2.1/lib/rspec/expectations/fail_with.rb:29:in `fail_with'
[1] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @user1
=> #<User id: nil, email: "[email protected]", encrypted_password: "$2a$04$9AJpP7/UwUDoYMw/YrSd2O2qy.nSZguZGnlWyNt8mVV...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2016-01-30 22:28:22", updated_at: "2016-01-30 22:28:22", first_name: "Ashtyn", confirmation_token: nil, confirmed_at: "2016-01-30 22:28:20", confirmation_sent_at: nil, unconfirmed_email: nil, invitation_relation: "doloribus", avatar: nil, invitation_token: nil, invitation_created_at: nil, invitation_sent_at: nil, invitation_accepted_at: nil, invitation_limit: nil, invited_by_id: nil, invited_by_type: nil, invitations_count: 0, bio: "Perspiciatis dolor natus ut incidunt aperiam culpa...", last_name: "Jones", gender: 0, birthday: nil>
[2] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @user2
=> #<User id: nil, email: "[email protected]", encrypted_password: "$2a$04$ReYuDORNmKSNeDEYPZrmwuFHPfkv2JWypPQjmKuQVuy...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2016-01-30 22:28:22", updated_at: "2016-01-30 22:28:22", first_name: "Albin", confirmation_token: nil, confirmed_at: "2016-01-30 22:28:20", confirmation_sent_at: nil, unconfirmed_email: nil, invitation_relation: "dolores", avatar: nil, invitation_token: nil, invitation_created_at: nil, invitation_sent_at: nil, invitation_accepted_at: nil, invitation_limit: nil, invited_by_id: nil, invited_by_type: nil, invitations_count: 0, bio: "Rerum soluta dolorum harum rerum fuga repudiandae....", last_name: "Dooley", gender: 1, birthday: nil>
[3] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @membership1
=> #<Membership id: nil, family_tree_id: 32975, user_id: 13708, created_at: "2016-01-30 22:28:22", updated_at: "2016-01-30 22:28:22", relation: "sister", member_id: nil, invited_id: 13709, relative_type: 1>
[4] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @membership2
=> #<Membership id: nil, family_tree_id: 32977, user_id: 13709, created_at: "2016-01-30 22:28:22", updated_at: "2016-01-30 22:28:22", relation: "brother", member_id: nil, invited_id: 13708, relative_type: 1>
[5] pry(#<RSpec::ExampleGroups::UsersController::DELETEDestroy::WhenTheInviterIsBeingDeletedAndInvitedHASAcceptedInvitation>)> @connection
=> #<Connection id: 2375, membership_id: 1763, sent_at: "2016-01-25 00:35:20", responded_at: "2016-02-20 13:06:58", send_limit: 5, times_sent: 1, removed_at: "2016-01-30 22:28:22", created_at: "2016-01-30 22:28:22", updated_at: "2016-01-30 22:28:22", request_status: 1, invited_membership_id: 1764, invited_user_id: 13709, inviter_user_id: 13708>
I still don't understand why the last instance variable - @connection
- is persisted properly while the others aren't....alas....it works properly for me now.
I hope this helps someone!