1
0
Fork 0
mirror of https://github.com/aasm/aasm synced 2023-03-27 23:22:41 -04:00

Merge pull request #408 from udacity/disambiguate-transitions-with-same-to-and-from

Allow multiple transitions in a single event with the same to and from states
This commit is contained in:
Anil Kumar Maurya 2016-10-16 01:34:26 +05:30 committed by GitHub
commit 435826897f
3 changed files with 49 additions and 3 deletions

View file

@ -128,12 +128,13 @@ module AASM::Core
transitions.each do |transition|
next if to_state and !Array(transition.to).include?(to_state)
if (options.key?(:may_fire) && Array(transition.to).include?(options[:may_fire])) ||
if (options.key?(:may_fire) && transition.eql?(options[:may_fire])) ||
(!options.key?(:may_fire) && transition.allowed?(obj, *args))
result = to_state || Array(transition.to).first
if options[:test_only]
# result = true
result = transition
else
result = to_state || Array(transition.to).first
Array(transition.to).each {|to| @valid_transitions[to] = transition }
transition.execute(obj, *args)
end

View file

@ -0,0 +1,31 @@
class MultipleTransitionsThatDifferOnlyByGuard
include AASM
attr_accessor :executed_second
aasm do
state :start, :initial => true
state :gone
event :go do
transitions :from => :start, :to => :gone, :guard => :returns_false, :after => :this_should_not_execute
transitions :from => :start, :to => :gone, :guard => :returns_true, :after => :this_should_execute
end
end
def returns_false
false
end
def returns_true
true
end
def this_should_not_execute
raise RuntimeError, "This should not execute"
end
def this_should_execute
self.executed_second = true
end
end

View file

@ -0,0 +1,14 @@
require 'spec_helper'
describe "multiple transitions that differ only by guard" do
let(:job) { MultipleTransitionsThatDifferOnlyByGuard.new }
it 'does not follow the first transition if its guard fails' do
expect{job.go}.not_to raise_error
end
it 'executes the second transition\'s callbacks' do
job.go
expect(job.executed_second).to be_truthy
end
end