Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Guard method being called twice #184

Closed
sfkaos opened this issue Nov 19, 2014 · 3 comments
Closed

Guard method being called twice #184

sfkaos opened this issue Nov 19, 2014 · 3 comments
Assignees

Comments

@sfkaos
Copy link

sfkaos commented Nov 19, 2014

I am currently seeing guard method being called twice in aasm events. Please see below:

class Artwork < ActiveRecord::Base
  include AASM

...

aasm :column => 'state' do
    state :pending, :initial => true
    state :incomplete
    state :expired, :before_enter => :set_expired_date
    state :quarantined, :before_enter => :set_quarantined_date
    state :revised, :before_enter => [:set_revised_date, :nullify_quarantined_date]
    state :for_sale, :before_enter => [:set_approved_date_and_activate_artist, :send_approved_email, :add_to_prem_artist_candidate]
    state :deleted
    state :sold, :before_enter => :set_sold_date

    #purchase made
    state :address_verified, :after_enter => :generate_shipping_label
    state :address_failed_verification
    state :label_generated, :after_enter => [:set_shipping_label_creation_date, :process_shipping_label]
    state :label_generation_failed
    state :label_sent, :after_enter => :set_label_sent_date
    state :label_downloaded
    state :shipped
    state :delivered, :after_enter => :set_delivered_at

    #some states redacted for brevity

    event :complete do
      transitions :from => :incomplete, :to => :pending
    end

    event :remove do
      transitions :to => :deleted
    end

    event :approve do
       transitions :from => [:pending, :revised], :to => :for_sale
    end

    event :buy, :after => [:update_merchant_tier, :verify_address] do
      transitions :from => :for_sale, :to => :sold
    end

    event :flag, :after => :send_flagged_email do
      transitions :from => [:pending, :revised, :for_sale], :to => :quarantined
    end

    event :expire do
      transitions :from => :for_sale, :to => :expired
    end  

    event :revise do
      transitions :from => :quarantined, :to => :revised
    end

    event :saved_image_only do
      transitions :from => :pending, :to => :incomplete
    end

    event :verify_address do
      transitions :from => [:sold, :address_failed_verification], :to => :address_verified, :guard => :address_mailable?
      transitions :from => [:sold, :address_failed_verification], :to => :address_failed_verification
    end

    event :generate_shipping_label do
      transitions :from => :address_verified, :to => :label_generated, :guard => :create_shipping_label?
      transitions :from => :address_verified, :to => :label_generation_failed
    end

    event :process_shipping_label do
      transitions :from => :label_generated, :to => :label_sent, :guard => :sent_shipping_label?
      transitions :from => :label_generated, :to => :label_send_failed
    end

    event :download_label, :after => :set_shipping_label_downloaded_date do
      transitions :from => :label_sent, :to => :label_downloaded
    end

    event :shipped_artwork, :after => :set_shipped_at do
      transitions :from => :label_downloaded, :to => :shipped
    end

    event :confirm_delivery, :after => :send_artwork_delivered_email do
      transitions :from => :shipped, :to => :delivered
    end

    event :confirm_passed_refund, :after => :set_refund_period_expired_at do
      transitions :from => :delivered, :to => :refund_period_expired
    end    

    event :artist_paid, :after => [:set_payment_sent_at, :send_artist_payment_email] do
      transitions :from => :refund_period_expired, :to => :payment_sent
    end

    event :generate_return_label do
      transitions :from => :label_generated, :to => :return_label_generated
    end

  end


  def create_shipping_label?
    self.shipping_weight = (((self.height + 2) * (self.width + 2) * (self.depth + 2))/194.0)*16
    if self.shipping_weight > 0 #maybe validate?
      post_xml = shipping_label_xml
      request_shipping_label_for_xml(post_xml)
      self.save
    else
      return false
    end
  end

Here is the test

context "approved artwork" do

      let!(:artwork_address_verified) {FactoryGirl.create(:artwork, state: :address_verified)}

      it "should request a shipping label via XML when generating one" do        
        artwork_address_verified.should_receive(:request_shipping_label_for_xml) {}
        artwork_address_verified.should_receive(:shipping_label_xml)
        artwork_address_verified.generate_shipping_label        
      end
end

Getting

  1) Artwork valid artwork approved artwork should request a shipping label via XML when generating one
     Failure/Error: artwork_address_verified.should_receive(:request_shipping_label_for_xml) {}
       (#<Artwork:0x007f8ae10fbf90>).request_shipping_label_for_xml(any args)
           expected: 1 time
           received: 2 times
alto added a commit that referenced this issue Nov 19, 2014
@alto alto self-assigned this Nov 19, 2014
@alto
Copy link
Member

alto commented Nov 19, 2014

@sfkaos By design and since version 4.0.0 (which was released only a week ago), guards (event and transition) were fired twice when firing an event.

This is obsolete in my point of view, and not very helpful with expensive (long-running) guard either, and I removed this now. Will release a patched version soon (4.0.1 then).

@alto alto closed this as completed Nov 19, 2014
@sfkaos
Copy link
Author

sfkaos commented Nov 19, 2014

@alto Makes sense. Thanks for this!

@alto
Copy link
Member

alto commented Nov 19, 2014

Released version 4.0.1 right now. 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants