aasm 5.0.8
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 +7 -0
- data/.document +6 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +27 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- data/.gitignore +20 -0
- data/.travis.yml +100 -0
- data/API +34 -0
- data/Appraisals +71 -0
- data/CHANGELOG.md +431 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/CONTRIBUTING.md +24 -0
- data/Dockerfile +44 -0
- data/Gemfile +6 -0
- data/Gemfile.lock_old +151 -0
- data/HOWTO +12 -0
- data/LICENSE +20 -0
- data/PLANNED_CHANGES.md +11 -0
- data/README.md +1439 -0
- data/README_FROM_VERSION_3_TO_4.md +240 -0
- data/Rakefile +31 -0
- data/TESTING.md +25 -0
- data/aasm.gemspec +37 -0
- data/callbacks.txt +51 -0
- data/docker-compose.yml +40 -0
- data/gemfiles/norails.gemfile +10 -0
- data/gemfiles/rails_3.2.gemfile +14 -0
- data/gemfiles/rails_4.2.gemfile +16 -0
- data/gemfiles/rails_4.2_mongoid_5.gemfile +11 -0
- data/gemfiles/rails_4.2_nobrainer.gemfile +9 -0
- data/gemfiles/rails_5.0.gemfile +13 -0
- data/gemfiles/rails_5.0_nobrainer.gemfile +9 -0
- data/gemfiles/rails_5.1.gemfile +13 -0
- data/gemfiles/rails_5.2.gemfile +13 -0
- data/lib/aasm.rb +23 -0
- data/lib/aasm/aasm.rb +208 -0
- data/lib/aasm/base.rb +271 -0
- data/lib/aasm/configuration.rb +45 -0
- data/lib/aasm/core/event.rb +172 -0
- data/lib/aasm/core/invoker.rb +129 -0
- data/lib/aasm/core/invokers/base_invoker.rb +75 -0
- data/lib/aasm/core/invokers/class_invoker.rb +52 -0
- data/lib/aasm/core/invokers/literal_invoker.rb +47 -0
- data/lib/aasm/core/invokers/proc_invoker.rb +59 -0
- data/lib/aasm/core/state.rb +90 -0
- data/lib/aasm/core/transition.rb +83 -0
- data/lib/aasm/dsl_helper.rb +30 -0
- data/lib/aasm/errors.rb +21 -0
- data/lib/aasm/instance_base.rb +133 -0
- data/lib/aasm/localizer.rb +54 -0
- data/lib/aasm/minitest.rb +5 -0
- data/lib/aasm/minitest/allow_event.rb +13 -0
- data/lib/aasm/minitest/allow_transition_to.rb +13 -0
- data/lib/aasm/minitest/have_state.rb +13 -0
- data/lib/aasm/minitest/transition_from.rb +21 -0
- data/lib/aasm/minitest_spec.rb +15 -0
- data/lib/aasm/persistence.rb +54 -0
- data/lib/aasm/persistence/active_record_persistence.rb +165 -0
- data/lib/aasm/persistence/base.rb +78 -0
- data/lib/aasm/persistence/core_data_query_persistence.rb +94 -0
- data/lib/aasm/persistence/dynamoid_persistence.rb +92 -0
- data/lib/aasm/persistence/mongoid_persistence.rb +126 -0
- data/lib/aasm/persistence/no_brainer_persistence.rb +105 -0
- data/lib/aasm/persistence/orm.rb +150 -0
- data/lib/aasm/persistence/plain_persistence.rb +26 -0
- data/lib/aasm/persistence/redis_persistence.rb +112 -0
- data/lib/aasm/persistence/sequel_persistence.rb +83 -0
- data/lib/aasm/rspec.rb +5 -0
- data/lib/aasm/rspec/allow_event.rb +26 -0
- data/lib/aasm/rspec/allow_transition_to.rb +26 -0
- data/lib/aasm/rspec/have_state.rb +22 -0
- data/lib/aasm/rspec/transition_from.rb +36 -0
- data/lib/aasm/state_machine.rb +53 -0
- data/lib/aasm/state_machine_store.rb +76 -0
- data/lib/aasm/version.rb +3 -0
- data/lib/generators/aasm/aasm_generator.rb +16 -0
- data/lib/generators/aasm/orm_helpers.rb +41 -0
- data/lib/generators/active_record/aasm_generator.rb +40 -0
- data/lib/generators/active_record/templates/migration.rb +8 -0
- data/lib/generators/active_record/templates/migration_existing.rb +5 -0
- data/lib/generators/mongoid/aasm_generator.rb +28 -0
- data/lib/generators/nobrainer/aasm_generator.rb +28 -0
- data/lib/motion-aasm.rb +37 -0
- data/spec/database.rb +59 -0
- data/spec/database.yml +3 -0
- data/spec/en.yml +12 -0
- data/spec/en_deprecated_style.yml +10 -0
- data/spec/generators/active_record_generator_spec.rb +53 -0
- data/spec/generators/mongoid_generator_spec.rb +31 -0
- data/spec/generators/no_brainer_generator_spec.rb +29 -0
- data/spec/models/active_record/basic_active_record_two_state_machines_example.rb +25 -0
- data/spec/models/active_record/complex_active_record_example.rb +37 -0
- data/spec/models/active_record/derivate_new_dsl.rb +7 -0
- data/spec/models/active_record/false_state.rb +35 -0
- data/spec/models/active_record/gate.rb +39 -0
- data/spec/models/active_record/instance_level_skip_validation_example.rb +19 -0
- data/spec/models/active_record/invalid_persistor.rb +29 -0
- data/spec/models/active_record/localizer_test_model.rb +34 -0
- data/spec/models/active_record/no_direct_assignment.rb +21 -0
- data/spec/models/active_record/no_scope.rb +21 -0
- data/spec/models/active_record/persisted_state.rb +12 -0
- data/spec/models/active_record/person.rb +23 -0
- data/spec/models/active_record/provided_and_persisted_state.rb +24 -0
- data/spec/models/active_record/reader.rb +7 -0
- data/spec/models/active_record/readme_job.rb +21 -0
- data/spec/models/active_record/silent_persistor.rb +29 -0
- data/spec/models/active_record/simple_new_dsl.rb +32 -0
- data/spec/models/active_record/thief.rb +29 -0
- data/spec/models/active_record/transactor.rb +124 -0
- data/spec/models/active_record/transient.rb +6 -0
- data/spec/models/active_record/validator.rb +118 -0
- data/spec/models/active_record/with_enum.rb +39 -0
- data/spec/models/active_record/with_enum_without_column.rb +38 -0
- data/spec/models/active_record/with_false_enum.rb +31 -0
- data/spec/models/active_record/with_true_enum.rb +39 -0
- data/spec/models/active_record/work.rb +3 -0
- data/spec/models/active_record/worker.rb +2 -0
- data/spec/models/active_record/writer.rb +6 -0
- data/spec/models/basic_two_state_machines_example.rb +25 -0
- data/spec/models/callbacks/basic.rb +98 -0
- data/spec/models/callbacks/basic_multiple.rb +75 -0
- data/spec/models/callbacks/guard_within_block.rb +67 -0
- data/spec/models/callbacks/guard_within_block_multiple.rb +66 -0
- data/spec/models/callbacks/multiple_transitions_transition_guard.rb +66 -0
- data/spec/models/callbacks/multiple_transitions_transition_guard_multiple.rb +65 -0
- data/spec/models/callbacks/private_method.rb +44 -0
- data/spec/models/callbacks/private_method_multiple.rb +44 -0
- data/spec/models/callbacks/with_args.rb +62 -0
- data/spec/models/callbacks/with_args_multiple.rb +61 -0
- data/spec/models/callbacks/with_state_arg.rb +34 -0
- data/spec/models/callbacks/with_state_arg_multiple.rb +29 -0
- data/spec/models/complex_example.rb +222 -0
- data/spec/models/conversation.rb +93 -0
- data/spec/models/default_state.rb +12 -0
- data/spec/models/double_definer.rb +21 -0
- data/spec/models/dynamoid/complex_dynamoid_example.rb +37 -0
- data/spec/models/dynamoid/dynamoid_multiple.rb +18 -0
- data/spec/models/dynamoid/dynamoid_simple.rb +18 -0
- data/spec/models/foo.rb +106 -0
- data/spec/models/foo_callback_multiple.rb +45 -0
- data/spec/models/guard_arguments_check.rb +17 -0
- data/spec/models/guard_with_params.rb +24 -0
- data/spec/models/guard_with_params_multiple.rb +18 -0
- data/spec/models/guardian.rb +58 -0
- data/spec/models/guardian_multiple.rb +48 -0
- data/spec/models/guardian_without_from_specified.rb +18 -0
- data/spec/models/initial_state_proc.rb +31 -0
- data/spec/models/mongoid/complex_mongoid_example.rb +37 -0
- data/spec/models/mongoid/invalid_persistor_mongoid.rb +39 -0
- data/spec/models/mongoid/mongoid_relationships.rb +26 -0
- data/spec/models/mongoid/no_scope_mongoid.rb +21 -0
- data/spec/models/mongoid/silent_persistor_mongoid.rb +39 -0
- data/spec/models/mongoid/simple_mongoid.rb +23 -0
- data/spec/models/mongoid/simple_new_dsl_mongoid.rb +25 -0
- data/spec/models/mongoid/validator_mongoid.rb +100 -0
- data/spec/models/multi_transitioner.rb +34 -0
- data/spec/models/multiple_transitions_that_differ_only_by_guard.rb +31 -0
- data/spec/models/namespaced_multiple_example.rb +42 -0
- data/spec/models/no_initial_state.rb +25 -0
- data/spec/models/nobrainer/complex_no_brainer_example.rb +36 -0
- data/spec/models/nobrainer/invalid_persistor_no_brainer.rb +39 -0
- data/spec/models/nobrainer/no_scope_no_brainer.rb +21 -0
- data/spec/models/nobrainer/nobrainer_relationships.rb +25 -0
- data/spec/models/nobrainer/silent_persistor_no_brainer.rb +39 -0
- data/spec/models/nobrainer/simple_new_dsl_nobrainer.rb +25 -0
- data/spec/models/nobrainer/simple_no_brainer.rb +23 -0
- data/spec/models/nobrainer/validator_no_brainer.rb +98 -0
- data/spec/models/not_auto_loaded/process.rb +21 -0
- data/spec/models/parametrised_event.rb +42 -0
- data/spec/models/parametrised_event_multiple.rb +29 -0
- data/spec/models/process_with_new_dsl.rb +31 -0
- data/spec/models/provided_state.rb +24 -0
- data/spec/models/redis/complex_redis_example.rb +40 -0
- data/spec/models/redis/redis_multiple.rb +20 -0
- data/spec/models/redis/redis_simple.rb +20 -0
- data/spec/models/sequel/complex_sequel_example.rb +46 -0
- data/spec/models/sequel/invalid_persistor.rb +52 -0
- data/spec/models/sequel/sequel_multiple.rb +25 -0
- data/spec/models/sequel/sequel_simple.rb +26 -0
- data/spec/models/sequel/silent_persistor.rb +50 -0
- data/spec/models/sequel/transactor.rb +112 -0
- data/spec/models/sequel/validator.rb +93 -0
- data/spec/models/sequel/worker.rb +12 -0
- data/spec/models/silencer.rb +27 -0
- data/spec/models/simple_custom_example.rb +53 -0
- data/spec/models/simple_example.rb +23 -0
- data/spec/models/simple_example_with_guard_args.rb +17 -0
- data/spec/models/simple_multiple_example.rb +42 -0
- data/spec/models/state_machine_with_failed_event.rb +20 -0
- data/spec/models/states_on_one_line_example.rb +8 -0
- data/spec/models/sub_class.rb +41 -0
- data/spec/models/sub_class_with_more_states.rb +18 -0
- data/spec/models/sub_classing.rb +3 -0
- data/spec/models/super_class.rb +46 -0
- data/spec/models/this_name_better_not_be_in_use.rb +11 -0
- data/spec/models/valid_state_name.rb +23 -0
- data/spec/spec_helper.rb +36 -0
- data/spec/spec_helpers/active_record.rb +8 -0
- data/spec/spec_helpers/dynamoid.rb +35 -0
- data/spec/spec_helpers/mongoid.rb +26 -0
- data/spec/spec_helpers/nobrainer.rb +15 -0
- data/spec/spec_helpers/redis.rb +18 -0
- data/spec/spec_helpers/remove_warnings.rb +1 -0
- data/spec/spec_helpers/sequel.rb +7 -0
- data/spec/unit/abstract_class_spec.rb +27 -0
- data/spec/unit/api_spec.rb +100 -0
- data/spec/unit/basic_two_state_machines_example_spec.rb +10 -0
- data/spec/unit/callback_multiple_spec.rb +304 -0
- data/spec/unit/callbacks_spec.rb +521 -0
- data/spec/unit/complex_example_spec.rb +93 -0
- data/spec/unit/complex_multiple_example_spec.rb +115 -0
- data/spec/unit/edge_cases_spec.rb +16 -0
- data/spec/unit/event_multiple_spec.rb +73 -0
- data/spec/unit/event_naming_spec.rb +16 -0
- data/spec/unit/event_spec.rb +394 -0
- data/spec/unit/exception_spec.rb +11 -0
- data/spec/unit/guard_arguments_check_spec.rb +9 -0
- data/spec/unit/guard_multiple_spec.rb +60 -0
- data/spec/unit/guard_spec.rb +89 -0
- data/spec/unit/guard_with_params_multiple_spec.rb +10 -0
- data/spec/unit/guard_with_params_spec.rb +14 -0
- data/spec/unit/guard_without_from_specified_spec.rb +10 -0
- data/spec/unit/initial_state_multiple_spec.rb +15 -0
- data/spec/unit/initial_state_spec.rb +12 -0
- data/spec/unit/inspection_multiple_spec.rb +201 -0
- data/spec/unit/inspection_spec.rb +149 -0
- data/spec/unit/invoker_spec.rb +189 -0
- data/spec/unit/invokers/base_invoker_spec.rb +72 -0
- data/spec/unit/invokers/class_invoker_spec.rb +95 -0
- data/spec/unit/invokers/literal_invoker_spec.rb +86 -0
- data/spec/unit/invokers/proc_invoker_spec.rb +86 -0
- data/spec/unit/localizer_spec.rb +78 -0
- data/spec/unit/memory_leak_spec.rb +38 -0
- data/spec/unit/multiple_transitions_that_differ_only_by_guard_spec.rb +14 -0
- data/spec/unit/namespaced_multiple_example_spec.rb +75 -0
- data/spec/unit/new_dsl_spec.rb +12 -0
- data/spec/unit/override_warning_spec.rb +94 -0
- data/spec/unit/persistence/active_record_persistence_multiple_spec.rb +618 -0
- data/spec/unit/persistence/active_record_persistence_spec.rb +773 -0
- data/spec/unit/persistence/dynamoid_persistence_multiple_spec.rb +135 -0
- data/spec/unit/persistence/dynamoid_persistence_spec.rb +84 -0
- data/spec/unit/persistence/mongoid_persistence_multiple_spec.rb +200 -0
- data/spec/unit/persistence/mongoid_persistence_spec.rb +165 -0
- data/spec/unit/persistence/no_brainer_persistence_multiple_spec.rb +198 -0
- data/spec/unit/persistence/no_brainer_persistence_spec.rb +158 -0
- data/spec/unit/persistence/redis_persistence_multiple_spec.rb +88 -0
- data/spec/unit/persistence/redis_persistence_spec.rb +53 -0
- data/spec/unit/persistence/sequel_persistence_multiple_spec.rb +148 -0
- data/spec/unit/persistence/sequel_persistence_spec.rb +368 -0
- data/spec/unit/readme_spec.rb +41 -0
- data/spec/unit/reloading_spec.rb +15 -0
- data/spec/unit/rspec_matcher_spec.rb +88 -0
- data/spec/unit/simple_custom_example_spec.rb +39 -0
- data/spec/unit/simple_example_spec.rb +57 -0
- data/spec/unit/simple_multiple_example_spec.rb +91 -0
- data/spec/unit/state_spec.rb +89 -0
- data/spec/unit/states_on_one_line_example_spec.rb +16 -0
- data/spec/unit/subclassing_multiple_spec.rb +74 -0
- data/spec/unit/subclassing_spec.rb +46 -0
- data/spec/unit/transition_spec.rb +436 -0
- data/test/minitest_helper.rb +57 -0
- data/test/unit/minitest_matcher_test.rb +80 -0
- metadata +609 -0
@@ -0,0 +1,11 @@
|
|
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
|
@@ -0,0 +1,60 @@
|
|
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
|
@@ -0,0 +1,89 @@
|
|
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
|
@@ -0,0 +1,10 @@
|
|
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
|
@@ -0,0 +1,14 @@
|
|
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
|
@@ -0,0 +1,10 @@
|
|
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
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'initial states' do
|
4
|
+
it 'should use the first state defined if no initial state is given' do
|
5
|
+
expect(NoInitialStateMultiple.new.aasm(:left).current_state).to eq(:read)
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'should determine initial state from the Proc results' do
|
9
|
+
balance = InitialStateProcMultiple::RICH - 1
|
10
|
+
expect(InitialStateProcMultiple.new(balance).aasm(:left).current_state).to eq(:selling_bad_mortgages)
|
11
|
+
|
12
|
+
balance = InitialStateProcMultiple::RICH + 1
|
13
|
+
expect(InitialStateProcMultiple.new(balance).aasm(:left).current_state).to eq(:retired)
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'initial states' do
|
4
|
+
it 'should use the first state defined if no initial state is given' do
|
5
|
+
expect(NoInitialState.new.aasm.current_state).to eq(:read)
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'should determine initial state from the Proc results' do
|
9
|
+
expect(InitialStateProc.new(InitialStateProc::RICH - 1).aasm.current_state).to eq(:selling_bad_mortgages)
|
10
|
+
expect(InitialStateProc.new(InitialStateProc::RICH + 1).aasm.current_state).to eq(:retired)
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,201 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'inspection for common cases' do
|
4
|
+
it 'should support the new DSL' do
|
5
|
+
# 1st state machine
|
6
|
+
expect(FooMultiple.aasm(:left)).to respond_to(:states)
|
7
|
+
expect(FooMultiple.aasm(:left).states.size).to eql 3
|
8
|
+
expect(FooMultiple.aasm(:left).states).to include(:open)
|
9
|
+
expect(FooMultiple.aasm(:left).states).to include(:closed)
|
10
|
+
expect(FooMultiple.aasm(:left).states).to include(:final)
|
11
|
+
|
12
|
+
expect(FooMultiple.aasm(:left)).to respond_to(:initial_state)
|
13
|
+
expect(FooMultiple.aasm(:left).initial_state).to eq(:open)
|
14
|
+
|
15
|
+
expect(FooMultiple.aasm(:left)).to respond_to(:events)
|
16
|
+
expect(FooMultiple.aasm(:left).events.size).to eql 2
|
17
|
+
expect(FooMultiple.aasm(:left).events).to include(:close)
|
18
|
+
expect(FooMultiple.aasm(:left).events).to include(:null)
|
19
|
+
|
20
|
+
# 2nd state machine
|
21
|
+
expect(FooMultiple.aasm(:right)).to respond_to(:states)
|
22
|
+
expect(FooMultiple.aasm(:right).states.size).to eql 3
|
23
|
+
expect(FooMultiple.aasm(:right).states).to include(:green)
|
24
|
+
expect(FooMultiple.aasm(:right).states).to include(:yellow)
|
25
|
+
expect(FooMultiple.aasm(:right).states).to include(:red)
|
26
|
+
|
27
|
+
expect(FooMultiple.aasm(:right)).to respond_to(:initial_state)
|
28
|
+
expect(FooMultiple.aasm(:right).initial_state).to eq(:green)
|
29
|
+
|
30
|
+
expect(FooMultiple.aasm(:right)).to respond_to(:events)
|
31
|
+
expect(FooMultiple.aasm(:right).events.size).to eql 3
|
32
|
+
expect(FooMultiple.aasm(:right).events).to include(:green)
|
33
|
+
expect(FooMultiple.aasm(:right).events).to include(:yellow)
|
34
|
+
expect(FooMultiple.aasm(:right).events).to include(:red)
|
35
|
+
end
|
36
|
+
|
37
|
+
context "instance level inspection" do
|
38
|
+
let(:foo) { FooMultiple.new }
|
39
|
+
let(:two) { FooTwoMultiple.new }
|
40
|
+
|
41
|
+
it "delivers all states" do
|
42
|
+
# 1st state machine
|
43
|
+
states = foo.aasm(:left).states
|
44
|
+
expect(states.size).to eql 3
|
45
|
+
expect(states).to include(:open)
|
46
|
+
expect(states).to include(:closed)
|
47
|
+
expect(states).to include(:final)
|
48
|
+
|
49
|
+
states = foo.aasm(:left).states(:permitted => true)
|
50
|
+
expect(states.size).to eql 1
|
51
|
+
expect(states).to include(:closed)
|
52
|
+
expect(states).not_to include(:open)
|
53
|
+
expect(states).not_to include(:final)
|
54
|
+
|
55
|
+
foo.close
|
56
|
+
expect(foo.aasm(:left).states(:permitted => true)).to be_empty
|
57
|
+
|
58
|
+
# 2nd state machine
|
59
|
+
states = foo.aasm(:right).states
|
60
|
+
expect(states.size).to eql 3
|
61
|
+
expect(states).to include(:green)
|
62
|
+
expect(states).to include(:yellow)
|
63
|
+
expect(states).to include(:red)
|
64
|
+
|
65
|
+
states = foo.aasm(:right).states(:permitted => true)
|
66
|
+
expect(states.size).to eql 1
|
67
|
+
expect(states).to include(:yellow)
|
68
|
+
expect(states).not_to include(:green)
|
69
|
+
expect(states).not_to include(:red)
|
70
|
+
|
71
|
+
foo.yellow
|
72
|
+
states = foo.aasm(:right).states(:permitted => true)
|
73
|
+
expect(states.size).to eql 2
|
74
|
+
expect(states).to include(:red)
|
75
|
+
expect(states).to include(:green)
|
76
|
+
expect(states).not_to include(:yellow)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "delivers all states for subclasses" do
|
80
|
+
# 1st state machine
|
81
|
+
states = two.aasm(:left).states
|
82
|
+
expect(states.size).to eql 4
|
83
|
+
expect(states).to include(:open)
|
84
|
+
expect(states).to include(:closed)
|
85
|
+
expect(states).to include(:final)
|
86
|
+
expect(states).to include(:foo)
|
87
|
+
|
88
|
+
states = two.aasm(:left).states(:permitted => true)
|
89
|
+
expect(states.size).to eql 1
|
90
|
+
expect(states).to include(:closed)
|
91
|
+
expect(states).not_to include(:open)
|
92
|
+
|
93
|
+
two.close
|
94
|
+
expect(two.aasm(:left).states(:permitted => true)).to be_empty
|
95
|
+
|
96
|
+
# 2nd state machine
|
97
|
+
states = two.aasm(:right).states
|
98
|
+
expect(states.size).to eql 4
|
99
|
+
expect(states).to include(:green)
|
100
|
+
expect(states).to include(:yellow)
|
101
|
+
expect(states).to include(:red)
|
102
|
+
expect(states).to include(:bar)
|
103
|
+
|
104
|
+
states = two.aasm(:right).states(:permitted => true)
|
105
|
+
expect(states.size).to eql 1
|
106
|
+
expect(states).to include(:yellow)
|
107
|
+
expect(states).not_to include(:red)
|
108
|
+
expect(states).not_to include(:green)
|
109
|
+
expect(states).not_to include(:bar)
|
110
|
+
|
111
|
+
two.yellow
|
112
|
+
states = two.aasm(:right).states(:permitted => true)
|
113
|
+
expect(states.size).to eql 2
|
114
|
+
expect(states).to include(:green)
|
115
|
+
expect(states).to include(:red)
|
116
|
+
expect(states).not_to include(:yellow)
|
117
|
+
expect(states).not_to include(:bar)
|
118
|
+
end
|
119
|
+
|
120
|
+
it "delivers all events" do
|
121
|
+
# 1st state machine
|
122
|
+
events = foo.aasm(:left).events
|
123
|
+
expect(events.size).to eql 2
|
124
|
+
expect(events).to include(:close)
|
125
|
+
expect(events).to include(:null)
|
126
|
+
|
127
|
+
foo.close
|
128
|
+
expect(foo.aasm(:left).events).to be_empty
|
129
|
+
|
130
|
+
# 2nd state machine
|
131
|
+
events = foo.aasm(:right).events
|
132
|
+
expect(events.size).to eql 1
|
133
|
+
expect(events).to include(:yellow)
|
134
|
+
expect(events).not_to include(:green)
|
135
|
+
expect(events).not_to include(:red)
|
136
|
+
|
137
|
+
foo.yellow
|
138
|
+
events = foo.aasm(:right).events
|
139
|
+
expect(events.size).to eql 2
|
140
|
+
expect(events).to include(:green)
|
141
|
+
expect(events).to include(:red)
|
142
|
+
expect(events).not_to include(:yellow)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'should list states in the order they have been defined' do
|
147
|
+
expect(ConversationMultiple.aasm(:left).states).to eq([
|
148
|
+
:needs_attention, :read, :closed, :awaiting_response, :junk
|
149
|
+
])
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
describe "special cases" do
|
154
|
+
it "should support valid as state name" do
|
155
|
+
expect(ValidStateNameMultiple.aasm(:left).states).to include(:invalid)
|
156
|
+
expect(ValidStateNameMultiple.aasm(:left).states).to include(:valid)
|
157
|
+
|
158
|
+
argument = ValidStateNameMultiple.new
|
159
|
+
expect(argument.invalid?).to be_truthy
|
160
|
+
expect(argument.aasm(:left).current_state).to eq(:invalid)
|
161
|
+
|
162
|
+
argument.valid!
|
163
|
+
expect(argument.valid?).to be_truthy
|
164
|
+
expect(argument.aasm(:left).current_state).to eq(:valid)
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
describe 'aasm.states_for_select' do
|
169
|
+
it "should return a select friendly array of states" do
|
170
|
+
expect(FooMultiple.aasm(:left)).to respond_to(:states_for_select)
|
171
|
+
expect(FooMultiple.aasm(:left).states_for_select).to eq(
|
172
|
+
[['Open', 'open'], ['Closed', 'closed'], ['Final', 'final']]
|
173
|
+
)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
describe 'aasm.from_states_for_state' do
|
178
|
+
it "should return all from states for a state" do
|
179
|
+
expect(ComplexExampleMultiple.aasm(:left)).to respond_to(:from_states_for_state)
|
180
|
+
froms = ComplexExampleMultiple.aasm(:left).from_states_for_state(:active)
|
181
|
+
[:pending, :passive, :suspended].each {|from| expect(froms).to include(from)}
|
182
|
+
end
|
183
|
+
|
184
|
+
it "should return from states for a state for a particular transition only" do
|
185
|
+
froms = ComplexExampleMultiple.aasm(:left).from_states_for_state(:active, :transition => :left_unsuspend)
|
186
|
+
[:suspended].each {|from| expect(froms).to include(from)}
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
describe 'permitted events' do
|
191
|
+
let(:foo) {FooMultiple.new}
|
192
|
+
|
193
|
+
it 'work' do
|
194
|
+
expect(foo.aasm(:left).events(:permitted => true)).to include(:close)
|
195
|
+
expect(foo.aasm(:left).events(:permitted => true)).not_to include(:null)
|
196
|
+
|
197
|
+
expect(foo.aasm(:right).events(:permitted => true)).to include(:yellow)
|
198
|
+
expect(foo.aasm(:right).events(:permitted => true)).not_to include(:green)
|
199
|
+
expect(foo.aasm(:right).events(:permitted => true)).not_to include(:red)
|
200
|
+
end
|
201
|
+
end
|
@@ -0,0 +1,149 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'inspection for common cases' do
|
4
|
+
it 'should support the new DSL' do
|
5
|
+
expect(Foo.aasm).to respond_to(:states)
|
6
|
+
expect(Foo.aasm.states).to include(:open)
|
7
|
+
expect(Foo.aasm.states).to include(:closed)
|
8
|
+
|
9
|
+
expect(Foo.aasm).to respond_to(:initial_state)
|
10
|
+
expect(Foo.aasm.initial_state).to eq(:open)
|
11
|
+
|
12
|
+
expect(Foo.aasm).to respond_to(:events)
|
13
|
+
expect(Foo.aasm.events).to include(:close)
|
14
|
+
expect(Foo.aasm.events).to include(:null)
|
15
|
+
end
|
16
|
+
|
17
|
+
context "instance level inspection" do
|
18
|
+
let(:foo) { Foo.new }
|
19
|
+
let(:two) { FooTwo.new }
|
20
|
+
let(:multi) { MultiTransitioner.new }
|
21
|
+
|
22
|
+
it "delivers all states" do
|
23
|
+
states = foo.aasm.states
|
24
|
+
expect(states).to include(:open)
|
25
|
+
expect(states).to include(:closed)
|
26
|
+
expect(states).to include(:final)
|
27
|
+
|
28
|
+
permitted_states = foo.aasm.states(:permitted => true)
|
29
|
+
expect(permitted_states).to include(:closed)
|
30
|
+
expect(permitted_states).not_to include(:open)
|
31
|
+
expect(permitted_states).not_to include(:final)
|
32
|
+
|
33
|
+
blocked_states = foo.aasm.states(:permitted => false)
|
34
|
+
expect(blocked_states).to include(:closed)
|
35
|
+
expect(blocked_states).not_to include(:open)
|
36
|
+
expect(blocked_states).to include(:final)
|
37
|
+
|
38
|
+
foo.close
|
39
|
+
expect(foo.aasm.states(:permitted => true)).to be_empty
|
40
|
+
end
|
41
|
+
|
42
|
+
it "delivers all states for subclasses" do
|
43
|
+
states = two.aasm.states
|
44
|
+
expect(states).to include(:open)
|
45
|
+
expect(states).to include(:closed)
|
46
|
+
expect(states).to include(:final)
|
47
|
+
expect(states).to include(:foo)
|
48
|
+
|
49
|
+
states = two.aasm.states(:permitted => true)
|
50
|
+
expect(states).to include(:closed)
|
51
|
+
expect(states).not_to include(:open)
|
52
|
+
expect(states).not_to include(:final)
|
53
|
+
|
54
|
+
two.close
|
55
|
+
expect(two.aasm.states(:permitted => true)).to be_empty
|
56
|
+
end
|
57
|
+
|
58
|
+
it "delivers all events" do
|
59
|
+
events = foo.aasm.events
|
60
|
+
expect(events).to include(:close)
|
61
|
+
expect(events).to include(:null)
|
62
|
+
foo.close
|
63
|
+
expect(foo.aasm.events).to be_empty
|
64
|
+
end
|
65
|
+
|
66
|
+
it "delivers permitted states when multiple transitions are defined" do
|
67
|
+
multi.can_run = false
|
68
|
+
states = multi.aasm.states(:permitted => true)
|
69
|
+
expect(states).to_not include(:running)
|
70
|
+
expect(states).to include(:dancing)
|
71
|
+
|
72
|
+
multi.can_run = true
|
73
|
+
states = multi.aasm.states(:permitted => true)
|
74
|
+
expect(states).to include(:running)
|
75
|
+
expect(states).to_not include(:dancing)
|
76
|
+
end
|
77
|
+
|
78
|
+
it "transitions to correct state if from state is missing from one transitions" do
|
79
|
+
multi.sleep
|
80
|
+
expect(multi.aasm.current_state).to eq(:sleeping)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'should list states in the order they have been defined' do
|
85
|
+
expect(Conversation.aasm.states).to eq([:needs_attention, :read, :closed, :awaiting_response, :junk])
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe "special cases" do
|
90
|
+
it "should support valid as state name" do
|
91
|
+
expect(ValidStateName.aasm.states).to include(:invalid)
|
92
|
+
expect(ValidStateName.aasm.states).to include(:valid)
|
93
|
+
|
94
|
+
argument = ValidStateName.new
|
95
|
+
expect(argument.invalid?).to be_truthy
|
96
|
+
expect(argument.aasm.current_state).to eq(:invalid)
|
97
|
+
|
98
|
+
argument.valid!
|
99
|
+
expect(argument.valid?).to be_truthy
|
100
|
+
expect(argument.aasm.current_state).to eq(:valid)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe 'aasm.states_for_select' do
|
105
|
+
it "should return a select friendly array of states" do
|
106
|
+
expect(Foo.aasm).to respond_to(:states_for_select)
|
107
|
+
expect(Foo.aasm.states_for_select).to eq([['Open', 'open'], ['Closed', 'closed'], ['Final', 'final']])
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe 'aasm.from_states_for_state' do
|
112
|
+
it "should return all from states for a state" do
|
113
|
+
expect(ComplexExample.aasm).to respond_to(:from_states_for_state)
|
114
|
+
froms = ComplexExample.aasm.from_states_for_state(:active)
|
115
|
+
[:pending, :passive, :suspended].each {|from| expect(froms).to include(from)}
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should return from states for a state for a particular transition only" do
|
119
|
+
froms = ComplexExample.aasm.from_states_for_state(:active, :transition => :unsuspend)
|
120
|
+
[:suspended].each {|from| expect(froms).to include(from)}
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
describe 'permitted events' do
|
125
|
+
let(:foo) {Foo.new}
|
126
|
+
|
127
|
+
it 'work' do
|
128
|
+
expect(foo.aasm.events(:permitted => true)).to include(:close)
|
129
|
+
expect(foo.aasm.events(:permitted => true)).not_to include(:null)
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'should not include events in the reject option' do
|
133
|
+
expect(foo.aasm.events(:permitted => true, reject: :close)).not_to include(:close)
|
134
|
+
expect(foo.aasm.events(:permitted => true, reject: [:close])).not_to include(:close)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
describe 'not permitted events' do
|
139
|
+
let(:foo) {Foo.new}
|
140
|
+
|
141
|
+
it 'work' do
|
142
|
+
expect(foo.aasm.events(:permitted => false)).to include(:null)
|
143
|
+
expect(foo.aasm.events(:permitted => false)).not_to include(:close)
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'should not include events in the reject option' do
|
147
|
+
expect(foo.aasm.events(:permitted => false, reject: :null)).to eq([])
|
148
|
+
end
|
149
|
+
end
|