aasm 5.0.8 → 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 +4 -4
- data/README.md +108 -17
- data/lib/aasm/base.rb +44 -12
- data/lib/aasm/configuration.rb +3 -0
- data/lib/aasm/core/event.rb +12 -6
- 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 +1 -0
- data/lib/aasm/instance_base.rb +15 -4
- data/lib/aasm/localizer.rb +13 -3
- data/lib/aasm/persistence/active_record_persistence.rb +18 -0
- data/lib/aasm/persistence/base.rb +13 -2
- data/lib/aasm/persistence/orm.rb +23 -19
- data/lib/aasm/version.rb +1 -1
- data/lib/aasm.rb +0 -2
- data/lib/generators/aasm/orm_helpers.rb +1 -1
- data/lib/generators/active_record/templates/migration.rb +1 -1
- metadata +9 -397
- data/.document +0 -6
- data/.github/ISSUE_TEMPLATE/bug_report.md +0 -27
- data/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
- data/.gitignore +0 -20
- data/.travis.yml +0 -100
- data/API +0 -34
- data/Appraisals +0 -71
- data/CHANGELOG.md +0 -431
- 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 -37
- data/callbacks.txt +0 -51
- data/docker-compose.yml +0 -40
- data/gemfiles/norails.gemfile +0 -10
- data/gemfiles/rails_3.2.gemfile +0 -14
- 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/gemfiles/rails_5.2.gemfile +0 -13
- data/spec/database.rb +0 -59
- 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 -53
- 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/instance_level_skip_validation_example.rb +0 -19
- 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/person.rb +0 -23
- 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 -32
- 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/work.rb +0 -3
- 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 -34
- data/spec/models/callbacks/with_state_arg_multiple.rb +0 -29
- 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 -23
- 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 -36
- 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/abstract_class_spec.rb +0 -27
- 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 -304
- data/spec/unit/callbacks_spec.rb +0 -521
- data/spec/unit/complex_example_spec.rb +0 -93
- 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 -394
- 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 -773
- 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 -88
- data/spec/unit/simple_custom_example_spec.rb +0 -39
- data/spec/unit/simple_example_spec.rb +0 -57
- 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,436 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe 'transitions' do
|
4
|
-
|
5
|
-
it 'should raise an exception when whiny' do
|
6
|
-
process = ProcessWithNewDsl.new
|
7
|
-
expect { process.stop! }.to raise_error do |err|
|
8
|
-
expect(err.class).to eql(AASM::InvalidTransition)
|
9
|
-
expect(err.message).to eql("Event 'stop' cannot transition from 'sleeping'.")
|
10
|
-
expect(err.object).to eql(process)
|
11
|
-
expect(err.event_name).to eql(:stop)
|
12
|
-
end
|
13
|
-
expect(process).to be_sleeping
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'should not raise an exception when not whiny' do
|
17
|
-
silencer = Silencer.new
|
18
|
-
expect(silencer.smile!).to be_falsey
|
19
|
-
expect(silencer).to be_silent
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'should not raise an exception when superclass not whiny' do
|
23
|
-
sub = SubClassing.new
|
24
|
-
expect(sub.smile!).to be_falsey
|
25
|
-
expect(sub).to be_silent
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'should not raise an exception when from is nil even if whiny' do
|
29
|
-
silencer = Silencer.new
|
30
|
-
expect(silencer.smile_any!).to be_truthy
|
31
|
-
expect(silencer).to be_smiling
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'should call the block on success' do
|
35
|
-
silencer = Silencer.new
|
36
|
-
success = false
|
37
|
-
expect {
|
38
|
-
silencer.smile_any! do
|
39
|
-
success = true
|
40
|
-
end
|
41
|
-
}.to change { success }.to(true)
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'should not call the block on failure' do
|
45
|
-
silencer = Silencer.new
|
46
|
-
success = false
|
47
|
-
expect {
|
48
|
-
silencer.smile! do
|
49
|
-
success = true
|
50
|
-
end
|
51
|
-
}.not_to change { success }
|
52
|
-
end
|
53
|
-
|
54
|
-
end
|
55
|
-
|
56
|
-
describe AASM::Core::Transition do
|
57
|
-
let(:state_machine) { AASM::StateMachine.new(:name) }
|
58
|
-
let(:event) { AASM::Core::Event.new(:event, state_machine) }
|
59
|
-
|
60
|
-
it 'should set from, to, and opts attr readers' do
|
61
|
-
opts = {:from => 'foo', :to => 'bar', :guard => 'g'}
|
62
|
-
st = AASM::Core::Transition.new(event, opts)
|
63
|
-
|
64
|
-
expect(st.from).to eq(opts[:from])
|
65
|
-
expect(st.to).to eq(opts[:to])
|
66
|
-
expect(st.opts).to eq(opts)
|
67
|
-
end
|
68
|
-
|
69
|
-
it 'should set on_transition with deprecation warning' do
|
70
|
-
opts = {:from => 'foo', :to => 'bar'}
|
71
|
-
st = AASM::Core::Transition.allocate
|
72
|
-
expect(st).to receive(:warn).with('[DEPRECATION] :on_transition is deprecated, use :after instead')
|
73
|
-
|
74
|
-
st.send :initialize, event, opts do
|
75
|
-
guard :gg
|
76
|
-
on_transition :after_callback
|
77
|
-
end
|
78
|
-
|
79
|
-
expect(st.opts[:after]).to eql [:after_callback]
|
80
|
-
end
|
81
|
-
|
82
|
-
it 'should set after, guard and success from dsl' do
|
83
|
-
opts = {:from => 'foo', :to => 'bar', :guard => 'g'}
|
84
|
-
st = AASM::Core::Transition.new(event, opts) do
|
85
|
-
guard :gg
|
86
|
-
after :after_callback
|
87
|
-
success :after_persist
|
88
|
-
end
|
89
|
-
|
90
|
-
expect(st.opts[:guard]).to eql ['g', :gg]
|
91
|
-
expect(st.opts[:after]).to eql [:after_callback] # TODO fix this bad code coupling
|
92
|
-
expect(st.opts[:success]).to eql [:after_persist] # TODO fix this bad code coupling
|
93
|
-
end
|
94
|
-
|
95
|
-
it 'should pass equality check if from and to are the same' do
|
96
|
-
opts = {:from => 'foo', :to => 'bar', :guard => 'g'}
|
97
|
-
st = AASM::Core::Transition.new(event, opts)
|
98
|
-
|
99
|
-
obj = double('object')
|
100
|
-
allow(obj).to receive(:from).and_return(opts[:from])
|
101
|
-
allow(obj).to receive(:to).and_return(opts[:to])
|
102
|
-
|
103
|
-
expect(st).to eq(obj)
|
104
|
-
end
|
105
|
-
|
106
|
-
it 'should fail equality check if from are not the same' do
|
107
|
-
opts = {:from => 'foo', :to => 'bar', :guard => 'g'}
|
108
|
-
st = AASM::Core::Transition.new(event, opts)
|
109
|
-
|
110
|
-
obj = double('object')
|
111
|
-
allow(obj).to receive(:from).and_return('blah')
|
112
|
-
allow(obj).to receive(:to).and_return(opts[:to])
|
113
|
-
|
114
|
-
expect(st).not_to eq(obj)
|
115
|
-
end
|
116
|
-
|
117
|
-
it 'should fail equality check if to are not the same' do
|
118
|
-
opts = {:from => 'foo', :to => 'bar', :guard => 'g'}
|
119
|
-
st = AASM::Core::Transition.new(event, opts)
|
120
|
-
|
121
|
-
obj = double('object')
|
122
|
-
allow(obj).to receive(:from).and_return(opts[:from])
|
123
|
-
allow(obj).to receive(:to).and_return('blah')
|
124
|
-
|
125
|
-
expect(st).not_to eq(obj)
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
describe AASM::Core::Transition, '- when performing guard checks' do
|
130
|
-
let(:state_machine) { AASM::StateMachine.new(:name) }
|
131
|
-
let(:event) { AASM::Core::Event.new(:event, state_machine) }
|
132
|
-
|
133
|
-
it 'should return true of there is no guard' do
|
134
|
-
opts = {:from => 'foo', :to => 'bar'}
|
135
|
-
st = AASM::Core::Transition.new(event, opts)
|
136
|
-
|
137
|
-
expect(st.allowed?(nil)).to be_truthy
|
138
|
-
end
|
139
|
-
|
140
|
-
it 'should call the method on the object if guard is a symbol' do
|
141
|
-
opts = {:from => 'foo', :to => 'bar', :guard => :test}
|
142
|
-
st = AASM::Core::Transition.new(event, opts)
|
143
|
-
|
144
|
-
obj = double('object')
|
145
|
-
expect(obj).to receive(:test)
|
146
|
-
|
147
|
-
expect(st.allowed?(obj)).to be false
|
148
|
-
end
|
149
|
-
|
150
|
-
it 'should add the name of the failed method calls to the failures instance var' do
|
151
|
-
opts = {:from => 'foo', :to => 'bar', :guard => :test}
|
152
|
-
st = AASM::Core::Transition.new(event, opts)
|
153
|
-
|
154
|
-
obj = double('object')
|
155
|
-
expect(obj).to receive(:test)
|
156
|
-
|
157
|
-
st.allowed?(obj)
|
158
|
-
expect(st.failures).to eq [:test]
|
159
|
-
end
|
160
|
-
|
161
|
-
it 'should call the method on the object if unless is a symbol' do
|
162
|
-
opts = {:from => 'foo', :to => 'bar', :unless => :test}
|
163
|
-
st = AASM::Core::Transition.new(event, opts)
|
164
|
-
|
165
|
-
obj = double('object')
|
166
|
-
expect(obj).to receive(:test)
|
167
|
-
|
168
|
-
expect(st.allowed?(obj)).to be true
|
169
|
-
end
|
170
|
-
|
171
|
-
it 'should call the method on the object if guard is a string' do
|
172
|
-
opts = {:from => 'foo', :to => 'bar', :guard => 'test'}
|
173
|
-
st = AASM::Core::Transition.new(event, opts)
|
174
|
-
|
175
|
-
obj = double('object')
|
176
|
-
expect(obj).to receive(:test)
|
177
|
-
|
178
|
-
expect(st.allowed?(obj)).to be false
|
179
|
-
end
|
180
|
-
|
181
|
-
it 'should call the method on the object if unless is a string' do
|
182
|
-
opts = {:from => 'foo', :to => 'bar', :unless => 'test'}
|
183
|
-
st = AASM::Core::Transition.new(event, opts)
|
184
|
-
|
185
|
-
obj = double('object')
|
186
|
-
expect(obj).to receive(:test)
|
187
|
-
|
188
|
-
expect(st.allowed?(obj)).to be true
|
189
|
-
end
|
190
|
-
|
191
|
-
it 'should call the proc passing the object if the guard is a proc' do
|
192
|
-
opts = {:from => 'foo', :to => 'bar', :guard => Proc.new { test }}
|
193
|
-
st = AASM::Core::Transition.new(event, opts)
|
194
|
-
|
195
|
-
obj = double('object')
|
196
|
-
expect(obj).to receive(:test)
|
197
|
-
|
198
|
-
expect(st.allowed?(obj)).to be false
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
describe AASM::Core::Transition, '- when executing the transition with a Proc' do
|
203
|
-
let(:state_machine) { AASM::StateMachine.new(:name) }
|
204
|
-
let(:event) { AASM::Core::Event.new(:event, state_machine) }
|
205
|
-
|
206
|
-
it 'should call a Proc on the object with args' do
|
207
|
-
opts = {:from => 'foo', :to => 'bar', :after => Proc.new {|a| test(a) }}
|
208
|
-
st = AASM::Core::Transition.new(event, opts)
|
209
|
-
args = {:arg1 => '1', :arg2 => '2'}
|
210
|
-
obj = double('object', :aasm => 'aasm')
|
211
|
-
|
212
|
-
expect(obj).to receive(:test).with(args)
|
213
|
-
|
214
|
-
st.execute(obj, args)
|
215
|
-
end
|
216
|
-
|
217
|
-
it 'should call a Proc on the object without args' do
|
218
|
-
# in order to test that the Proc has been called, we make sure
|
219
|
-
# that after running the :after callback the prc_object is set
|
220
|
-
prc_object = nil
|
221
|
-
prc = Proc.new { prc_object = self }
|
222
|
-
|
223
|
-
opts = {:from => 'foo', :to => 'bar', :after => prc }
|
224
|
-
st = AASM::Core::Transition.new(event, opts)
|
225
|
-
args = {:arg1 => '1', :arg2 => '2'}
|
226
|
-
obj = double('object', :aasm => 'aasm')
|
227
|
-
|
228
|
-
st.execute(obj, args)
|
229
|
-
expect(prc_object).to eql obj
|
230
|
-
end
|
231
|
-
end
|
232
|
-
|
233
|
-
describe AASM::Core::Transition, '- when executing the transition with an :after method call' do
|
234
|
-
let(:state_machine) { AASM::StateMachine.new(:name) }
|
235
|
-
let(:event) { AASM::Core::Event.new(:event, state_machine) }
|
236
|
-
|
237
|
-
it 'should accept a String for the method name' do
|
238
|
-
opts = {:from => 'foo', :to => 'bar', :after => 'test'}
|
239
|
-
st = AASM::Core::Transition.new(event, opts)
|
240
|
-
args = {:arg1 => '1', :arg2 => '2'}
|
241
|
-
obj = double('object', :aasm => 'aasm')
|
242
|
-
|
243
|
-
expect(obj).to receive(:test)
|
244
|
-
|
245
|
-
st.execute(obj, args)
|
246
|
-
end
|
247
|
-
|
248
|
-
it 'should accept a Symbol for the method name' do
|
249
|
-
opts = {:from => 'foo', :to => 'bar', :after => :test}
|
250
|
-
st = AASM::Core::Transition.new(event, opts)
|
251
|
-
args = {:arg1 => '1', :arg2 => '2'}
|
252
|
-
obj = double('object', :aasm => 'aasm')
|
253
|
-
|
254
|
-
expect(obj).to receive(:test)
|
255
|
-
|
256
|
-
st.execute(obj, args)
|
257
|
-
end
|
258
|
-
|
259
|
-
it 'should pass args if the target method accepts them' do
|
260
|
-
opts = {:from => 'foo', :to => 'bar', :after => :test}
|
261
|
-
st = AASM::Core::Transition.new(event, opts)
|
262
|
-
args = {:arg1 => '1', :arg2 => '2'}
|
263
|
-
obj = double('object', :aasm => 'aasm')
|
264
|
-
|
265
|
-
def obj.test(args)
|
266
|
-
"arg1: #{args[:arg1]} arg2: #{args[:arg2]}"
|
267
|
-
end
|
268
|
-
|
269
|
-
return_value = st.execute(obj, args)
|
270
|
-
|
271
|
-
expect(return_value).to eq('arg1: 1 arg2: 2')
|
272
|
-
end
|
273
|
-
|
274
|
-
it 'should NOT pass args if the target method does NOT accept them' do
|
275
|
-
opts = {:from => 'foo', :to => 'bar', :after => :test}
|
276
|
-
st = AASM::Core::Transition.new(event, opts)
|
277
|
-
args = {:arg1 => '1', :arg2 => '2'}
|
278
|
-
obj = double('object', :aasm => 'aasm')
|
279
|
-
|
280
|
-
def obj.test
|
281
|
-
'success'
|
282
|
-
end
|
283
|
-
|
284
|
-
return_value = st.execute(obj, args)
|
285
|
-
|
286
|
-
expect(return_value).to eq('success')
|
287
|
-
end
|
288
|
-
|
289
|
-
it 'should allow accessing the from_state and the to_state' do
|
290
|
-
opts = {:from => 'foo', :to => 'bar', :after => :test}
|
291
|
-
transition = AASM::Core::Transition.new(event, opts)
|
292
|
-
args = {:arg1 => '1', :arg2 => '2'}
|
293
|
-
obj = double('object', :aasm => AASM::InstanceBase.new('object'))
|
294
|
-
|
295
|
-
def obj.test(args)
|
296
|
-
"from: #{aasm.from_state} to: #{aasm.to_state}"
|
297
|
-
end
|
298
|
-
|
299
|
-
return_value = transition.execute(obj, args)
|
300
|
-
|
301
|
-
expect(return_value).to eq('from: foo to: bar')
|
302
|
-
end
|
303
|
-
|
304
|
-
end
|
305
|
-
|
306
|
-
describe AASM::Core::Transition, '- when executing the transition with a Class' do
|
307
|
-
let(:state_machine) { AASM::StateMachine.new(:name) }
|
308
|
-
let(:event) { AASM::Core::Event.new(:event, state_machine) }
|
309
|
-
|
310
|
-
class AfterTransitionClass
|
311
|
-
def initialize(record)
|
312
|
-
@record = record
|
313
|
-
end
|
314
|
-
|
315
|
-
def call
|
316
|
-
"from: #{@record.aasm.from_state} to: #{@record.aasm.to_state}"
|
317
|
-
end
|
318
|
-
end
|
319
|
-
|
320
|
-
class AfterTransitionClassWithArgs
|
321
|
-
def initialize(record, args)
|
322
|
-
@record = record
|
323
|
-
@args = args
|
324
|
-
end
|
325
|
-
|
326
|
-
def call
|
327
|
-
"arg1: #{@args[:arg1]}, arg2: #{@args[:arg2]}"
|
328
|
-
end
|
329
|
-
end
|
330
|
-
|
331
|
-
class AfterTransitionClassWithoutArgs
|
332
|
-
def call
|
333
|
-
'success'
|
334
|
-
end
|
335
|
-
end
|
336
|
-
|
337
|
-
it 'passes the record to the initialize method on the class to give access to the from_state and to_state' do
|
338
|
-
opts = {:from => 'foo', :to => 'bar', :after => AfterTransitionClass}
|
339
|
-
transition = AASM::Core::Transition.new(event, opts)
|
340
|
-
obj = double('object', :aasm => AASM::InstanceBase.new('object'))
|
341
|
-
|
342
|
-
return_value = transition.execute(obj)
|
343
|
-
|
344
|
-
expect(return_value).to eq('from: foo to: bar')
|
345
|
-
end
|
346
|
-
|
347
|
-
it 'should pass args to the initialize method on the class if it accepts them' do
|
348
|
-
opts = {:from => 'foo', :to => 'bar', :after => AfterTransitionClassWithArgs}
|
349
|
-
st = AASM::Core::Transition.new(event, opts)
|
350
|
-
args = {:arg1 => '1', :arg2 => '2'}
|
351
|
-
obj = double('object', :aasm => 'aasm')
|
352
|
-
|
353
|
-
return_value = st.execute(obj, args)
|
354
|
-
|
355
|
-
expect(return_value).to eq('arg1: 1, arg2: 2')
|
356
|
-
end
|
357
|
-
|
358
|
-
it 'should NOT pass args if the call method of the class if it does NOT accept them' do
|
359
|
-
opts = {:from => 'foo', :to => 'bar', :after => AfterTransitionClassWithoutArgs}
|
360
|
-
st = AASM::Core::Transition.new(event, opts)
|
361
|
-
obj = double('object', :aasm => 'aasm')
|
362
|
-
|
363
|
-
return_value = st.execute(obj)
|
364
|
-
|
365
|
-
expect(return_value).to eq('success')
|
366
|
-
end
|
367
|
-
end
|
368
|
-
|
369
|
-
describe AASM::Core::Transition, '- when invoking the transition :success method call' do
|
370
|
-
let(:state_machine) { AASM::StateMachine.new(:name) }
|
371
|
-
let(:event) { AASM::Core::Event.new(:event, state_machine) }
|
372
|
-
|
373
|
-
it 'should accept a String for the method name' do
|
374
|
-
opts = {:from => 'foo', :to => 'bar', :success => 'test'}
|
375
|
-
st = AASM::Core::Transition.new(event, opts)
|
376
|
-
args = {:arg1 => '1', :arg2 => '2'}
|
377
|
-
obj = double('object', :aasm => 'aasm')
|
378
|
-
|
379
|
-
expect(obj).to receive(:test)
|
380
|
-
|
381
|
-
st.invoke_success_callbacks(obj, args)
|
382
|
-
end
|
383
|
-
|
384
|
-
it 'should accept a Symbol for the method name' do
|
385
|
-
opts = {:from => 'foo', :to => 'bar', :success => :test}
|
386
|
-
st = AASM::Core::Transition.new(event, opts)
|
387
|
-
args = {:arg1 => '1', :arg2 => '2'}
|
388
|
-
obj = double('object', :aasm => 'aasm')
|
389
|
-
|
390
|
-
expect(obj).to receive(:test)
|
391
|
-
|
392
|
-
st.invoke_success_callbacks(obj, args)
|
393
|
-
end
|
394
|
-
|
395
|
-
it 'should accept a Array for the method name' do
|
396
|
-
opts = {:from => 'foo', :to => 'bar', :success => [:test1, :test2]}
|
397
|
-
st = AASM::Core::Transition.new(event, opts)
|
398
|
-
args = {:arg1 => '1', :arg2 => '2'}
|
399
|
-
obj = double('object', :aasm => 'aasm')
|
400
|
-
|
401
|
-
expect(obj).to receive(:test1)
|
402
|
-
expect(obj).to receive(:test2)
|
403
|
-
|
404
|
-
st.invoke_success_callbacks(obj, args)
|
405
|
-
end
|
406
|
-
|
407
|
-
it 'should pass args if the target method accepts them' do
|
408
|
-
opts = {:from => 'foo', :to => 'bar', :success => :test}
|
409
|
-
st = AASM::Core::Transition.new(event, opts)
|
410
|
-
args = {:arg1 => '1', :arg2 => '2'}
|
411
|
-
obj = double('object', :aasm => 'aasm')
|
412
|
-
|
413
|
-
def obj.test(args)
|
414
|
-
"arg1: #{args[:arg1]} arg2: #{args[:arg2]}"
|
415
|
-
end
|
416
|
-
|
417
|
-
return_value = st.invoke_success_callbacks(obj, args)
|
418
|
-
|
419
|
-
expect(return_value).to eq('arg1: 1 arg2: 2')
|
420
|
-
end
|
421
|
-
|
422
|
-
it 'should NOT pass args if the target method does NOT accept them' do
|
423
|
-
opts = {:from => 'foo', :to => 'bar', :success => :test}
|
424
|
-
st = AASM::Core::Transition.new(event, opts)
|
425
|
-
args = {:arg1 => '1', :arg2 => '2'}
|
426
|
-
obj = double('object', :aasm => 'aasm')
|
427
|
-
|
428
|
-
def obj.test
|
429
|
-
'success'
|
430
|
-
end
|
431
|
-
|
432
|
-
return_value = st.invoke_success_callbacks(obj, args)
|
433
|
-
|
434
|
-
expect(return_value).to eq('success')
|
435
|
-
end
|
436
|
-
end
|
data/test/minitest_helper.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__)))
|
2
|
-
$LOAD_PATH.unshift(File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec', 'models')))
|
3
|
-
$LOAD_PATH.unshift(File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')))
|
4
|
-
require 'aasm'
|
5
|
-
require 'minitest/autorun'
|
6
|
-
require 'aasm/minitest_spec'
|
7
|
-
require 'pry'
|
8
|
-
|
9
|
-
# require 'ruby-debug'; Debugger.settings[:autoeval] = true; debugger; rubys_debugger = 'annoying'
|
10
|
-
# require 'ruby-debug/completion'
|
11
|
-
# require 'pry'
|
12
|
-
|
13
|
-
SEQUEL_DB = defined?(JRUBY_VERSION) ? 'jdbc:sqlite::memory:' : 'sqlite:/'
|
14
|
-
|
15
|
-
def load_schema
|
16
|
-
require 'logger'
|
17
|
-
config = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
|
18
|
-
ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/debug.log")
|
19
|
-
ActiveRecord::Base.establish_connection(config['sqlite3'])
|
20
|
-
require File.dirname(__FILE__) + "/database.rb"
|
21
|
-
end
|
22
|
-
|
23
|
-
# Dynamoid initialization
|
24
|
-
begin
|
25
|
-
require 'dynamoid'
|
26
|
-
require 'aws-sdk-resources'
|
27
|
-
|
28
|
-
ENV['ACCESS_KEY'] ||= 'abcd'
|
29
|
-
ENV['SECRET_KEY'] ||= '1234'
|
30
|
-
|
31
|
-
Aws.config.update({
|
32
|
-
region: 'us-west-2',
|
33
|
-
credentials: Aws::Credentials.new(ENV['ACCESS_KEY'], ENV['SECRET_KEY'])
|
34
|
-
})
|
35
|
-
|
36
|
-
Dynamoid.configure do |config|
|
37
|
-
config.namespace = 'dynamoid_tests'
|
38
|
-
config.endpoint = "http://#{ENV['DYNAMODB_HOST'] || '127.0.0.1'}:30180"
|
39
|
-
config.warn_on_scan = false
|
40
|
-
end
|
41
|
-
|
42
|
-
Dynamoid.logger.level = Logger::FATAL
|
43
|
-
|
44
|
-
class Minitest::Spec
|
45
|
-
before do
|
46
|
-
Dynamoid.adapter.list_tables.each do |table|
|
47
|
-
Dynamoid.adapter.delete_table(table) if table =~ /^#{Dynamoid::Config.namespace}/
|
48
|
-
end
|
49
|
-
Dynamoid.adapter.tables.clear
|
50
|
-
end
|
51
|
-
end
|
52
|
-
rescue LoadError
|
53
|
-
# Without Dynamoid settings
|
54
|
-
end
|
55
|
-
|
56
|
-
# example model classes
|
57
|
-
Dir[File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec', 'models')) + '/*.rb'].sort.each { |f| require File.expand_path(f) }
|
@@ -1,80 +0,0 @@
|
|
1
|
-
require 'minitest_helper'
|
2
|
-
|
3
|
-
class StateMachineTest < Minitest::Spec
|
4
|
-
|
5
|
-
let(:simple) { SimpleExample.new }
|
6
|
-
let(:multiple) { SimpleMultipleExample.new }
|
7
|
-
|
8
|
-
describe 'transition_from' do
|
9
|
-
it "works for simple state machines" do
|
10
|
-
simple.must_transition_from :initialised, to: :filled_out, on_event: :fill_out
|
11
|
-
simple.wont_transition_from :initialised, to: :authorised, on_event: :fill_out
|
12
|
-
end
|
13
|
-
|
14
|
-
it "works for multiple state machines" do
|
15
|
-
multiple.must_transition_from :standing, to: :walking, on_event: :walk, on: :move
|
16
|
-
multiple.wont_transition_from :standing, to: :running, on_event: :walk, on: :move
|
17
|
-
|
18
|
-
multiple.must_transition_from :sleeping, to: :processing, on_event: :start, on: :work
|
19
|
-
multiple.wont_transition_from :sleeping, to: :sleeping, on_event: :start, on: :work
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
describe 'allow_transition_to' do
|
24
|
-
it "works for simple state machines" do
|
25
|
-
simple.must_allow_transition_to :filled_out
|
26
|
-
simple.wont_allow_transition_to :authorised
|
27
|
-
end
|
28
|
-
|
29
|
-
it "works for multiple state machines" do
|
30
|
-
multiple.must_allow_transition_to :walking, on: :move
|
31
|
-
multiple.wont_allow_transition_to :standing, on: :move
|
32
|
-
|
33
|
-
multiple.must_allow_transition_to :processing, on: :work
|
34
|
-
multiple.wont_allow_transition_to :sleeping, on: :work
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe "have_state" do
|
39
|
-
it "works for simple state machines" do
|
40
|
-
simple.must_have_state :initialised
|
41
|
-
simple.wont_have_state :filled_out
|
42
|
-
simple.fill_out
|
43
|
-
simple.must_have_state :filled_out
|
44
|
-
end
|
45
|
-
|
46
|
-
it "works for multiple state machines" do
|
47
|
-
multiple.must_have_state :standing, on: :move
|
48
|
-
multiple.wont_have_state :walking, on: :move
|
49
|
-
multiple.walk
|
50
|
-
multiple.must_have_state :walking, on: :move
|
51
|
-
|
52
|
-
multiple.must_have_state :sleeping, on: :work
|
53
|
-
multiple.wont_have_state :processing, on: :work
|
54
|
-
multiple.start
|
55
|
-
multiple.must_have_state :processing, on: :work
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
describe "allow_event" do
|
60
|
-
it "works for simple state machines" do
|
61
|
-
simple.must_allow_event :fill_out
|
62
|
-
simple.wont_allow_event :authorise
|
63
|
-
simple.fill_out
|
64
|
-
simple.must_allow_event :authorise
|
65
|
-
end
|
66
|
-
|
67
|
-
it "works for multiple state machines" do
|
68
|
-
multiple.must_allow_event :walk, on: :move
|
69
|
-
multiple.wont_allow_event :hold, on: :move
|
70
|
-
multiple.walk
|
71
|
-
multiple.must_allow_event :hold, on: :move
|
72
|
-
|
73
|
-
multiple.must_allow_event :start, on: :work
|
74
|
-
multiple.wont_allow_event :stop, on: :work
|
75
|
-
multiple.start
|
76
|
-
multiple.must_allow_event :stop, on: :work
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
end
|