Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added tests for calling the failure and success callbacks
This uncovered some bug not firering the event_failed callback in any case of an exception has been raised. This is now handled. The exception is just re-raised if the record doesn't have defined a event_failed callback. If he had it is up to the implementation to handle the execption. We are just return false.
- Loading branch information
1 parent
9bc17b1
commit e0b886b
Showing
2 changed files
with
78 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
require 'helper' | ||
|
||
class DrivingInstructor | ||
def self.applause! | ||
end | ||
end | ||
|
||
class DrivingSchoolCar | ||
include Transitions | ||
|
||
state_machine do | ||
state :parked | ||
state :running | ||
state :driving | ||
state :switched_off | ||
|
||
event :start_driving, :success => lambda { |car| DrivingInstructor.applause! } do | ||
transitions :from => :parked, :to => :driving, :on_transition => [:start_engine, :loosen_handbrake, :push_gas_pedal] | ||
end | ||
|
||
event :switch_off_engine do | ||
transitions :from => :parked, :to => :switched_off | ||
end | ||
end | ||
|
||
%w!start_engine loosen_handbrake push_gas_pedal!.each do |m| | ||
define_method(m){} | ||
end | ||
end | ||
|
||
class TestStateTransitionSuccessCallback < Test::Unit::TestCase | ||
def setup | ||
@car = DrivingSchoolCar.new | ||
end | ||
|
||
test "should execute the success callback after successfull event execution" do | ||
DrivingInstructor.expects(:applause!) | ||
|
||
@car.start_driving! | ||
end | ||
|
||
test "should not execute the success callback after event execution failed" do | ||
DrivingInstructor.expects(:applause!).never | ||
|
||
@car.stubs(:event_failed) | ||
@car.expects(:loosen_handbrake).raises("Drive with handbrake fail!") | ||
@car.start_driving! | ||
end | ||
|
||
test "should execute the event_failed_callback and don't raise error if callback is defined" do | ||
@car.start_driving | ||
@car.expects(:event_failed).with(:switch_off_engine) | ||
@car.switch_off_engine | ||
end | ||
|
||
test "should just re-raise any error on transition if the event_failed_callback isn't defined" do | ||
@car.start_driving | ||
assert_raise(Transitions::InvalidTransition) { @car.switch_off_engine } | ||
end | ||
end |