aasm 5.0.0 → 5.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/README.md +243 -118
- data/lib/aasm/aasm.rb +29 -27
- data/lib/aasm/base.rb +61 -11
- data/lib/aasm/configuration.rb +3 -0
- data/lib/aasm/core/event.rb +21 -9
- data/lib/aasm/core/invokers/class_invoker.rb +1 -1
- data/lib/aasm/core/invokers/literal_invoker.rb +3 -1
- data/lib/aasm/core/state.rb +6 -5
- data/lib/aasm/core/transition.rb +1 -1
- data/lib/aasm/dsl_helper.rb +24 -22
- data/lib/aasm/errors.rb +3 -1
- data/lib/aasm/instance_base.rb +28 -5
- data/lib/aasm/localizer.rb +13 -3
- data/lib/aasm/persistence/active_record_persistence.rb +25 -5
- data/lib/aasm/persistence/base.rb +14 -3
- data/lib/aasm/persistence/core_data_query_persistence.rb +2 -1
- data/lib/aasm/persistence/dynamoid_persistence.rb +1 -1
- data/lib/aasm/persistence/mongoid_persistence.rb +1 -1
- data/lib/aasm/persistence/no_brainer_persistence.rb +1 -1
- data/lib/aasm/persistence/orm.rb +23 -19
- data/lib/aasm/persistence/redis_persistence.rb +1 -1
- data/lib/aasm/rspec/transition_from.rb +5 -1
- data/lib/aasm/version.rb +1 -1
- data/lib/aasm.rb +0 -2
- data/lib/generators/aasm/orm_helpers.rb +7 -1
- data/lib/generators/active_record/aasm_generator.rb +3 -1
- data/lib/generators/active_record/templates/migration.rb +1 -1
- metadata +35 -385
- data/.document +0 -6
- data/.gitignore +0 -20
- data/.travis.yml +0 -54
- data/API +0 -34
- data/Appraisals +0 -66
- data/CHANGELOG.md +0 -377
- data/CODE_OF_CONDUCT.md +0 -13
- data/CONTRIBUTING.md +0 -24
- data/Dockerfile +0 -44
- data/Gemfile +0 -6
- data/Gemfile.lock_old +0 -151
- data/HOWTO +0 -12
- data/PLANNED_CHANGES.md +0 -11
- data/README_FROM_VERSION_3_TO_4.md +0 -240
- data/Rakefile +0 -31
- data/TESTING.md +0 -25
- data/aasm.gemspec +0 -35
- data/callbacks.txt +0 -51
- data/docker-compose.yml +0 -40
- data/gemfiles/rails_3.2.gemfile +0 -13
- data/gemfiles/rails_4.0.gemfile +0 -15
- data/gemfiles/rails_4.2.gemfile +0 -16
- data/gemfiles/rails_4.2_mongoid_5.gemfile +0 -11
- data/gemfiles/rails_4.2_nobrainer.gemfile +0 -9
- data/gemfiles/rails_5.0.gemfile +0 -13
- data/gemfiles/rails_5.0_nobrainer.gemfile +0 -9
- data/gemfiles/rails_5.1.gemfile +0 -13
- data/spec/database.rb +0 -44
- data/spec/database.yml +0 -3
- data/spec/en.yml +0 -12
- data/spec/en_deprecated_style.yml +0 -10
- data/spec/generators/active_record_generator_spec.rb +0 -47
- data/spec/generators/mongoid_generator_spec.rb +0 -31
- data/spec/generators/no_brainer_generator_spec.rb +0 -29
- data/spec/models/active_record/basic_active_record_two_state_machines_example.rb +0 -25
- data/spec/models/active_record/complex_active_record_example.rb +0 -37
- data/spec/models/active_record/derivate_new_dsl.rb +0 -7
- data/spec/models/active_record/false_state.rb +0 -35
- data/spec/models/active_record/gate.rb +0 -39
- data/spec/models/active_record/invalid_persistor.rb +0 -29
- data/spec/models/active_record/localizer_test_model.rb +0 -34
- data/spec/models/active_record/no_direct_assignment.rb +0 -21
- data/spec/models/active_record/no_scope.rb +0 -21
- data/spec/models/active_record/persisted_state.rb +0 -12
- data/spec/models/active_record/provided_and_persisted_state.rb +0 -24
- data/spec/models/active_record/reader.rb +0 -7
- data/spec/models/active_record/readme_job.rb +0 -21
- data/spec/models/active_record/silent_persistor.rb +0 -29
- data/spec/models/active_record/simple_new_dsl.rb +0 -17
- data/spec/models/active_record/thief.rb +0 -29
- data/spec/models/active_record/transactor.rb +0 -124
- data/spec/models/active_record/transient.rb +0 -6
- data/spec/models/active_record/validator.rb +0 -118
- data/spec/models/active_record/with_enum.rb +0 -39
- data/spec/models/active_record/with_enum_without_column.rb +0 -38
- data/spec/models/active_record/with_false_enum.rb +0 -31
- data/spec/models/active_record/with_true_enum.rb +0 -39
- data/spec/models/active_record/worker.rb +0 -2
- data/spec/models/active_record/writer.rb +0 -6
- data/spec/models/basic_two_state_machines_example.rb +0 -25
- data/spec/models/callbacks/basic.rb +0 -98
- data/spec/models/callbacks/basic_multiple.rb +0 -75
- data/spec/models/callbacks/guard_within_block.rb +0 -67
- data/spec/models/callbacks/guard_within_block_multiple.rb +0 -66
- data/spec/models/callbacks/multiple_transitions_transition_guard.rb +0 -66
- data/spec/models/callbacks/multiple_transitions_transition_guard_multiple.rb +0 -65
- data/spec/models/callbacks/private_method.rb +0 -44
- data/spec/models/callbacks/private_method_multiple.rb +0 -44
- data/spec/models/callbacks/with_args.rb +0 -62
- data/spec/models/callbacks/with_args_multiple.rb +0 -61
- data/spec/models/callbacks/with_state_arg.rb +0 -30
- data/spec/models/callbacks/with_state_arg_multiple.rb +0 -26
- data/spec/models/complex_example.rb +0 -222
- data/spec/models/conversation.rb +0 -93
- data/spec/models/default_state.rb +0 -12
- data/spec/models/double_definer.rb +0 -21
- data/spec/models/dynamoid/complex_dynamoid_example.rb +0 -37
- data/spec/models/dynamoid/dynamoid_multiple.rb +0 -18
- data/spec/models/dynamoid/dynamoid_simple.rb +0 -18
- data/spec/models/foo.rb +0 -106
- data/spec/models/foo_callback_multiple.rb +0 -45
- data/spec/models/guard_arguments_check.rb +0 -17
- data/spec/models/guard_with_params.rb +0 -24
- data/spec/models/guard_with_params_multiple.rb +0 -18
- data/spec/models/guardian.rb +0 -58
- data/spec/models/guardian_multiple.rb +0 -48
- data/spec/models/guardian_without_from_specified.rb +0 -18
- data/spec/models/initial_state_proc.rb +0 -31
- data/spec/models/mongoid/complex_mongoid_example.rb +0 -37
- data/spec/models/mongoid/invalid_persistor_mongoid.rb +0 -39
- data/spec/models/mongoid/mongoid_relationships.rb +0 -26
- data/spec/models/mongoid/no_scope_mongoid.rb +0 -21
- data/spec/models/mongoid/silent_persistor_mongoid.rb +0 -39
- data/spec/models/mongoid/simple_mongoid.rb +0 -23
- data/spec/models/mongoid/simple_new_dsl_mongoid.rb +0 -25
- data/spec/models/mongoid/validator_mongoid.rb +0 -100
- data/spec/models/multi_transitioner.rb +0 -34
- data/spec/models/multiple_transitions_that_differ_only_by_guard.rb +0 -31
- data/spec/models/namespaced_multiple_example.rb +0 -42
- data/spec/models/no_initial_state.rb +0 -25
- data/spec/models/nobrainer/complex_no_brainer_example.rb +0 -36
- data/spec/models/nobrainer/invalid_persistor_no_brainer.rb +0 -39
- data/spec/models/nobrainer/no_scope_no_brainer.rb +0 -21
- data/spec/models/nobrainer/nobrainer_relationships.rb +0 -25
- data/spec/models/nobrainer/silent_persistor_no_brainer.rb +0 -39
- data/spec/models/nobrainer/simple_new_dsl_nobrainer.rb +0 -25
- data/spec/models/nobrainer/simple_no_brainer.rb +0 -23
- data/spec/models/nobrainer/validator_no_brainer.rb +0 -98
- data/spec/models/not_auto_loaded/process.rb +0 -21
- data/spec/models/parametrised_event.rb +0 -42
- data/spec/models/parametrised_event_multiple.rb +0 -29
- data/spec/models/process_with_new_dsl.rb +0 -31
- data/spec/models/provided_state.rb +0 -24
- data/spec/models/redis/complex_redis_example.rb +0 -40
- data/spec/models/redis/redis_multiple.rb +0 -20
- data/spec/models/redis/redis_simple.rb +0 -20
- data/spec/models/sequel/complex_sequel_example.rb +0 -46
- data/spec/models/sequel/invalid_persistor.rb +0 -52
- data/spec/models/sequel/sequel_multiple.rb +0 -25
- data/spec/models/sequel/sequel_simple.rb +0 -26
- data/spec/models/sequel/silent_persistor.rb +0 -50
- data/spec/models/sequel/transactor.rb +0 -112
- data/spec/models/sequel/validator.rb +0 -93
- data/spec/models/sequel/worker.rb +0 -12
- data/spec/models/silencer.rb +0 -27
- data/spec/models/simple_custom_example.rb +0 -53
- data/spec/models/simple_example.rb +0 -17
- data/spec/models/simple_example_with_guard_args.rb +0 -17
- data/spec/models/simple_multiple_example.rb +0 -42
- data/spec/models/state_machine_with_failed_event.rb +0 -20
- data/spec/models/states_on_one_line_example.rb +0 -8
- data/spec/models/sub_class.rb +0 -41
- data/spec/models/sub_class_with_more_states.rb +0 -18
- data/spec/models/sub_classing.rb +0 -3
- data/spec/models/super_class.rb +0 -46
- data/spec/models/this_name_better_not_be_in_use.rb +0 -11
- data/spec/models/valid_state_name.rb +0 -23
- data/spec/spec_helper.rb +0 -26
- data/spec/spec_helpers/active_record.rb +0 -8
- data/spec/spec_helpers/dynamoid.rb +0 -35
- data/spec/spec_helpers/mongoid.rb +0 -26
- data/spec/spec_helpers/nobrainer.rb +0 -15
- data/spec/spec_helpers/redis.rb +0 -18
- data/spec/spec_helpers/remove_warnings.rb +0 -1
- data/spec/spec_helpers/sequel.rb +0 -7
- data/spec/unit/api_spec.rb +0 -100
- data/spec/unit/basic_two_state_machines_example_spec.rb +0 -10
- data/spec/unit/callback_multiple_spec.rb +0 -300
- data/spec/unit/callbacks_spec.rb +0 -491
- data/spec/unit/complex_example_spec.rb +0 -94
- data/spec/unit/complex_multiple_example_spec.rb +0 -115
- data/spec/unit/edge_cases_spec.rb +0 -16
- data/spec/unit/event_multiple_spec.rb +0 -73
- data/spec/unit/event_naming_spec.rb +0 -16
- data/spec/unit/event_spec.rb +0 -381
- data/spec/unit/exception_spec.rb +0 -11
- data/spec/unit/guard_arguments_check_spec.rb +0 -9
- data/spec/unit/guard_multiple_spec.rb +0 -60
- data/spec/unit/guard_spec.rb +0 -89
- data/spec/unit/guard_with_params_multiple_spec.rb +0 -10
- data/spec/unit/guard_with_params_spec.rb +0 -14
- data/spec/unit/guard_without_from_specified_spec.rb +0 -10
- data/spec/unit/initial_state_multiple_spec.rb +0 -15
- data/spec/unit/initial_state_spec.rb +0 -12
- data/spec/unit/inspection_multiple_spec.rb +0 -201
- data/spec/unit/inspection_spec.rb +0 -149
- data/spec/unit/invoker_spec.rb +0 -189
- data/spec/unit/invokers/base_invoker_spec.rb +0 -72
- data/spec/unit/invokers/class_invoker_spec.rb +0 -95
- data/spec/unit/invokers/literal_invoker_spec.rb +0 -86
- data/spec/unit/invokers/proc_invoker_spec.rb +0 -86
- data/spec/unit/localizer_spec.rb +0 -78
- data/spec/unit/memory_leak_spec.rb +0 -38
- data/spec/unit/multiple_transitions_that_differ_only_by_guard_spec.rb +0 -14
- data/spec/unit/namespaced_multiple_example_spec.rb +0 -75
- data/spec/unit/new_dsl_spec.rb +0 -12
- data/spec/unit/override_warning_spec.rb +0 -94
- data/spec/unit/persistence/active_record_persistence_multiple_spec.rb +0 -618
- data/spec/unit/persistence/active_record_persistence_spec.rb +0 -735
- data/spec/unit/persistence/dynamoid_persistence_multiple_spec.rb +0 -135
- data/spec/unit/persistence/dynamoid_persistence_spec.rb +0 -84
- data/spec/unit/persistence/mongoid_persistence_multiple_spec.rb +0 -200
- data/spec/unit/persistence/mongoid_persistence_spec.rb +0 -165
- data/spec/unit/persistence/no_brainer_persistence_multiple_spec.rb +0 -198
- data/spec/unit/persistence/no_brainer_persistence_spec.rb +0 -158
- data/spec/unit/persistence/redis_persistence_multiple_spec.rb +0 -88
- data/spec/unit/persistence/redis_persistence_spec.rb +0 -53
- data/spec/unit/persistence/sequel_persistence_multiple_spec.rb +0 -148
- data/spec/unit/persistence/sequel_persistence_spec.rb +0 -368
- data/spec/unit/readme_spec.rb +0 -41
- data/spec/unit/reloading_spec.rb +0 -15
- data/spec/unit/rspec_matcher_spec.rb +0 -85
- data/spec/unit/simple_custom_example_spec.rb +0 -39
- data/spec/unit/simple_example_spec.rb +0 -42
- data/spec/unit/simple_multiple_example_spec.rb +0 -91
- data/spec/unit/state_spec.rb +0 -89
- data/spec/unit/states_on_one_line_example_spec.rb +0 -16
- data/spec/unit/subclassing_multiple_spec.rb +0 -74
- data/spec/unit/subclassing_spec.rb +0 -46
- data/spec/unit/transition_spec.rb +0 -436
- data/test/minitest_helper.rb +0 -57
- data/test/unit/minitest_matcher_test.rb +0 -80
@@ -1,16 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "edge cases" do
|
4
|
-
describe "for classes with multiple state machines" do
|
5
|
-
it "allows accessing a multiple state machine class without state machine name" do
|
6
|
-
# it's like starting to define a new state machine within the
|
7
|
-
# requested class
|
8
|
-
expect(SimpleMultipleExample.aasm.states.map(&:name)).to be_empty
|
9
|
-
end
|
10
|
-
|
11
|
-
it "do not know yet" do
|
12
|
-
example = ComplexExampleMultiple.new
|
13
|
-
expect { example.aasm.states.inspect }.to raise_error(AASM::UnknownStateMachineError)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,73 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe 'current event' do
|
4
|
-
let(:pe) {ParametrisedEventMultiple.new}
|
5
|
-
|
6
|
-
it 'if no event has been triggered' do
|
7
|
-
expect(pe.aasm(:left).current_event).to be_nil
|
8
|
-
end
|
9
|
-
|
10
|
-
it 'if a event has been triggered' do
|
11
|
-
pe.wakeup
|
12
|
-
expect(pe.aasm(:left).current_event).to eql :wakeup
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'if no event has been triggered' do
|
16
|
-
pe.wakeup!
|
17
|
-
expect(pe.aasm(:left).current_event).to eql :wakeup!
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
describe 'parametrised events' do
|
22
|
-
let(:pe) {ParametrisedEventMultiple.new}
|
23
|
-
|
24
|
-
it 'should transition to specified next state (sleeping to showering)' do
|
25
|
-
pe.wakeup!(:showering)
|
26
|
-
expect(pe.aasm(:left).current_state).to eq(:showering)
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'should transition to specified next state (sleeping to working)' do
|
30
|
-
pe.wakeup!(:working)
|
31
|
-
expect(pe.aasm(:left).current_state).to eq(:working)
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'should transition to default (first or showering) state' do
|
35
|
-
pe.wakeup!
|
36
|
-
expect(pe.aasm(:left).current_state).to eq(:showering)
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'should transition to default state when :after transition invoked' do
|
40
|
-
pe.dress!('purple', 'dressy')
|
41
|
-
expect(pe.aasm(:left).current_state).to eq(:working)
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'should call :after transition method with args' do
|
45
|
-
pe.wakeup!(:showering)
|
46
|
-
expect(pe).to receive(:wear_clothes).with('blue', 'jeans')
|
47
|
-
pe.dress!(:working, 'blue', 'jeans')
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'should call :after transition proc' do
|
51
|
-
pe.wakeup!(:showering)
|
52
|
-
expect(pe).to receive(:wear_clothes).with('purple', 'slacks')
|
53
|
-
pe.dress!(:dating, 'purple', 'slacks')
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'should call :after transition with an array of methods' do
|
57
|
-
pe.wakeup!(:showering)
|
58
|
-
expect(pe).to receive(:condition_hair)
|
59
|
-
expect(pe).to receive(:fix_hair)
|
60
|
-
pe.dress!(:prettying_up)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
describe 'event firing without persistence' do
|
65
|
-
it 'should attempt to persist if aasm_write_state is defined' do
|
66
|
-
foo = Foo.new
|
67
|
-
def foo.aasm_write_state; end
|
68
|
-
expect(foo).to be_open
|
69
|
-
|
70
|
-
expect(foo).to receive(:aasm_write_state_without_persistence)
|
71
|
-
foo.close
|
72
|
-
end
|
73
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "event naming" do
|
4
|
-
let(:state_machine) { StateMachineWithFailedEvent.new }
|
5
|
-
|
6
|
-
it "allows an event of failed without blowing the stack aka stack level too deep" do
|
7
|
-
state_machine.failed
|
8
|
-
expect { state_machine.failed }.to raise_error(AASM::InvalidTransition)
|
9
|
-
end
|
10
|
-
|
11
|
-
it "allows send as event name" do
|
12
|
-
expect(state_machine.aasm.current_state).to eq :init
|
13
|
-
state_machine.send
|
14
|
-
expect(state_machine.aasm.current_state).to eq :sent
|
15
|
-
end
|
16
|
-
end
|
data/spec/unit/event_spec.rb
DELETED
@@ -1,381 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe 'adding an event' do
|
4
|
-
let(:state_machine) { AASM::StateMachine.new(:name) }
|
5
|
-
let(:event) do
|
6
|
-
AASM::Core::Event.new(:close_order, state_machine, {:success => :success_callback}) do
|
7
|
-
before :before_callback
|
8
|
-
after :after_callback
|
9
|
-
transitions :to => :closed, :from => [:open, :received], success: [:transition_success_callback]
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'should set the name' do
|
14
|
-
expect(event.name).to eq(:close_order)
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'should set the success callback' do
|
18
|
-
expect(event.options[:success]).to eq(:success_callback)
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'should set the after callback' do
|
22
|
-
expect(event.options[:after]).to eq([:after_callback])
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'should set the before callback' do
|
26
|
-
expect(event.options[:before]).to eq([:before_callback])
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'should create transitions' do
|
30
|
-
transitions = event.transitions
|
31
|
-
expect(transitions[0].from).to eq(:open)
|
32
|
-
expect(transitions[0].to).to eq(:closed)
|
33
|
-
expect(transitions[1].from).to eq(:received)
|
34
|
-
expect(transitions[1].to).to eq(:closed)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe 'transition inspection' do
|
39
|
-
let(:state_machine) { AASM::StateMachine.new(:name) }
|
40
|
-
let(:event) do
|
41
|
-
AASM::Core::Event.new(:run, state_machine) do
|
42
|
-
transitions :to => :running, :from => :sleeping
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'should support inspecting transitions from other states' do
|
47
|
-
expect(event.transitions_from_state(:sleeping).map(&:to)).to eq([:running])
|
48
|
-
expect(event.transitions_from_state?(:sleeping)).to be_truthy
|
49
|
-
|
50
|
-
expect(event.transitions_from_state(:cleaning).map(&:to)).to eq([])
|
51
|
-
expect(event.transitions_from_state?(:cleaning)).to be_falsey
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'should support inspecting transitions to other states' do
|
55
|
-
expect(event.transitions_to_state(:running).map(&:from)).to eq([:sleeping])
|
56
|
-
expect(event.transitions_to_state?(:running)).to be_truthy
|
57
|
-
|
58
|
-
expect(event.transitions_to_state(:cleaning).map(&:to)).to eq([])
|
59
|
-
expect(event.transitions_to_state?(:cleaning)).to be_falsey
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
describe 'transition inspection without from' do
|
64
|
-
let(:state_machine) { AASM::StateMachine.new(:name) }
|
65
|
-
let(:event) do
|
66
|
-
AASM::Core::Event.new(:run, state_machine) do
|
67
|
-
transitions :to => :running
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
it 'should support inspecting transitions from other states' do
|
72
|
-
expect(event.transitions_from_state(:sleeping).map(&:to)).to eq([:running])
|
73
|
-
expect(event.transitions_from_state?(:sleeping)).to be_truthy
|
74
|
-
|
75
|
-
expect(event.transitions_from_state(:cleaning).map(&:to)).to eq([:running])
|
76
|
-
expect(event.transitions_from_state?(:cleaning)).to be_truthy
|
77
|
-
end
|
78
|
-
|
79
|
-
end
|
80
|
-
|
81
|
-
describe 'firing an event' do
|
82
|
-
let(:state_machine) { AASM::StateMachine.new(:name) }
|
83
|
-
|
84
|
-
it 'should return nil if the transitions are empty' do
|
85
|
-
obj = double('object', :aasm => double('aasm', :current_state => 'open'))
|
86
|
-
|
87
|
-
event = AASM::Core::Event.new(:event, state_machine)
|
88
|
-
expect(event.fire(obj)).to be_nil
|
89
|
-
end
|
90
|
-
|
91
|
-
it 'should return the state of the first matching transition it finds' do
|
92
|
-
event = AASM::Core::Event.new(:event, state_machine) do
|
93
|
-
transitions :to => :closed, :from => [:open, :received]
|
94
|
-
end
|
95
|
-
|
96
|
-
obj = double('object', :aasm => double('aasm', :current_state => :open))
|
97
|
-
|
98
|
-
expect(event.fire(obj)).to eq(:closed)
|
99
|
-
end
|
100
|
-
|
101
|
-
it 'should call the guard with the params passed in' do
|
102
|
-
event = AASM::Core::Event.new(:event, state_machine) do
|
103
|
-
transitions :to => :closed, :from => [:open, :received], :guard => :guard_fn
|
104
|
-
end
|
105
|
-
|
106
|
-
obj = double('object', :aasm => double('aasm', :current_state => :open))
|
107
|
-
expect(obj).to receive(:guard_fn).with('arg1', 'arg2').and_return(true)
|
108
|
-
|
109
|
-
expect(event.fire(obj, {}, 'arg1', 'arg2')).to eq(:closed)
|
110
|
-
end
|
111
|
-
|
112
|
-
context 'when given a gaurd proc' do
|
113
|
-
it 'should have access to callback failures in the transitions' do
|
114
|
-
event = AASM::Core::Event.new(:graduate, state_machine) do
|
115
|
-
transitions :to => :alumni, :from => [:student, :applicant],
|
116
|
-
:guard => Proc.new { 1 + 1 == 3 }
|
117
|
-
end
|
118
|
-
line_number = __LINE__ - 2
|
119
|
-
obj = double('object', :aasm => double('aasm', :current_state => :student))
|
120
|
-
|
121
|
-
event.fire(obj, {})
|
122
|
-
expect(event.failed_callbacks).to eq ["#{__FILE__}##{line_number}"]
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
context 'when given a guard symbol' do
|
127
|
-
it 'should have access to callback failures in the transitions' do
|
128
|
-
event = AASM::Core::Event.new(:graduate, state_machine) do
|
129
|
-
transitions :to => :alumni, :from => [:student, :applicant],
|
130
|
-
guard: :paid_tuition?
|
131
|
-
end
|
132
|
-
|
133
|
-
obj = double('object', :aasm => double('aasm', :current_state => :student))
|
134
|
-
allow(obj).to receive(:paid_tuition?).and_return(false)
|
135
|
-
|
136
|
-
event.fire(obj, {})
|
137
|
-
expect(event.failed_callbacks).to eq [:paid_tuition?]
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
end
|
142
|
-
|
143
|
-
describe 'should fire callbacks' do
|
144
|
-
describe 'success' do
|
145
|
-
it "if it's a symbol" do
|
146
|
-
ThisNameBetterNotBeInUse.instance_eval {
|
147
|
-
aasm do
|
148
|
-
event :with_symbol, :success => :symbol_success_callback do
|
149
|
-
transitions :to => :symbol, :from => [:initial]
|
150
|
-
end
|
151
|
-
end
|
152
|
-
}
|
153
|
-
|
154
|
-
model = ThisNameBetterNotBeInUse.new
|
155
|
-
expect(model).to receive(:symbol_success_callback)
|
156
|
-
model.with_symbol!
|
157
|
-
end
|
158
|
-
|
159
|
-
it "if it's a string" do
|
160
|
-
ThisNameBetterNotBeInUse.instance_eval {
|
161
|
-
aasm do
|
162
|
-
event :with_string, :success => 'string_success_callback' do
|
163
|
-
transitions :to => :string, :from => [:initial]
|
164
|
-
end
|
165
|
-
end
|
166
|
-
}
|
167
|
-
|
168
|
-
model = ThisNameBetterNotBeInUse.new
|
169
|
-
expect(model).to receive(:string_success_callback)
|
170
|
-
model.with_string!
|
171
|
-
end
|
172
|
-
|
173
|
-
it "if passed an array of strings and/or symbols" do
|
174
|
-
ThisNameBetterNotBeInUse.instance_eval {
|
175
|
-
aasm do
|
176
|
-
event :with_array, :success => [:success_callback1, 'success_callback2'] do
|
177
|
-
transitions :to => :array, :from => [:initial]
|
178
|
-
end
|
179
|
-
end
|
180
|
-
}
|
181
|
-
|
182
|
-
model = ThisNameBetterNotBeInUse.new
|
183
|
-
expect(model).to receive(:success_callback1)
|
184
|
-
expect(model).to receive(:success_callback2)
|
185
|
-
model.with_array!
|
186
|
-
end
|
187
|
-
|
188
|
-
it "if passed an array of strings and/or symbols and/or procs" do
|
189
|
-
ThisNameBetterNotBeInUse.instance_eval {
|
190
|
-
aasm do
|
191
|
-
event :with_array_including_procs, :success => [:success_callback1, 'success_callback2', lambda { proc_success_callback }] do
|
192
|
-
transitions :to => :array, :from => [:initial]
|
193
|
-
end
|
194
|
-
end
|
195
|
-
}
|
196
|
-
|
197
|
-
model = ThisNameBetterNotBeInUse.new
|
198
|
-
expect(model).to receive(:success_callback1)
|
199
|
-
expect(model).to receive(:success_callback2)
|
200
|
-
expect(model).to receive(:proc_success_callback)
|
201
|
-
model.with_array_including_procs!
|
202
|
-
end
|
203
|
-
|
204
|
-
it "if it's a proc" do
|
205
|
-
ThisNameBetterNotBeInUse.instance_eval {
|
206
|
-
aasm do
|
207
|
-
event :with_proc, :success => lambda { proc_success_callback } do
|
208
|
-
transitions :to => :proc, :from => [:initial]
|
209
|
-
end
|
210
|
-
end
|
211
|
-
}
|
212
|
-
|
213
|
-
model = ThisNameBetterNotBeInUse.new
|
214
|
-
expect(model).to receive(:proc_success_callback)
|
215
|
-
model.with_proc!
|
216
|
-
end
|
217
|
-
end
|
218
|
-
|
219
|
-
describe 'after' do
|
220
|
-
it "if they set different ways" do
|
221
|
-
ThisNameBetterNotBeInUse.instance_eval do
|
222
|
-
aasm do
|
223
|
-
event :with_afters, :after => :do_one_thing_after do
|
224
|
-
after do
|
225
|
-
do_another_thing_after_too
|
226
|
-
end
|
227
|
-
after do
|
228
|
-
do_third_thing_at_last
|
229
|
-
end
|
230
|
-
transitions :to => :proc, :from => [:initial]
|
231
|
-
end
|
232
|
-
end
|
233
|
-
end
|
234
|
-
|
235
|
-
model = ThisNameBetterNotBeInUse.new
|
236
|
-
expect(model).to receive(:do_one_thing_after).once.ordered
|
237
|
-
expect(model).to receive(:do_another_thing_after_too).once.ordered
|
238
|
-
expect(model).to receive(:do_third_thing_at_last).once.ordered
|
239
|
-
model.with_afters!
|
240
|
-
end
|
241
|
-
end
|
242
|
-
|
243
|
-
describe 'before' do
|
244
|
-
it "if it's a proc" do
|
245
|
-
ThisNameBetterNotBeInUse.instance_eval do
|
246
|
-
aasm do
|
247
|
-
event :before_as_proc do
|
248
|
-
before do
|
249
|
-
do_something_before
|
250
|
-
end
|
251
|
-
transitions :to => :proc, :from => [:initial]
|
252
|
-
end
|
253
|
-
end
|
254
|
-
end
|
255
|
-
|
256
|
-
model = ThisNameBetterNotBeInUse.new
|
257
|
-
expect(model).to receive(:do_something_before).once
|
258
|
-
model.before_as_proc!
|
259
|
-
end
|
260
|
-
end
|
261
|
-
|
262
|
-
it 'in right order' do
|
263
|
-
ThisNameBetterNotBeInUse.instance_eval do
|
264
|
-
aasm do
|
265
|
-
event :in_right_order, :after => :do_something_after do
|
266
|
-
before do
|
267
|
-
do_something_before
|
268
|
-
end
|
269
|
-
transitions :to => :proc, :from => [:initial]
|
270
|
-
end
|
271
|
-
end
|
272
|
-
end
|
273
|
-
|
274
|
-
model = ThisNameBetterNotBeInUse.new
|
275
|
-
expect(model).to receive(:do_something_before).once.ordered
|
276
|
-
expect(model).to receive(:do_something_after).once.ordered
|
277
|
-
model.in_right_order!
|
278
|
-
end
|
279
|
-
end
|
280
|
-
|
281
|
-
describe 'current event' do
|
282
|
-
let(:pe) {ParametrisedEvent.new}
|
283
|
-
|
284
|
-
it 'if no event has been triggered' do
|
285
|
-
expect(pe.aasm.current_event).to be_nil
|
286
|
-
end
|
287
|
-
|
288
|
-
it 'if a event has been triggered' do
|
289
|
-
pe.wakeup
|
290
|
-
expect(pe.aasm.current_event).to eql :wakeup
|
291
|
-
end
|
292
|
-
|
293
|
-
it 'if no event has been triggered' do
|
294
|
-
pe.wakeup!
|
295
|
-
expect(pe.aasm.current_event).to eql :wakeup!
|
296
|
-
end
|
297
|
-
end
|
298
|
-
|
299
|
-
describe 'parametrised events' do
|
300
|
-
let(:pe) {ParametrisedEvent.new}
|
301
|
-
|
302
|
-
it 'should transition to specified next state (sleeping to showering)' do
|
303
|
-
pe.wakeup!(:showering)
|
304
|
-
expect(pe.aasm.current_state).to eq(:showering)
|
305
|
-
end
|
306
|
-
|
307
|
-
it 'should transition to specified next state (sleeping to working)' do
|
308
|
-
pe.wakeup!(:working)
|
309
|
-
expect(pe.aasm.current_state).to eq(:working)
|
310
|
-
end
|
311
|
-
|
312
|
-
it 'should transition to default (first or showering) state' do
|
313
|
-
pe.wakeup!
|
314
|
-
expect(pe.aasm.current_state).to eq(:showering)
|
315
|
-
end
|
316
|
-
|
317
|
-
it 'should transition to default state when :after transition invoked' do
|
318
|
-
pe.dress!('purple', 'dressy')
|
319
|
-
expect(pe.aasm.current_state).to eq(:working)
|
320
|
-
end
|
321
|
-
|
322
|
-
it 'should call :after transition method with args' do
|
323
|
-
pe.wakeup!(:showering)
|
324
|
-
expect(pe).to receive(:wear_clothes).with('blue', 'jeans')
|
325
|
-
pe.dress!(:working, 'blue', 'jeans')
|
326
|
-
end
|
327
|
-
|
328
|
-
it 'should call :after transition method if arg is nil' do
|
329
|
-
dryer = nil
|
330
|
-
expect(pe).to receive(:wet_hair).with(dryer)
|
331
|
-
pe.shower!(dryer)
|
332
|
-
end
|
333
|
-
|
334
|
-
it 'should call :after transition proc' do
|
335
|
-
pe.wakeup!(:showering)
|
336
|
-
expect(pe).to receive(:wear_clothes).with('purple', 'slacks')
|
337
|
-
pe.dress!(:dating, 'purple', 'slacks')
|
338
|
-
end
|
339
|
-
|
340
|
-
it 'should call :after transition with an array of methods' do
|
341
|
-
pe.wakeup!(:showering)
|
342
|
-
expect(pe).to receive(:condition_hair)
|
343
|
-
expect(pe).to receive(:fix_hair)
|
344
|
-
pe.dress!(:prettying_up)
|
345
|
-
end
|
346
|
-
|
347
|
-
it 'should call :success transition method with args' do
|
348
|
-
pe.wakeup!(:showering)
|
349
|
-
expect(pe).to receive(:wear_makeup).with('foundation', 'SPF')
|
350
|
-
pe.dress!(:working, 'foundation', 'SPF')
|
351
|
-
end
|
352
|
-
|
353
|
-
it 'should call :success transition method if arg is nil' do
|
354
|
-
shirt_color = nil
|
355
|
-
expect(pe).to receive(:wear_clothes).with(shirt_color)
|
356
|
-
pe.shower!(shirt_color)
|
357
|
-
end
|
358
|
-
|
359
|
-
it 'should call :success transition proc' do
|
360
|
-
pe.wakeup!(:showering)
|
361
|
-
expect(pe).to receive(:wear_makeup).with('purple', 'slacks')
|
362
|
-
pe.dress!(:dating, 'purple', 'slacks')
|
363
|
-
end
|
364
|
-
|
365
|
-
it 'should call :success transition with an array of methods' do
|
366
|
-
pe.wakeup!(:showering)
|
367
|
-
expect(pe).to receive(:touch_up_hair)
|
368
|
-
pe.dress!(:prettying_up)
|
369
|
-
end
|
370
|
-
end
|
371
|
-
|
372
|
-
describe 'event firing without persistence' do
|
373
|
-
it 'should attempt to persist if aasm_write_state is defined' do
|
374
|
-
foo = Foo.new
|
375
|
-
def foo.aasm_write_state; end
|
376
|
-
expect(foo).to be_open
|
377
|
-
|
378
|
-
expect(foo).to receive(:aasm_write_state_without_persistence)
|
379
|
-
foo.close
|
380
|
-
end
|
381
|
-
end
|
data/spec/unit/exception_spec.rb
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe AASM::InvalidTransition do
|
4
|
-
it 'should not be lazy detecting originating state' do
|
5
|
-
process = ProcessWithNewDsl.new
|
6
|
-
expect { process.stop! }.to raise_error do |err|
|
7
|
-
process.start
|
8
|
-
expect(err.message).to eql("Event 'stop' cannot transition from 'sleeping'.")
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
@@ -1,60 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "per-transition guards" do
|
4
|
-
let(:guardian) { GuardianMultiple.new }
|
5
|
-
|
6
|
-
it "allows the transition if the guard succeeds" do
|
7
|
-
expect { guardian.use_one_guard_that_succeeds! }.to_not raise_error
|
8
|
-
expect(guardian).to be_beta
|
9
|
-
end
|
10
|
-
|
11
|
-
it "stops the transition if the guard fails" do
|
12
|
-
expect { guardian.use_one_guard_that_fails! }.to raise_error(AASM::InvalidTransition)
|
13
|
-
expect(guardian).to be_alpha
|
14
|
-
end
|
15
|
-
|
16
|
-
it "allows the transition if all guards succeeds" do
|
17
|
-
expect { guardian.use_guards_that_succeed! }.to_not raise_error
|
18
|
-
expect(guardian).to be_beta
|
19
|
-
end
|
20
|
-
|
21
|
-
it "stops the transition if the first guard fails" do
|
22
|
-
expect { guardian.use_guards_where_the_first_fails! }.to raise_error(AASM::InvalidTransition)
|
23
|
-
expect(guardian).to be_alpha
|
24
|
-
end
|
25
|
-
|
26
|
-
it "stops the transition if the second guard fails" do
|
27
|
-
expect { guardian.use_guards_where_the_second_fails! }.to raise_error(AASM::InvalidTransition)
|
28
|
-
expect(guardian).to be_alpha
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
describe "event guards" do
|
33
|
-
let(:guardian) { GuardianMultiple.new }
|
34
|
-
|
35
|
-
it "allows the transition if the event guards succeed" do
|
36
|
-
expect { guardian.use_event_guards_that_succeed! }.to_not raise_error
|
37
|
-
expect(guardian).to be_beta
|
38
|
-
end
|
39
|
-
|
40
|
-
it "allows the transition if the event and transition guards succeed" do
|
41
|
-
expect { guardian.use_event_and_transition_guards_that_succeed! }.to_not raise_error
|
42
|
-
expect(guardian).to be_beta
|
43
|
-
end
|
44
|
-
|
45
|
-
it "stops the transition if the first event guard fails" do
|
46
|
-
expect { guardian.use_event_guards_where_the_first_fails! }.to raise_error(AASM::InvalidTransition)
|
47
|
-
expect(guardian).to be_alpha
|
48
|
-
end
|
49
|
-
|
50
|
-
it "stops the transition if the second event guard fails" do
|
51
|
-
expect { guardian.use_event_guards_where_the_second_fails! }.to raise_error(AASM::InvalidTransition)
|
52
|
-
expect(guardian).to be_alpha
|
53
|
-
end
|
54
|
-
|
55
|
-
it "stops the transition if the transition guard fails" do
|
56
|
-
expect { guardian.use_event_and_transition_guards_where_third_fails! }.to raise_error(AASM::InvalidTransition)
|
57
|
-
expect(guardian).to be_alpha
|
58
|
-
end
|
59
|
-
|
60
|
-
end
|
data/spec/unit/guard_spec.rb
DELETED
@@ -1,89 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "per-transition guards" do
|
4
|
-
let(:guardian) { Guardian.new }
|
5
|
-
|
6
|
-
it "allows the transition if the guard succeeds" do
|
7
|
-
expect { guardian.use_one_guard_that_succeeds! }.to_not raise_error
|
8
|
-
expect(guardian).to be_beta
|
9
|
-
end
|
10
|
-
|
11
|
-
it "stops the transition if the guard fails" do
|
12
|
-
expect { guardian.use_one_guard_that_fails! }.to raise_error(AASM::InvalidTransition)
|
13
|
-
expect(guardian).to be_alpha
|
14
|
-
end
|
15
|
-
|
16
|
-
it "allows the transition if all guards succeeds" do
|
17
|
-
expect { guardian.use_guards_that_succeed! }.to_not raise_error
|
18
|
-
expect(guardian).to be_beta
|
19
|
-
end
|
20
|
-
|
21
|
-
it "stops the transition if the first guard fails" do
|
22
|
-
expect { guardian.use_guards_where_the_first_fails! }.to raise_error(AASM::InvalidTransition)
|
23
|
-
expect(guardian).to be_alpha
|
24
|
-
end
|
25
|
-
|
26
|
-
it "stops the transition if the second guard fails" do
|
27
|
-
expect { guardian.use_guards_where_the_second_fails! }.to raise_error(AASM::InvalidTransition)
|
28
|
-
expect(guardian).to be_alpha
|
29
|
-
end
|
30
|
-
|
31
|
-
describe "with params" do
|
32
|
-
it "using a Proc" do
|
33
|
-
expect(guardian).to receive(:inner_guard).with({:flag => true}).and_return(true)
|
34
|
-
guardian.use_proc_guard_with_params(:flag => true)
|
35
|
-
end
|
36
|
-
|
37
|
-
it "using a lambda" do
|
38
|
-
expect(guardian).to receive(:inner_guard).with({:flag => true}).and_return(true)
|
39
|
-
guardian.use_lambda_guard_with_params(:flag => true)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
describe "event guards" do
|
45
|
-
let(:guardian) { Guardian.new }
|
46
|
-
|
47
|
-
it "allows the transition if the event guards succeed" do
|
48
|
-
expect { guardian.use_event_guards_that_succeed! }.to_not raise_error
|
49
|
-
expect(guardian).to be_beta
|
50
|
-
end
|
51
|
-
|
52
|
-
it "allows the transition if the event and transition guards succeed" do
|
53
|
-
expect { guardian.use_event_and_transition_guards_that_succeed! }.to_not raise_error
|
54
|
-
expect(guardian).to be_beta
|
55
|
-
end
|
56
|
-
|
57
|
-
it "stops the transition if the first event guard fails" do
|
58
|
-
expect { guardian.use_event_guards_where_the_first_fails! }.to raise_error(AASM::InvalidTransition)
|
59
|
-
expect(guardian).to be_alpha
|
60
|
-
end
|
61
|
-
|
62
|
-
it "stops the transition if the second event guard fails" do
|
63
|
-
expect { guardian.use_event_guards_where_the_second_fails! }.to raise_error(AASM::InvalidTransition)
|
64
|
-
expect(guardian).to be_alpha
|
65
|
-
end
|
66
|
-
|
67
|
-
it "stops the transition if the transition guard fails" do
|
68
|
-
expect { guardian.use_event_and_transition_guards_where_third_fails! }.to raise_error(AASM::InvalidTransition)
|
69
|
-
expect(guardian).to be_alpha
|
70
|
-
end
|
71
|
-
|
72
|
-
end
|
73
|
-
|
74
|
-
if defined?(ActiveRecord)
|
75
|
-
|
76
|
-
Dir[File.dirname(__FILE__) + "/../models/active_record/*.rb"].sort.each do |f|
|
77
|
-
require File.expand_path(f)
|
78
|
-
end
|
79
|
-
|
80
|
-
load_schema
|
81
|
-
|
82
|
-
describe "ActiveRecord per-transition guards" do
|
83
|
-
let(:example) { ComplexActiveRecordExample.new }
|
84
|
-
|
85
|
-
it "should be able to increment" do
|
86
|
-
expect(example.may_increment?).to be true
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
@@ -1,10 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "guards with params" do
|
4
|
-
let(:guard) { GuardWithParamsMultiple.new }
|
5
|
-
let(:user) {GuardParamsClass.new}
|
6
|
-
|
7
|
-
it "list permitted states" do
|
8
|
-
expect(guard.aasm(:left).states({:permitted => true}, user).map(&:name)).to eql [:reviewed]
|
9
|
-
end
|
10
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "guards with params" do
|
4
|
-
let(:guard) { GuardWithParams.new }
|
5
|
-
let(:user) {GuardParamsClass.new}
|
6
|
-
|
7
|
-
it "list permitted states" do
|
8
|
-
expect(guard.aasm.states({:permitted => true}, user).map(&:name)).to eql [:reviewed]
|
9
|
-
end
|
10
|
-
|
11
|
-
it "list no states if user is blank" do
|
12
|
-
expect(guard.aasm.states({:permitted => true}, nil).map(&:name)).to eql []
|
13
|
-
end
|
14
|
-
end
|
@@ -1,10 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "transitions without from specified" do
|
4
|
-
let(:guardian) { GuardianWithoutFromSpecified.new }
|
5
|
-
|
6
|
-
it "allows the transitions if guard succeeds" do
|
7
|
-
expect { guardian.use_guards_where_the_first_fails! }.to_not raise_error
|
8
|
-
expect(guardian).to be_gamma
|
9
|
-
end
|
10
|
-
end
|