2012-12-02 03:45:11 -05:00
|
|
|
require 'spec_helper'
|
2008-01-07 14:11:38 -05:00
|
|
|
|
2011-11-26 14:49:46 -05:00
|
|
|
describe 'transitions' do
|
|
|
|
|
|
|
|
it 'should raise an exception when whiny' do
|
|
|
|
process = ProcessWithNewDsl.new
|
2014-01-07 13:35:51 -05:00
|
|
|
expect { process.stop! }.to raise_error(AASM::InvalidTransition)
|
|
|
|
expect(process).to be_sleeping
|
2011-11-26 14:49:46 -05:00
|
|
|
end
|
|
|
|
|
2012-04-02 05:44:53 -04:00
|
|
|
it 'should not raise an exception when not whiny' do
|
2011-11-26 14:49:46 -05:00
|
|
|
silencer = Silencer.new
|
2014-01-07 13:35:51 -05:00
|
|
|
expect(silencer.smile!).to be_false
|
|
|
|
expect(silencer).to be_silent
|
2011-11-26 14:49:46 -05:00
|
|
|
end
|
|
|
|
|
2012-04-02 05:44:53 -04:00
|
|
|
it 'should not raise an exception when superclass not whiny' do
|
|
|
|
sub = SubClassing.new
|
2014-01-07 13:35:51 -05:00
|
|
|
expect(sub.smile!).to be_false
|
|
|
|
expect(sub).to be_silent
|
2012-04-02 05:44:53 -04:00
|
|
|
end
|
2012-10-19 02:18:03 -04:00
|
|
|
|
|
|
|
it 'should not raise an exception when from is nil even if whiny' do
|
|
|
|
silencer = Silencer.new
|
2014-01-07 13:35:51 -05:00
|
|
|
expect(silencer.smile_any!).to be_true
|
|
|
|
expect(silencer).to be_smiling
|
2012-10-19 02:18:03 -04:00
|
|
|
end
|
2012-12-02 03:45:11 -05:00
|
|
|
|
2013-09-03 07:13:53 -04:00
|
|
|
it 'should call the block when success' do
|
|
|
|
silencer = Silencer.new
|
|
|
|
success = false
|
2014-01-07 13:35:51 -05:00
|
|
|
expect {
|
2013-09-03 07:13:53 -04:00
|
|
|
silencer.smile_any! do
|
|
|
|
success = true
|
|
|
|
end
|
2014-01-07 13:35:51 -05:00
|
|
|
}.to change { success }.to(true)
|
2013-09-03 07:13:53 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should not call the block when failure' do
|
|
|
|
silencer = Silencer.new
|
|
|
|
success = false
|
2014-01-07 13:35:51 -05:00
|
|
|
expect {
|
2013-09-03 07:13:53 -04:00
|
|
|
silencer.smile! do
|
|
|
|
success = true
|
|
|
|
end
|
2014-01-07 13:35:51 -05:00
|
|
|
}.not_to change { success }.to(true)
|
2013-09-03 07:13:53 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'blocks' do
|
2011-11-26 14:49:46 -05:00
|
|
|
end
|
|
|
|
|
2013-02-21 22:02:40 -05:00
|
|
|
describe AASM::Transition do
|
2008-01-07 14:11:38 -05:00
|
|
|
it 'should set from, to, and opts attr readers' do
|
|
|
|
opts = {:from => 'foo', :to => 'bar', :guard => 'g'}
|
2013-02-21 22:02:40 -05:00
|
|
|
st = AASM::Transition.new(opts)
|
2008-01-07 14:11:38 -05:00
|
|
|
|
2014-01-07 13:35:51 -05:00
|
|
|
expect(st.from).to eq(opts[:from])
|
|
|
|
expect(st.to).to eq(opts[:to])
|
|
|
|
expect(st.opts).to eq(opts)
|
2008-01-07 14:11:38 -05:00
|
|
|
end
|
2008-02-21 10:16:08 -05:00
|
|
|
|
|
|
|
it 'should pass equality check if from and to are the same' do
|
|
|
|
opts = {:from => 'foo', :to => 'bar', :guard => 'g'}
|
2013-02-21 22:02:40 -05:00
|
|
|
st = AASM::Transition.new(opts)
|
2008-02-21 10:16:08 -05:00
|
|
|
|
2013-11-15 05:19:26 -05:00
|
|
|
obj = double('object')
|
2014-01-07 13:35:51 -05:00
|
|
|
allow(obj).to receive(:from).and_return(opts[:from])
|
|
|
|
allow(obj).to receive(:to).and_return(opts[:to])
|
2008-02-21 10:16:08 -05:00
|
|
|
|
2014-01-07 13:35:51 -05:00
|
|
|
expect(st).to eq(obj)
|
2008-02-21 10:16:08 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should fail equality check if from are not the same' do
|
|
|
|
opts = {:from => 'foo', :to => 'bar', :guard => 'g'}
|
2013-02-21 22:02:40 -05:00
|
|
|
st = AASM::Transition.new(opts)
|
2008-02-21 10:16:08 -05:00
|
|
|
|
2013-11-15 05:19:26 -05:00
|
|
|
obj = double('object')
|
2014-01-07 13:35:51 -05:00
|
|
|
allow(obj).to receive(:from).and_return('blah')
|
|
|
|
allow(obj).to receive(:to).and_return(opts[:to])
|
2008-02-21 10:16:08 -05:00
|
|
|
|
2014-01-07 13:35:51 -05:00
|
|
|
expect(st).not_to eq(obj)
|
2008-02-21 10:16:08 -05:00
|
|
|
end
|
2009-04-09 01:25:16 -04:00
|
|
|
|
2008-02-21 10:16:08 -05:00
|
|
|
it 'should fail equality check if to are not the same' do
|
|
|
|
opts = {:from => 'foo', :to => 'bar', :guard => 'g'}
|
2013-02-21 22:02:40 -05:00
|
|
|
st = AASM::Transition.new(opts)
|
2008-02-21 10:16:08 -05:00
|
|
|
|
2013-11-15 05:19:26 -05:00
|
|
|
obj = double('object')
|
2014-01-07 13:35:51 -05:00
|
|
|
allow(obj).to receive(:from).and_return(opts[:from])
|
|
|
|
allow(obj).to receive(:to).and_return('blah')
|
2008-02-21 10:16:08 -05:00
|
|
|
|
2014-01-07 13:35:51 -05:00
|
|
|
expect(st).not_to eq(obj)
|
2008-02-21 10:16:08 -05:00
|
|
|
end
|
2008-01-07 14:11:38 -05:00
|
|
|
end
|
|
|
|
|
2013-02-21 22:02:40 -05:00
|
|
|
describe AASM::Transition, '- when performing guard checks' do
|
2008-02-21 10:46:06 -05:00
|
|
|
it 'should return true of there is no guard' do
|
|
|
|
opts = {:from => 'foo', :to => 'bar'}
|
2013-02-21 22:02:40 -05:00
|
|
|
st = AASM::Transition.new(opts)
|
2008-02-21 10:46:06 -05:00
|
|
|
|
2014-01-07 13:35:51 -05:00
|
|
|
expect(st.perform(nil)).to be_true
|
2008-02-21 10:46:06 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should call the method on the object if guard is a symbol' do
|
|
|
|
opts = {:from => 'foo', :to => 'bar', :guard => :test}
|
2013-02-21 22:02:40 -05:00
|
|
|
st = AASM::Transition.new(opts)
|
2008-02-21 10:46:06 -05:00
|
|
|
|
2013-11-15 05:19:26 -05:00
|
|
|
obj = double('object')
|
2014-01-07 13:35:51 -05:00
|
|
|
expect(obj).to receive(:test)
|
2009-04-09 01:25:16 -04:00
|
|
|
|
2008-02-21 10:46:06 -05:00
|
|
|
st.perform(obj)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should call the method on the object if guard is a string' do
|
|
|
|
opts = {:from => 'foo', :to => 'bar', :guard => 'test'}
|
2013-02-21 22:02:40 -05:00
|
|
|
st = AASM::Transition.new(opts)
|
2008-02-21 10:46:06 -05:00
|
|
|
|
2013-11-15 05:19:26 -05:00
|
|
|
obj = double('object')
|
2014-01-07 13:35:51 -05:00
|
|
|
expect(obj).to receive(:test)
|
2009-04-09 01:25:16 -04:00
|
|
|
|
2008-02-21 10:46:06 -05:00
|
|
|
st.perform(obj)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should call the proc passing the object if the guard is a proc' do
|
|
|
|
opts = {:from => 'foo', :to => 'bar', :guard => Proc.new {|o| o.test}}
|
2013-02-21 22:02:40 -05:00
|
|
|
st = AASM::Transition.new(opts)
|
2008-02-21 10:46:06 -05:00
|
|
|
|
2013-11-15 05:19:26 -05:00
|
|
|
obj = double('object')
|
2014-01-07 13:35:51 -05:00
|
|
|
expect(obj).to receive(:test)
|
2008-02-21 10:46:06 -05:00
|
|
|
|
|
|
|
st.perform(obj)
|
|
|
|
end
|
|
|
|
end
|
2010-10-01 13:33:35 -04:00
|
|
|
|
2013-02-21 22:02:40 -05:00
|
|
|
describe AASM::Transition, '- when executing the transition with a Proc' do
|
2010-10-01 13:33:35 -04:00
|
|
|
it 'should call a Proc on the object with args' do
|
|
|
|
opts = {:from => 'foo', :to => 'bar', :on_transition => Proc.new {|o| o.test}}
|
2013-02-21 22:02:40 -05:00
|
|
|
st = AASM::Transition.new(opts)
|
2010-10-01 13:33:35 -04:00
|
|
|
args = {:arg1 => '1', :arg2 => '2'}
|
2013-11-15 05:19:26 -05:00
|
|
|
obj = double('object')
|
2010-10-01 13:33:35 -04:00
|
|
|
|
2014-01-07 13:35:51 -05:00
|
|
|
expect(opts[:on_transition]).to receive(:call).with(any_args)
|
2010-10-01 13:33:35 -04:00
|
|
|
|
|
|
|
st.execute(obj, args)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should call a Proc on the object without args' do
|
|
|
|
opts = {:from => 'foo', :to => 'bar', :on_transition => Proc.new {||}}
|
2013-02-21 22:02:40 -05:00
|
|
|
st = AASM::Transition.new(opts)
|
2010-10-01 13:33:35 -04:00
|
|
|
args = {:arg1 => '1', :arg2 => '2'}
|
2013-11-15 05:19:26 -05:00
|
|
|
obj = double('object')
|
2010-10-01 13:33:35 -04:00
|
|
|
|
2014-01-07 13:35:51 -05:00
|
|
|
expect(opts[:on_transition]).to receive(:call).with(no_args)
|
2010-10-01 13:33:35 -04:00
|
|
|
|
|
|
|
st.execute(obj, args)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-02-21 22:02:40 -05:00
|
|
|
describe AASM::Transition, '- when executing the transition with an :on_transtion method call' do
|
2010-10-01 13:33:35 -04:00
|
|
|
it 'should accept a String for the method name' do
|
|
|
|
opts = {:from => 'foo', :to => 'bar', :on_transition => 'test'}
|
2013-02-21 22:02:40 -05:00
|
|
|
st = AASM::Transition.new(opts)
|
2010-10-01 13:33:35 -04:00
|
|
|
args = {:arg1 => '1', :arg2 => '2'}
|
2013-11-15 05:19:26 -05:00
|
|
|
obj = double('object')
|
2010-10-01 13:33:35 -04:00
|
|
|
|
2014-01-07 13:35:51 -05:00
|
|
|
expect(obj).to receive(:test)
|
2010-10-01 13:33:35 -04:00
|
|
|
|
2011-11-26 14:49:46 -05:00
|
|
|
st.execute(obj, args)
|
2010-10-01 13:33:35 -04:00
|
|
|
end
|
2011-11-26 14:49:46 -05:00
|
|
|
|
2010-10-01 13:33:35 -04:00
|
|
|
it 'should accept a Symbol for the method name' do
|
|
|
|
opts = {:from => 'foo', :to => 'bar', :on_transition => :test}
|
2013-02-21 22:02:40 -05:00
|
|
|
st = AASM::Transition.new(opts)
|
2010-10-01 13:33:35 -04:00
|
|
|
args = {:arg1 => '1', :arg2 => '2'}
|
2013-11-15 05:19:26 -05:00
|
|
|
obj = double('object')
|
2010-10-01 13:33:35 -04:00
|
|
|
|
2014-01-07 13:35:51 -05:00
|
|
|
expect(obj).to receive(:test)
|
2010-10-01 13:33:35 -04:00
|
|
|
|
2011-11-26 14:49:46 -05:00
|
|
|
st.execute(obj, args)
|
2010-10-01 13:33:35 -04:00
|
|
|
end
|
2011-11-26 14:49:46 -05:00
|
|
|
|
2010-10-01 13:33:35 -04:00
|
|
|
it 'should pass args if the target method accepts them' do
|
|
|
|
opts = {:from => 'foo', :to => 'bar', :on_transition => :test}
|
2013-02-21 22:02:40 -05:00
|
|
|
st = AASM::Transition.new(opts)
|
2010-10-01 13:33:35 -04:00
|
|
|
args = {:arg1 => '1', :arg2 => '2'}
|
2013-11-15 05:19:26 -05:00
|
|
|
obj = double('object')
|
2010-10-01 13:33:35 -04:00
|
|
|
|
2013-11-20 18:18:35 -05:00
|
|
|
def obj.test(args)
|
|
|
|
"arg1: #{args[:arg1]} arg2: #{args[:arg2]}"
|
2010-10-01 13:33:35 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
return_value = st.execute(obj, args)
|
|
|
|
|
2014-01-07 13:35:51 -05:00
|
|
|
expect(return_value).to eq('arg1: 1 arg2: 2')
|
2010-10-01 13:33:35 -04:00
|
|
|
end
|
2011-11-26 14:49:46 -05:00
|
|
|
|
2010-10-01 13:33:35 -04:00
|
|
|
it 'should NOT pass args if the target method does NOT accept them' do
|
|
|
|
opts = {:from => 'foo', :to => 'bar', :on_transition => :test}
|
2013-02-21 22:02:40 -05:00
|
|
|
st = AASM::Transition.new(opts)
|
2010-10-01 13:33:35 -04:00
|
|
|
args = {:arg1 => '1', :arg2 => '2'}
|
2013-11-15 05:19:26 -05:00
|
|
|
obj = double('object')
|
2010-10-01 13:33:35 -04:00
|
|
|
|
2013-11-20 18:18:35 -05:00
|
|
|
def obj.test
|
|
|
|
'success'
|
2010-10-01 13:33:35 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
return_value = st.execute(obj, args)
|
|
|
|
|
2014-01-07 13:35:51 -05:00
|
|
|
expect(return_value).to eq('success')
|
2010-10-01 13:33:35 -04:00
|
|
|
end
|
2011-11-26 14:49:46 -05:00
|
|
|
|
2010-10-01 13:33:35 -04:00
|
|
|
end
|