I'm not failiar with that factory notation but if your factory is like
FactoryGirl and that :participation factory template uses a :user factory
template internally for the association, then if it is like FactoryGirl it will
do a create on the user even if you are doing build on the outer template. This
is a bit of a stab in the dark since I'm not sure what you are using for
factories and what is in your templates but I have been stung like this with
factorygirl before. If your participation had a user and that user was already
persisted then your callback won't go off…
Sorry this might be hopelessly off track…
Cheers,
Adam
On 31/10/2011, at 1:59 PM, Dmytrii Nagirniak wrote:
> Hi,
>
> I must have some stupid mistake or something.
> Just can't seem to pass the spec.
>
> Could you guys please help me find where the evil has hidden in the details?
>
>
> describe Participation do
> describe "invitation by email", :focus do
> let(:participation) { build :participation } # Factory
> let(:email) { participation.email }
>
> it "should send an invitation" do
> # This one is failing
> binding.pry # The code below is executed here
> participation.should_receive(:invite_user!)
> participation.save!
> end
>
> context "when user already exists" do
> let!(:existing) { create :user, :email => email }
> it "should not send an invitation" do
> participation.should_not_receive(:invite_user!)
> participation.save!
> end
>
> end
> end
> end
>
>
>
> Can't see anything wrong with the callbacks:
>
> # Check the before_validation callback options:
> participation.user # nil
> participation.valid? # true
> participation.user # User{id: nil}
>
> # Check the before_create callback options:
> participation.user_exists? # false
> participation.mark_for_invitation # true
>
> # Check the after_create callback options:
> participation.marked_for_invitation? # true
>
> # After all this I expect the "invite_user!" to be called:
> participation.stub(:invite_user!) { puts "Doesn't get called :(" }
> participation.save! # => true, Nothing is printed, which is consistent with
> the spec
> participation.user_id # => 11, so the user has been saved
>
>
> The actual implementation is:
>
>
> class Participation < ActiveRecord::Base
> attr_accessor :email
>
> belongs_to :user
> validates :email, :email => true, :on => :create, :if => :using_email?
>
> before_validation :set_user_by_email, :if => :using_email?, :on =>
> :create
> before_create :mark_for_invitation, :unless => :user_exists?
> after_create :invite_user!, :if => :marked_for_invitation?
>
>
> def using_email?
> email.present?
> end
>
> def user_exists?
> user.present? and user.persisted?
> end
>
> def set_user_by_email
> self.user = User.find_by_email(email)
> self.user ||= User.new(email: email).tap do |u|
> u.status = :invited
> end
> end
>
> def mark_for_invitation
> @invite_user = true
> true # make sure not cancelling the callback chain
> end
>
> def marked_for_invitation?
> !!@invite_user
> end
>
> def invite_user!
> # TODO: Send the invitation email or something
> end
> end
>
>
> Can't spot the problem.
>
>
> Thanks in advance,
> Dima
> http://www.ApproachE.com
>
>
>
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "Ruby or Rails Oceania" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/rails-oceania?hl=en.
--
You received this message because you are subscribed to the Google Groups "Ruby
or Rails Oceania" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/rails-oceania?hl=en.