mirror of
https://github.com/aasm/aasm
synced 2023-03-27 23:22:41 -04:00
support RSpec match transition_from
This commit is contained in:
parent
2377cbfd8a
commit
9e9f3d0a76
6 changed files with 76 additions and 20 deletions
|
@ -1,5 +1,9 @@
|
||||||
# CHANGELOG
|
# CHANGELOG
|
||||||
|
|
||||||
|
## unreleased
|
||||||
|
|
||||||
|
* add RSpec matcher `transition_from` (see [issue #178](https://github.com/aasm/aasm/issues/178) for details, thanks to [@thomasstephane](https://github.com/thomasstephane))
|
||||||
|
|
||||||
## 4.4.1
|
## 4.4.1
|
||||||
|
|
||||||
* add support for rejecting certain events on inspection (see [issue #272](https://github.com/aasm/aasm/issues/272) for details, thanks to [@dubroe](https://github.com/dubroe))
|
* add support for rejecting certain events on inspection (see [issue #272](https://github.com/aasm/aasm/issues/272) for details, thanks to [@dubroe](https://github.com/dubroe))
|
||||||
|
|
33
README.md
33
README.md
|
@ -723,28 +723,21 @@ Job.aasm.states_for_select
|
||||||
|
|
||||||
### Testing
|
### Testing
|
||||||
|
|
||||||
AASM provides matchers for [RSpec](http://rspec.info).
|
AASM provides some matchers for [RSpec](http://rspec.info). Add `require 'aasm/rspec'` to your `spec_helper.rb` file and use them like this
|
||||||
|
|
||||||
job = Job.new
|
```ruby
|
||||||
job.should have_state :sleeping
|
# classes with only the default state machine
|
||||||
job.should allow_transition_to :running
|
job = Job.new
|
||||||
job.should allow_event :run
|
expect(job).to transition_from(:sleeping).to(:running).on_event(:run)
|
||||||
job.should allow_event :run!
|
expect(job).not_to transition_from(:sleeping).to(:cleaning).on_event(:run)
|
||||||
job.should_not allow_event :clean
|
|
||||||
job.should_not allow_event :clean!
|
|
||||||
|
|
||||||
simple = SimpleMultipleExample.new
|
|
||||||
simple.should have_state :standing, :on => :move
|
|
||||||
simple.should allow_transition_to :walking, :on => :move
|
|
||||||
simple.should allow_event :run
|
|
||||||
simple.should allow_event :run!
|
|
||||||
simple.should have_state :sleeping, :on => :work
|
|
||||||
simple.should allow_transition_to :processing, :on => :work
|
|
||||||
simple.should allow_event :start
|
|
||||||
simple.should allow_event :start!
|
|
||||||
simple.should_not allow_event :stop
|
|
||||||
simple.should_not allow_event :stop!
|
|
||||||
|
|
||||||
|
# classes with multiple state machine
|
||||||
|
multiple = SimpleMultipleExample.new
|
||||||
|
expect(multiple).to transition_from(:standing).to(:walking).on_event(:walk).on(:move)
|
||||||
|
expect(multiple).to_not transition_from(:standing).to(:running).on_event(:walk).on(:move)
|
||||||
|
expect(multiple).to transition_from(:sleeping).to(:processing).on_event(:start).on(:work)
|
||||||
|
expect(multiple).to_not transition_from(:sleeping).to(:sleeping).on_event(:start).on(:work)
|
||||||
|
```
|
||||||
|
|
||||||
## <a id="installation">Installation ##
|
## <a id="installation">Installation ##
|
||||||
|
|
||||||
|
|
5
lib/aasm/rspec.rb
Normal file
5
lib/aasm/rspec.rb
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# relative-require all rspec files
|
||||||
|
Dir[File.dirname(__FILE__) + '/rspec/*.rb'].each do |file|
|
||||||
|
require 'aasm/rspec/' + File.basename(file, File.extname(file))
|
||||||
|
end
|
||||||
|
|
32
lib/aasm/rspec/transition_from.rb
Normal file
32
lib/aasm/rspec/transition_from.rb
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
RSpec::Matchers.define :transition_from do |from_state|
|
||||||
|
match do |obj|
|
||||||
|
@state_machine_name ||= :default
|
||||||
|
obj.aasm(@state_machine_name).current_state = from_state.to_sym
|
||||||
|
# expect(obj).to receive(:broadcast_event).with(@event.to_s, obj, from_state, @to_state)
|
||||||
|
obj.send(@event) && obj.aasm(@state_machine_name).current_state == @to_state.to_sym
|
||||||
|
end
|
||||||
|
|
||||||
|
chain :on do |state_machine_name|
|
||||||
|
@state_machine_name = state_machine_name
|
||||||
|
end
|
||||||
|
|
||||||
|
chain :to do |state|
|
||||||
|
@to_state = state
|
||||||
|
end
|
||||||
|
|
||||||
|
chain :on_event do |event|
|
||||||
|
@event = event
|
||||||
|
end
|
||||||
|
|
||||||
|
description do
|
||||||
|
"transition state to :#{@to_state} from :#{expected} on event :#{@event} (on :#{@state_machine_name})"
|
||||||
|
end
|
||||||
|
|
||||||
|
failure_message do |obj|
|
||||||
|
"expected that :#{obj.aasm(@state_machine_name).current_state} would be :#{@to_state} (on :#{@state_machine_name})"
|
||||||
|
end
|
||||||
|
|
||||||
|
failure_message_when_negated do |obj|
|
||||||
|
"expected that :#{obj.aasm(@state_machine_name).current_state} would not be :#{@to_state} (on :#{@state_machine_name})"
|
||||||
|
end
|
||||||
|
end
|
|
@ -2,6 +2,7 @@ $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__)))
|
||||||
$LOAD_PATH.unshift(File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')))
|
$LOAD_PATH.unshift(File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')))
|
||||||
require 'aasm'
|
require 'aasm'
|
||||||
require 'rspec'
|
require 'rspec'
|
||||||
|
require 'aasm/rspec'
|
||||||
|
|
||||||
# require 'ruby-debug'; Debugger.settings[:autoeval] = true; debugger; rubys_debugger = 'annoying'
|
# require 'ruby-debug'; Debugger.settings[:autoeval] = true; debugger; rubys_debugger = 'annoying'
|
||||||
# require 'ruby-debug/completion'
|
# require 'ruby-debug/completion'
|
||||||
|
|
21
spec/unit/rspec_matcher_spec.rb
Normal file
21
spec/unit/rspec_matcher_spec.rb
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe 'state machine' do
|
||||||
|
let(:simple) { SimpleExample.new }
|
||||||
|
let(:multiple) { SimpleMultipleExample.new }
|
||||||
|
|
||||||
|
describe 'transition_from' do
|
||||||
|
it "works for simple state machines" do
|
||||||
|
expect(simple).to transition_from(:initialised).to(:filled_out).on_event(:fill_out)
|
||||||
|
expect(simple).to_not transition_from(:initialised).to(:authorised).on_event(:fill_out)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "works for multiple state machines" do
|
||||||
|
expect(multiple).to transition_from(:standing).to(:walking).on_event(:walk).on(:move)
|
||||||
|
expect(multiple).to_not transition_from(:standing).to(:running).on_event(:walk).on(:move)
|
||||||
|
|
||||||
|
expect(multiple).to transition_from(:sleeping).to(:processing).on_event(:start).on(:work)
|
||||||
|
expect(multiple).to_not transition_from(:sleeping).to(:sleeping).on_event(:start).on(:work)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue