mirror of
https://github.com/aasm/aasm
synced 2023-03-27 23:22:41 -04:00
refactored test for complex example
This commit is contained in:
parent
547b9c30c4
commit
50e335be05
4 changed files with 159 additions and 168 deletions
84
spec/models/auth_machine.rb
Normal file
84
spec/models/auth_machine.rb
Normal file
|
@ -0,0 +1,84 @@
|
|||
class AuthMachine
|
||||
include AASM
|
||||
|
||||
attr_accessor :activation_code, :activated_at, :deleted_at
|
||||
|
||||
aasm do
|
||||
state :passive
|
||||
state :pending, :initial => true, :enter => :make_activation_code
|
||||
state :active, :enter => :do_activate
|
||||
state :suspended
|
||||
state :deleted, :enter => :do_delete, :exit => :do_undelete
|
||||
state :waiting
|
||||
|
||||
event :register do
|
||||
transitions :from => :passive, :to => :pending, :guard => Proc.new {|u| u.can_register? }
|
||||
end
|
||||
|
||||
event :activate do
|
||||
transitions :from => :pending, :to => :active
|
||||
end
|
||||
|
||||
event :suspend do
|
||||
transitions :from => [:passive, :pending, :active], :to => :suspended
|
||||
end
|
||||
|
||||
event :delete do
|
||||
transitions :from => [:passive, :pending, :active, :suspended], :to => :deleted
|
||||
end
|
||||
|
||||
# a dummy event that can never happen
|
||||
event :unpassify do
|
||||
transitions :from => :passive, :to => :active, :guard => Proc.new {|u| false }
|
||||
end
|
||||
|
||||
event :unsuspend do
|
||||
transitions :from => :suspended, :to => :active, :guard => Proc.new {|u| u.has_activated? }
|
||||
transitions :from => :suspended, :to => :pending, :guard => Proc.new {|u| u.has_activation_code? }
|
||||
transitions :from => :suspended, :to => :passive
|
||||
end
|
||||
|
||||
event :wait do
|
||||
transitions :from => :suspended, :to => :waiting, :guard => :if_polite?
|
||||
end
|
||||
end
|
||||
|
||||
def initialize
|
||||
# the AR backend uses a before_validate_on_create :aasm_ensure_initial_state
|
||||
# lets do something similar here for testing purposes.
|
||||
aasm_enter_initial_state
|
||||
end
|
||||
|
||||
def make_activation_code
|
||||
@activation_code = 'moo'
|
||||
end
|
||||
|
||||
def do_activate
|
||||
@activated_at = Time.now
|
||||
@activation_code = nil
|
||||
end
|
||||
|
||||
def do_delete
|
||||
@deleted_at = Time.now
|
||||
end
|
||||
|
||||
def do_undelete
|
||||
@deleted_at = false
|
||||
end
|
||||
|
||||
def can_register?
|
||||
true
|
||||
end
|
||||
|
||||
def has_activated?
|
||||
!!@activated_at
|
||||
end
|
||||
|
||||
def has_activation_code?
|
||||
!!@activation_code
|
||||
end
|
||||
|
||||
def if_polite?(phrase = nil)
|
||||
phrase == :please
|
||||
end
|
||||
end
|
|
@ -76,91 +76,6 @@ class Argument
|
|||
end
|
||||
end
|
||||
|
||||
class AuthMachine
|
||||
include AASM
|
||||
|
||||
attr_accessor :activation_code, :activated_at, :deleted_at
|
||||
|
||||
aasm do
|
||||
state :passive
|
||||
state :pending, :initial => true, :enter => :make_activation_code
|
||||
state :active, :enter => :do_activate
|
||||
state :suspended
|
||||
state :deleted, :enter => :do_delete, :exit => :do_undelete
|
||||
state :waiting
|
||||
|
||||
event :register do
|
||||
transitions :from => :passive, :to => :pending, :guard => Proc.new {|u| u.can_register? }
|
||||
end
|
||||
|
||||
event :activate do
|
||||
transitions :from => :pending, :to => :active
|
||||
end
|
||||
|
||||
event :suspend do
|
||||
transitions :from => [:passive, :pending, :active], :to => :suspended
|
||||
end
|
||||
|
||||
event :delete do
|
||||
transitions :from => [:passive, :pending, :active, :suspended], :to => :deleted
|
||||
end
|
||||
|
||||
# a dummy event that can never happen
|
||||
event :unpassify do
|
||||
transitions :from => :passive, :to => :active, :guard => Proc.new {|u| false }
|
||||
end
|
||||
|
||||
event :unsuspend do
|
||||
transitions :from => :suspended, :to => :active, :guard => Proc.new {|u| u.has_activated? }
|
||||
transitions :from => :suspended, :to => :pending, :guard => Proc.new {|u| u.has_activation_code? }
|
||||
transitions :from => :suspended, :to => :passive
|
||||
end
|
||||
|
||||
event :wait do
|
||||
transitions :from => :suspended, :to => :waiting, :guard => :if_polite?
|
||||
end
|
||||
end
|
||||
|
||||
def initialize
|
||||
# the AR backend uses a before_validate_on_create :aasm_ensure_initial_state
|
||||
# lets do something similar here for testing purposes.
|
||||
aasm_enter_initial_state
|
||||
end
|
||||
|
||||
def make_activation_code
|
||||
@activation_code = 'moo'
|
||||
end
|
||||
|
||||
def do_activate
|
||||
@activated_at = Time.now
|
||||
@activation_code = nil
|
||||
end
|
||||
|
||||
def do_delete
|
||||
@deleted_at = Time.now
|
||||
end
|
||||
|
||||
def do_undelete
|
||||
@deleted_at = false
|
||||
end
|
||||
|
||||
def can_register?
|
||||
true
|
||||
end
|
||||
|
||||
def has_activated?
|
||||
!!@activated_at
|
||||
end
|
||||
|
||||
def has_activation_code?
|
||||
!!@activation_code
|
||||
end
|
||||
|
||||
def if_polite?(phrase = nil)
|
||||
phrase == :please
|
||||
end
|
||||
end
|
||||
|
||||
class ThisNameBetterNotBeInUse
|
||||
include AASM
|
||||
|
||||
|
|
|
@ -1,83 +0,0 @@
|
|||
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
||||
|
||||
describe 'AuthMachine on initialization' do
|
||||
before(:each) do
|
||||
@auth = AuthMachine.new
|
||||
end
|
||||
|
||||
it 'should be in the pending state' do
|
||||
@auth.aasm_current_state.should == :pending
|
||||
end
|
||||
|
||||
it 'should have an activation code' do
|
||||
@auth.has_activation_code?.should be_true
|
||||
@auth.activation_code.should_not be_nil
|
||||
end
|
||||
end
|
||||
|
||||
describe 'AuthMachine when being unsuspended' do
|
||||
it 'should be able to be unsuspended' do
|
||||
@auth = AuthMachine.new
|
||||
@auth.activate!
|
||||
@auth.suspend!
|
||||
@auth.may_unsuspend?.should be_true
|
||||
end
|
||||
|
||||
it 'should not be able to be unsuspended into active' do
|
||||
@auth = AuthMachine.new
|
||||
@auth.suspend!
|
||||
@auth.may_unsuspend?(:active).should_not be_true
|
||||
end
|
||||
|
||||
it 'should be able to be unsuspended into active if polite' do
|
||||
@auth = AuthMachine.new
|
||||
@auth.suspend!
|
||||
@auth.may_wait?(:waiting, :please).should be_true
|
||||
@auth.wait!(nil, :please)
|
||||
end
|
||||
|
||||
it 'should not be able to be unsuspended into active if not polite' do
|
||||
@auth = AuthMachine.new
|
||||
@auth.suspend!
|
||||
@auth.may_wait?(:waiting).should_not be_true
|
||||
@auth.may_wait?(:waiting, :rude).should_not be_true
|
||||
lambda {@auth.wait!(nil, :rude)}.should raise_error(AASM::InvalidTransition)
|
||||
lambda {@auth.wait!}.should raise_error(AASM::InvalidTransition)
|
||||
end
|
||||
|
||||
it 'should not be able to be unpassified' do
|
||||
@auth = AuthMachine.new
|
||||
@auth.activate!
|
||||
@auth.suspend!
|
||||
@auth.unsuspend!
|
||||
|
||||
@auth.may_unpassify?.should_not be_true
|
||||
lambda {@auth.unpassify!}.should raise_error(AASM::InvalidTransition)
|
||||
end
|
||||
|
||||
it 'should be active if previously activated' do
|
||||
@auth = AuthMachine.new
|
||||
@auth.activate!
|
||||
@auth.suspend!
|
||||
@auth.unsuspend!
|
||||
|
||||
@auth.aasm_current_state.should == :active
|
||||
end
|
||||
|
||||
it 'should be pending if not previously activated, but an activation code is present' do
|
||||
@auth = AuthMachine.new
|
||||
@auth.suspend!
|
||||
@auth.unsuspend!
|
||||
|
||||
@auth.aasm_current_state.should == :pending
|
||||
end
|
||||
|
||||
it 'should be passive if not previously activated and there is no activation code' do
|
||||
@auth = AuthMachine.new
|
||||
@auth.activation_code = nil
|
||||
@auth.suspend!
|
||||
@auth.unsuspend!
|
||||
|
||||
@auth.aasm_current_state.should == :passive
|
||||
end
|
||||
end
|
75
spec/unit/complex_example_spec.rb
Normal file
75
spec/unit/complex_example_spec.rb
Normal file
|
@ -0,0 +1,75 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe 'AuthMachine on initialization' do
|
||||
let(:auth) {AuthMachine.new}
|
||||
|
||||
it 'should be in the pending state' do
|
||||
auth.aasm_current_state.should == :pending
|
||||
end
|
||||
|
||||
it 'should have an activation code' do
|
||||
auth.has_activation_code?.should be_true
|
||||
auth.activation_code.should_not be_nil
|
||||
end
|
||||
end
|
||||
|
||||
describe 'AuthMachine when being unsuspended' do
|
||||
let(:auth) {AuthMachine.new}
|
||||
|
||||
it 'should be able to be unsuspended' do
|
||||
auth.activate!
|
||||
auth.suspend!
|
||||
auth.may_unsuspend?.should be_true
|
||||
end
|
||||
|
||||
it 'should not be able to be unsuspended into active' do
|
||||
auth.suspend!
|
||||
auth.may_unsuspend?(:active).should_not be_true
|
||||
end
|
||||
|
||||
it 'should be able to be unsuspended into active if polite' do
|
||||
auth.suspend!
|
||||
auth.may_wait?(:waiting, :please).should be_true
|
||||
auth.wait!(nil, :please)
|
||||
end
|
||||
|
||||
it 'should not be able to be unsuspended into active if not polite' do
|
||||
auth.suspend!
|
||||
auth.may_wait?(:waiting).should_not be_true
|
||||
auth.may_wait?(:waiting, :rude).should_not be_true
|
||||
lambda {auth.wait!(nil, :rude)}.should raise_error(AASM::InvalidTransition)
|
||||
lambda {auth.wait!}.should raise_error(AASM::InvalidTransition)
|
||||
end
|
||||
|
||||
it 'should not be able to be unpassified' do
|
||||
auth.activate!
|
||||
auth.suspend!
|
||||
auth.unsuspend!
|
||||
|
||||
auth.may_unpassify?.should_not be_true
|
||||
lambda {auth.unpassify!}.should raise_error(AASM::InvalidTransition)
|
||||
end
|
||||
|
||||
it 'should be active if previously activated' do
|
||||
auth.activate!
|
||||
auth.suspend!
|
||||
auth.unsuspend!
|
||||
|
||||
auth.aasm_current_state.should == :active
|
||||
end
|
||||
|
||||
it 'should be pending if not previously activated, but an activation code is present' do
|
||||
auth.suspend!
|
||||
auth.unsuspend!
|
||||
|
||||
auth.aasm_current_state.should == :pending
|
||||
end
|
||||
|
||||
it 'should be passive if not previously activated and there is no activation code' do
|
||||
auth.activation_code = nil
|
||||
auth.suspend!
|
||||
auth.unsuspend!
|
||||
|
||||
auth.aasm_current_state.should == :passive
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue