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,368 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
if defined?(Sequel)
|
3
|
-
describe 'sequel' do
|
4
|
-
|
5
|
-
Dir[File.dirname(__FILE__) + "/../../models/sequel/*.rb"].sort.each do |f|
|
6
|
-
require File.expand_path(f)
|
7
|
-
end
|
8
|
-
|
9
|
-
before(:all) do
|
10
|
-
@model = Sequel::Simple
|
11
|
-
end
|
12
|
-
|
13
|
-
describe "instance methods" do
|
14
|
-
let(:model) {@model.new}
|
15
|
-
|
16
|
-
it "should respond to aasm persistence methods" do
|
17
|
-
expect(model).to respond_to(:aasm_read_state)
|
18
|
-
expect(model).to respond_to(:aasm_write_state)
|
19
|
-
expect(model).to respond_to(:aasm_write_state_without_persistence)
|
20
|
-
end
|
21
|
-
|
22
|
-
it "should return the initial state when new and the aasm field is nil" do
|
23
|
-
expect(model.aasm.current_state).to eq(:alpha)
|
24
|
-
end
|
25
|
-
|
26
|
-
it "should save the initial state" do
|
27
|
-
model.save
|
28
|
-
expect(model.status).to eq("alpha")
|
29
|
-
end
|
30
|
-
|
31
|
-
it "should return the aasm column when new and the aasm field is not nil" do
|
32
|
-
model.status = "beta"
|
33
|
-
expect(model.aasm.current_state).to eq(:beta)
|
34
|
-
end
|
35
|
-
|
36
|
-
it "should return the aasm column when not new and the aasm_column is not nil" do
|
37
|
-
allow(model).to receive(:new?).and_return(false)
|
38
|
-
model.status = "gamma"
|
39
|
-
expect(model.aasm.current_state).to eq(:gamma)
|
40
|
-
end
|
41
|
-
|
42
|
-
it "should allow a nil state" do
|
43
|
-
allow(model).to receive(:new?).and_return(false)
|
44
|
-
model.status = nil
|
45
|
-
expect(model.aasm.current_state).to be_nil
|
46
|
-
end
|
47
|
-
|
48
|
-
it "should not change the state if state is not loaded" do
|
49
|
-
model.release
|
50
|
-
model.save
|
51
|
-
model.class.select(:id).first.save
|
52
|
-
model.reload
|
53
|
-
expect(model.aasm.current_state).to eq(:beta)
|
54
|
-
end
|
55
|
-
|
56
|
-
it "should call aasm_ensure_initial_state on validation before create" do
|
57
|
-
expect(model).to receive(:aasm_ensure_initial_state).and_return(true)
|
58
|
-
model.valid?
|
59
|
-
end
|
60
|
-
|
61
|
-
it "should call aasm_ensure_initial_state before create, even if skipping validations" do
|
62
|
-
expect(model).to receive(:aasm_ensure_initial_state).and_return(true)
|
63
|
-
model.save(:validate => false)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
describe 'subclasses' do
|
68
|
-
it "should have the same states as its parent class" do
|
69
|
-
expect(Class.new(@model).aasm.states).to eq(@model.aasm.states)
|
70
|
-
end
|
71
|
-
|
72
|
-
it "should have the same events as its parent class" do
|
73
|
-
expect(Class.new(@model).aasm.events).to eq(@model.aasm.events)
|
74
|
-
end
|
75
|
-
|
76
|
-
it "should have the same column as its parent even for the new dsl" do
|
77
|
-
expect(@model.aasm.attribute_name).to eq(:status)
|
78
|
-
expect(Class.new(@model).aasm.attribute_name).to eq(:status)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
describe 'initial states' do
|
83
|
-
it 'should support conditions' do
|
84
|
-
@model.aasm do
|
85
|
-
initial_state lambda{ |m| m.default }
|
86
|
-
end
|
87
|
-
|
88
|
-
expect(@model.new(:default => :beta).aasm.current_state).to eq(:beta)
|
89
|
-
expect(@model.new(:default => :gamma).aasm.current_state).to eq(:gamma)
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
describe 'transitions with persistence' do
|
94
|
-
|
95
|
-
it "should work for valid models" do
|
96
|
-
valid_object = Sequel::Validator.create(:name => 'name')
|
97
|
-
expect(valid_object).to be_sleeping
|
98
|
-
valid_object.status = :running
|
99
|
-
expect(valid_object).to be_running
|
100
|
-
end
|
101
|
-
|
102
|
-
it 'should not store states for invalid models' do
|
103
|
-
validator = Sequel::Validator.create(:name => 'name')
|
104
|
-
expect(validator).to be_valid
|
105
|
-
expect(validator).to be_sleeping
|
106
|
-
|
107
|
-
validator.name = nil
|
108
|
-
expect(validator).not_to be_valid
|
109
|
-
expect { validator.run! }.to raise_error(Sequel::ValidationFailed)
|
110
|
-
expect(validator).to be_sleeping
|
111
|
-
|
112
|
-
validator.reload
|
113
|
-
expect(validator).not_to be_running
|
114
|
-
expect(validator).to be_sleeping
|
115
|
-
|
116
|
-
validator.name = 'another name'
|
117
|
-
expect(validator).to be_valid
|
118
|
-
expect(validator.run!).to be_truthy
|
119
|
-
expect(validator).to be_running
|
120
|
-
|
121
|
-
validator.reload
|
122
|
-
expect(validator).to be_running
|
123
|
-
expect(validator).not_to be_sleeping
|
124
|
-
end
|
125
|
-
|
126
|
-
it 'should not store states for invalid models silently if configured' do
|
127
|
-
validator = Sequel::SilentPersistor.create(:name => 'name')
|
128
|
-
expect(validator).to be_valid
|
129
|
-
expect(validator).to be_sleeping
|
130
|
-
|
131
|
-
validator.name = nil
|
132
|
-
expect(validator).not_to be_valid
|
133
|
-
expect(validator.run!).to be_falsey
|
134
|
-
expect(validator).to be_sleeping
|
135
|
-
|
136
|
-
validator.reload
|
137
|
-
expect(validator).not_to be_running
|
138
|
-
expect(validator).to be_sleeping
|
139
|
-
|
140
|
-
validator.name = 'another name'
|
141
|
-
expect(validator).to be_valid
|
142
|
-
expect(validator.run!).to be_truthy
|
143
|
-
expect(validator).to be_running
|
144
|
-
|
145
|
-
validator.reload
|
146
|
-
expect(validator).to be_running
|
147
|
-
expect(validator).not_to be_sleeping
|
148
|
-
end
|
149
|
-
|
150
|
-
it 'should store states for invalid models if configured' do
|
151
|
-
persistor = Sequel::InvalidPersistor.create(:name => 'name')
|
152
|
-
expect(persistor).to be_valid
|
153
|
-
expect(persistor).to be_sleeping
|
154
|
-
|
155
|
-
persistor.name = nil
|
156
|
-
expect(persistor).not_to be_valid
|
157
|
-
expect(persistor.run!).to be_truthy
|
158
|
-
expect(persistor).to be_running
|
159
|
-
|
160
|
-
persistor = Sequel::InvalidPersistor[persistor.id]
|
161
|
-
persistor.valid?
|
162
|
-
expect(persistor).to be_valid
|
163
|
-
expect(persistor).to be_running
|
164
|
-
expect(persistor).not_to be_sleeping
|
165
|
-
|
166
|
-
persistor.reload
|
167
|
-
expect(persistor).to be_running
|
168
|
-
expect(persistor).not_to be_sleeping
|
169
|
-
end
|
170
|
-
|
171
|
-
describe 'pessimistic locking' do
|
172
|
-
let(:worker) { Sequel::Worker.create(:name => 'worker', :status => 'sleeping') }
|
173
|
-
|
174
|
-
subject { transactor.run! }
|
175
|
-
|
176
|
-
context 'no lock' do
|
177
|
-
let(:transactor) { Sequel::NoLockTransactor.create(:name => 'no_lock_transactor', :worker => worker) }
|
178
|
-
|
179
|
-
it 'should not invoke lock!' do
|
180
|
-
expect(transactor).to_not receive(:lock!)
|
181
|
-
subject
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
context 'a default lock' do
|
186
|
-
let(:transactor) { Sequel::LockTransactor.create(:name => 'lock_transactor', :worker => worker) }
|
187
|
-
|
188
|
-
it 'should invoke lock!' do
|
189
|
-
expect(transactor).to receive(:lock!).and_call_original
|
190
|
-
subject
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
|
-
context 'a FOR UPDATE NOWAIT lock' do
|
195
|
-
let(:transactor) { Sequel::LockNoWaitTransactor.create(:name => 'lock_no_wait_transactor', :worker => worker) }
|
196
|
-
|
197
|
-
it 'should invoke lock! with FOR UPDATE NOWAIT' do
|
198
|
-
# TODO: With and_call_original, get an error with syntax, should look into it.
|
199
|
-
expect(transactor).to receive(:lock!).with('FOR UPDATE NOWAIT')# .and_call_original
|
200
|
-
subject
|
201
|
-
end
|
202
|
-
end
|
203
|
-
end
|
204
|
-
|
205
|
-
describe 'transactions' do
|
206
|
-
let(:worker) { Sequel::Worker.create(:name => 'worker', :status => 'sleeping') }
|
207
|
-
let(:transactor) { Sequel::Transactor.create(:name => 'transactor', :worker => worker) }
|
208
|
-
|
209
|
-
it 'should rollback all changes' do
|
210
|
-
expect(transactor).to be_sleeping
|
211
|
-
expect(worker.status).to eq('sleeping')
|
212
|
-
|
213
|
-
expect {transactor.run!}.to raise_error(StandardError, 'failed on purpose')
|
214
|
-
expect(transactor).to be_running
|
215
|
-
expect(worker.reload.status).to eq('sleeping')
|
216
|
-
end
|
217
|
-
|
218
|
-
context "nested transactions" do
|
219
|
-
it "should rollback all changes in nested transaction" do
|
220
|
-
expect(transactor).to be_sleeping
|
221
|
-
expect(worker.status).to eq('sleeping')
|
222
|
-
|
223
|
-
Sequel::Worker.db.transaction do
|
224
|
-
expect { transactor.run! }.to raise_error(StandardError, 'failed on purpose')
|
225
|
-
end
|
226
|
-
|
227
|
-
expect(transactor).to be_running
|
228
|
-
expect(worker.reload.status).to eq('sleeping')
|
229
|
-
end
|
230
|
-
|
231
|
-
it "should only rollback changes in the main transaction not the nested one" do
|
232
|
-
# change configuration to not require new transaction
|
233
|
-
AASM::StateMachineStore[Sequel::Transactor][:default].config.requires_new_transaction = false
|
234
|
-
|
235
|
-
expect(transactor).to be_sleeping
|
236
|
-
expect(worker.status).to eq('sleeping')
|
237
|
-
Sequel::Worker.db.transaction do
|
238
|
-
expect { transactor.run! }.to raise_error(StandardError, 'failed on purpose')
|
239
|
-
end
|
240
|
-
expect(transactor).to be_running
|
241
|
-
expect(worker.reload.status).to eq('running')
|
242
|
-
end
|
243
|
-
end
|
244
|
-
|
245
|
-
describe "after_commit callback" do
|
246
|
-
it "should fire :after_commit if transaction was successful" do
|
247
|
-
validator = Sequel::Validator.create(:name => 'name')
|
248
|
-
expect(validator).to be_sleeping
|
249
|
-
|
250
|
-
validator.run!
|
251
|
-
expect(validator).to be_running
|
252
|
-
expect(validator.name).to eq("name changed")
|
253
|
-
|
254
|
-
validator.sleep!("sleeper")
|
255
|
-
expect(validator).to be_sleeping
|
256
|
-
expect(validator.name).to eq("sleeper")
|
257
|
-
end
|
258
|
-
|
259
|
-
it "should not fire :after_commit if transaction failed" do
|
260
|
-
validator = Sequel::Validator.create(:name => 'name')
|
261
|
-
expect { validator.fail! }.to raise_error(StandardError, 'failed on purpose')
|
262
|
-
expect(validator.name).to eq("name")
|
263
|
-
end
|
264
|
-
|
265
|
-
it "should not fire :after_commit if validation failed when saving object" do
|
266
|
-
validator = Sequel::Validator.create(:name => 'name')
|
267
|
-
validator.invalid = true
|
268
|
-
expect { validator.run! }.to raise_error(Sequel::ValidationFailed, 'validator invalid')
|
269
|
-
expect(validator).to be_sleeping
|
270
|
-
expect(validator.name).to eq("name")
|
271
|
-
end
|
272
|
-
|
273
|
-
it "should not fire if not saving" do
|
274
|
-
validator = Sequel::Validator.create(:name => 'name')
|
275
|
-
expect(validator).to be_sleeping
|
276
|
-
validator.run
|
277
|
-
expect(validator).to be_running
|
278
|
-
expect(validator.name).to eq("name")
|
279
|
-
end
|
280
|
-
end
|
281
|
-
|
282
|
-
describe 'before and after transaction callbacks' do
|
283
|
-
[:after, :before].each do |event_type|
|
284
|
-
describe "#{event_type}_transaction callback" do
|
285
|
-
it "should fire :#{event_type}_transaction if transaction was successful" do
|
286
|
-
validator = Sequel::Validator.create(:name => 'name')
|
287
|
-
expect(validator).to be_sleeping
|
288
|
-
|
289
|
-
expect { validator.run! }.to change { validator.send("#{event_type}_transaction_performed_on_run") }.from(nil).to(true)
|
290
|
-
expect(validator).to be_running
|
291
|
-
end
|
292
|
-
|
293
|
-
it "should fire :#{event_type}_transaction if transaction failed" do
|
294
|
-
validator = Sequel::Validator.create(:name => 'name')
|
295
|
-
expect do
|
296
|
-
begin
|
297
|
-
validator.fail!
|
298
|
-
rescue => ignored
|
299
|
-
end
|
300
|
-
end.to change { validator.send("#{event_type}_transaction_performed_on_fail") }.from(nil).to(true)
|
301
|
-
expect(validator).to_not be_running
|
302
|
-
end
|
303
|
-
|
304
|
-
it "should not fire :#{event_type}_transaction if not saving" do
|
305
|
-
validator = Sequel::Validator.create(:name => 'name')
|
306
|
-
expect(validator).to be_sleeping
|
307
|
-
expect { validator.run }.to_not change { validator.send("#{event_type}_transaction_performed_on_run") }
|
308
|
-
expect(validator).to be_running
|
309
|
-
expect(validator.name).to eq("name")
|
310
|
-
end
|
311
|
-
end
|
312
|
-
end
|
313
|
-
end
|
314
|
-
|
315
|
-
describe 'before and after all transactions callbacks' do
|
316
|
-
[:after, :before].each do |event_type|
|
317
|
-
describe "#{event_type}_all_transactions callback" do
|
318
|
-
it "should fire :#{event_type}_all_transactions if transaction was successful" do
|
319
|
-
validator = Sequel::Validator.create(:name => 'name')
|
320
|
-
expect(validator).to be_sleeping
|
321
|
-
|
322
|
-
expect { validator.run! }.to change { validator.send("#{event_type}_all_transactions_performed") }.from(nil).to(true)
|
323
|
-
expect(validator).to be_running
|
324
|
-
end
|
325
|
-
|
326
|
-
it "should fire :#{event_type}_all_transactions if transaction failed" do
|
327
|
-
validator = Sequel::Validator.create(:name => 'name')
|
328
|
-
expect do
|
329
|
-
begin
|
330
|
-
validator.fail!
|
331
|
-
rescue => ignored
|
332
|
-
end
|
333
|
-
end.to change { validator.send("#{event_type}_all_transactions_performed") }.from(nil).to(true)
|
334
|
-
expect(validator).to_not be_running
|
335
|
-
end
|
336
|
-
|
337
|
-
it "should not fire :#{event_type}_all_transactions if not saving" do
|
338
|
-
validator = Sequel::Validator.create(:name => 'name')
|
339
|
-
expect(validator).to be_sleeping
|
340
|
-
expect { validator.run }.to_not change { validator.send("#{event_type}_all_transactions_performed") }
|
341
|
-
expect(validator).to be_running
|
342
|
-
expect(validator.name).to eq("name")
|
343
|
-
end
|
344
|
-
end
|
345
|
-
end
|
346
|
-
end
|
347
|
-
|
348
|
-
context "when not persisting" do
|
349
|
-
it 'should not rollback all changes' do
|
350
|
-
expect(transactor).to be_sleeping
|
351
|
-
expect(worker.status).to eq('sleeping')
|
352
|
-
|
353
|
-
# Notice here we're calling "run" and not "run!" with a bang.
|
354
|
-
expect {transactor.run}.to raise_error(StandardError, 'failed on purpose')
|
355
|
-
expect(transactor).to be_running
|
356
|
-
expect(worker.reload.status).to eq('running')
|
357
|
-
end
|
358
|
-
|
359
|
-
it 'should not create a database transaction' do
|
360
|
-
expect(transactor.class).not_to receive(:transaction)
|
361
|
-
expect {transactor.run}.to raise_error(StandardError, 'failed on purpose')
|
362
|
-
end
|
363
|
-
end
|
364
|
-
end
|
365
|
-
end
|
366
|
-
|
367
|
-
end
|
368
|
-
end
|
data/spec/unit/readme_spec.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe 'testing the README examples' do
|
4
|
-
|
5
|
-
it 'Usage' do
|
6
|
-
class Job
|
7
|
-
include AASM
|
8
|
-
|
9
|
-
aasm do
|
10
|
-
state :sleeping, :initial => true
|
11
|
-
state :running, :cleaning
|
12
|
-
|
13
|
-
event :run do
|
14
|
-
transitions :from => :sleeping, :to => :running
|
15
|
-
end
|
16
|
-
|
17
|
-
event :clean do
|
18
|
-
transitions :from => :running, :to => :cleaning
|
19
|
-
end
|
20
|
-
|
21
|
-
event :sleep do
|
22
|
-
transitions :from => [:running, :cleaning], :to => :sleeping
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
job = Job.new
|
28
|
-
|
29
|
-
expect(job.sleeping?).to eql true
|
30
|
-
expect(job.may_run?).to eql true
|
31
|
-
|
32
|
-
job.run
|
33
|
-
|
34
|
-
expect(job.running?).to eql true
|
35
|
-
expect(job.sleeping?).to eql false
|
36
|
-
expect(job.may_run?).to eql false
|
37
|
-
|
38
|
-
expect { job.run }.to raise_error(AASM::InvalidTransition)
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
data/spec/unit/reloading_spec.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe 'when redefining states' do
|
4
|
-
let(:definer) { DoubleDefiner.new }
|
5
|
-
|
6
|
-
it "allows extending states" do
|
7
|
-
expect(definer).to receive(:do_enter)
|
8
|
-
definer.finish
|
9
|
-
end
|
10
|
-
|
11
|
-
it "allows extending events" do
|
12
|
-
expect(definer).to receive(:do_on_transition)
|
13
|
-
definer.finish
|
14
|
-
end
|
15
|
-
end
|
@@ -1,85 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe 'state machine' do
|
4
|
-
let(:simple) { SimpleExample.new }
|
5
|
-
let(:multiple) { SimpleMultipleExample.new }
|
6
|
-
|
7
|
-
describe 'transition_from' do
|
8
|
-
it "works for simple state machines" do
|
9
|
-
expect(simple).to transition_from(:initialised).to(:filled_out).on_event(:fill_out)
|
10
|
-
expect(simple).to_not transition_from(:initialised).to(:authorised).on_event(:fill_out)
|
11
|
-
end
|
12
|
-
|
13
|
-
it "works for multiple state machines" do
|
14
|
-
expect(multiple).to transition_from(:standing).to(:walking).on_event(:walk).on(:move)
|
15
|
-
expect(multiple).to_not transition_from(:standing).to(:running).on_event(:walk).on(:move)
|
16
|
-
|
17
|
-
expect(multiple).to transition_from(:sleeping).to(:processing).on_event(:start).on(:work)
|
18
|
-
expect(multiple).to_not transition_from(:sleeping).to(:sleeping).on_event(:start).on(:work)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
describe 'allow_transition_to' do
|
23
|
-
it "works for simple state machines" do
|
24
|
-
expect(simple).to allow_transition_to(:filled_out)
|
25
|
-
expect(simple).to_not allow_transition_to(:authorised)
|
26
|
-
end
|
27
|
-
|
28
|
-
it "works for multiple state machines" do
|
29
|
-
expect(multiple).to allow_transition_to(:walking).on(:move)
|
30
|
-
expect(multiple).to_not allow_transition_to(:standing).on(:move)
|
31
|
-
|
32
|
-
expect(multiple).to allow_transition_to(:processing).on(:work)
|
33
|
-
expect(multiple).to_not allow_transition_to(:sleeping).on(:work)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
describe "have_state" do
|
38
|
-
it "works for simple state machines" do
|
39
|
-
expect(simple).to have_state :initialised
|
40
|
-
expect(simple).to_not have_state :filled_out
|
41
|
-
simple.fill_out
|
42
|
-
expect(simple).to have_state :filled_out
|
43
|
-
end
|
44
|
-
|
45
|
-
it "works for multiple state machines" do
|
46
|
-
expect(multiple).to have_state(:standing).on(:move)
|
47
|
-
expect(multiple).to_not have_state(:walking).on(:move)
|
48
|
-
multiple.walk
|
49
|
-
expect(multiple).to have_state(:walking).on(:move)
|
50
|
-
|
51
|
-
expect(multiple).to have_state(:sleeping).on(:work)
|
52
|
-
expect(multiple).to_not have_state(:processing).on(:work)
|
53
|
-
multiple.start
|
54
|
-
expect(multiple).to have_state(:processing).on(:work)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
describe "allow_event" do
|
59
|
-
it "works for simple state machines" do
|
60
|
-
expect(simple).to allow_event :fill_out
|
61
|
-
expect(simple).to_not allow_event :authorise
|
62
|
-
simple.fill_out
|
63
|
-
expect(simple).to allow_event :authorise
|
64
|
-
end
|
65
|
-
|
66
|
-
it "works with custom arguments" do
|
67
|
-
example = SimpleExampleWithGuardArgs.new
|
68
|
-
expect(example).to allow_event(:fill_out_with_args).with(true)
|
69
|
-
expect(example).to_not allow_event(:fill_out_with_args).with(false)
|
70
|
-
end
|
71
|
-
|
72
|
-
it "works for multiple state machines" do
|
73
|
-
expect(multiple).to allow_event(:walk).on(:move)
|
74
|
-
expect(multiple).to_not allow_event(:hold).on(:move)
|
75
|
-
multiple.walk
|
76
|
-
expect(multiple).to allow_event(:hold).on(:move)
|
77
|
-
|
78
|
-
expect(multiple).to allow_event(:start).on(:work)
|
79
|
-
expect(multiple).to_not allow_event(:stop).on(:work)
|
80
|
-
multiple.start
|
81
|
-
expect(multiple).to allow_event(:stop).on(:work)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe 'Custom AASM::Base' do
|
4
|
-
context 'when aasm_with invoked with SimpleCustomExample' do
|
5
|
-
let(:simple_custom) { SimpleCustomExample.new }
|
6
|
-
|
7
|
-
subject do
|
8
|
-
simple_custom.fill_out!
|
9
|
-
simple_custom.authorise
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'has invoked authorizable?' do
|
13
|
-
expect { subject }.to change { simple_custom.authorizable_called }.from(nil).to(true)
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'has invoked fillable?' do
|
17
|
-
expect { subject }.to change { simple_custom.fillable_called }.from(nil).to(true)
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'has two transition counts' do
|
21
|
-
expect { subject }.to change { simple_custom.transition_count }.from(nil).to(2)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
context 'when aasm_with invoked with non AASM::Base' do
|
26
|
-
subject do
|
27
|
-
Class.new do
|
28
|
-
include AASM
|
29
|
-
|
30
|
-
aasm :with_klass => String do
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'should raise an ArgumentError' do
|
36
|
-
expect { subject }.to raise_error(ArgumentError, 'The class String must inherit from AASM::Base!')
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe 'state machine' do
|
4
|
-
let(:simple) { SimpleExample.new }
|
5
|
-
|
6
|
-
it 'starts with an initial state' do
|
7
|
-
expect(simple.aasm.current_state).to eq(:initialised)
|
8
|
-
expect(simple).to respond_to(:initialised?)
|
9
|
-
expect(simple).to be_initialised
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'allows transitions to other states' do
|
13
|
-
expect(simple).to respond_to(:fill_out)
|
14
|
-
expect(simple).to respond_to(:fill_out!)
|
15
|
-
simple.fill_out!
|
16
|
-
expect(simple).to respond_to(:filled_out?)
|
17
|
-
expect(simple).to be_filled_out
|
18
|
-
|
19
|
-
expect(simple).to respond_to(:authorise)
|
20
|
-
expect(simple).to respond_to(:authorise!)
|
21
|
-
simple.authorise
|
22
|
-
expect(simple).to respond_to(:authorised?)
|
23
|
-
expect(simple).to be_authorised
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'denies transitions to other states' do
|
27
|
-
expect {simple.authorise}.to raise_error(AASM::InvalidTransition)
|
28
|
-
expect {simple.authorise!}.to raise_error(AASM::InvalidTransition)
|
29
|
-
simple.fill_out
|
30
|
-
expect {simple.fill_out}.to raise_error(AASM::InvalidTransition)
|
31
|
-
expect {simple.fill_out!}.to raise_error(AASM::InvalidTransition)
|
32
|
-
simple.authorise
|
33
|
-
expect {simple.fill_out}.to raise_error(AASM::InvalidTransition)
|
34
|
-
expect {simple.fill_out!}.to raise_error(AASM::InvalidTransition)
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'defines constants for each state name' do
|
38
|
-
expect(SimpleExample::STATE_INITIALISED).to eq(:initialised)
|
39
|
-
expect(SimpleExample::STATE_FILLED_OUT).to eq(:filled_out)
|
40
|
-
expect(SimpleExample::STATE_AUTHORISED).to eq(:authorised)
|
41
|
-
end
|
42
|
-
end
|
@@ -1,91 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe 'state machine' do
|
4
|
-
let(:simple) { SimpleMultipleExample.new }
|
5
|
-
|
6
|
-
it 'starts with an initial state' do
|
7
|
-
expect(simple.aasm(:move).current_state).to eq(:standing)
|
8
|
-
expect(simple).to respond_to(:standing?)
|
9
|
-
expect(simple).to be_standing
|
10
|
-
|
11
|
-
expect(simple.aasm(:work).current_state).to eq(:sleeping)
|
12
|
-
expect(simple).to respond_to(:sleeping?)
|
13
|
-
expect(simple).to be_sleeping
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'allows transitions to other states' do
|
17
|
-
expect(simple).to respond_to(:walk)
|
18
|
-
expect(simple).to respond_to(:walk!)
|
19
|
-
simple.walk!
|
20
|
-
expect(simple).to respond_to(:walking?)
|
21
|
-
expect(simple).to be_walking
|
22
|
-
|
23
|
-
expect(simple).to respond_to(:run)
|
24
|
-
expect(simple).to respond_to(:run!)
|
25
|
-
simple.run
|
26
|
-
expect(simple).to respond_to(:running?)
|
27
|
-
expect(simple).to be_running
|
28
|
-
|
29
|
-
expect(simple).to respond_to(:start)
|
30
|
-
expect(simple).to respond_to(:start!)
|
31
|
-
simple.start
|
32
|
-
expect(simple).to respond_to(:processing?)
|
33
|
-
expect(simple).to be_processing
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'denies transitions to other states' do
|
37
|
-
expect {simple.hold}.to raise_error(AASM::InvalidTransition)
|
38
|
-
expect {simple.hold!}.to raise_error(AASM::InvalidTransition)
|
39
|
-
simple.walk
|
40
|
-
expect {simple.walk}.to raise_error(AASM::InvalidTransition)
|
41
|
-
expect {simple.walk!}.to raise_error(AASM::InvalidTransition)
|
42
|
-
simple.run
|
43
|
-
expect {simple.walk}.to raise_error(AASM::InvalidTransition)
|
44
|
-
expect {simple.walk!}.to raise_error(AASM::InvalidTransition)
|
45
|
-
|
46
|
-
expect {simple.stop}.to raise_error(AASM::InvalidTransition)
|
47
|
-
expect {simple.stop!}.to raise_error(AASM::InvalidTransition)
|
48
|
-
simple.start
|
49
|
-
expect {simple.start}.to raise_error(AASM::InvalidTransition)
|
50
|
-
expect {simple.start!}.to raise_error(AASM::InvalidTransition)
|
51
|
-
simple.stop
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'defines constants for each state name' do
|
55
|
-
expect(SimpleMultipleExample::STATE_STANDING).to eq(:standing)
|
56
|
-
expect(SimpleMultipleExample::STATE_WALKING).to eq(:walking)
|
57
|
-
expect(SimpleMultipleExample::STATE_RUNNING).to eq(:running)
|
58
|
-
|
59
|
-
expect(SimpleMultipleExample::STATE_SLEEPING).to eq(:sleeping)
|
60
|
-
expect(SimpleMultipleExample::STATE_PROCESSING).to eq(:processing)
|
61
|
-
expect(SimpleMultipleExample::STATE_RUNNING).to eq(:running)
|
62
|
-
end
|
63
|
-
|
64
|
-
context 'triggers binding_events in bindind_state_machine' do
|
65
|
-
it 'does persist' do
|
66
|
-
expect(simple).to be_sleeping
|
67
|
-
expect(simple).to be_answered
|
68
|
-
expect(simple).to receive(:start!).and_call_original
|
69
|
-
simple.ask!
|
70
|
-
expect(simple).to be_asked
|
71
|
-
expect(simple).to be_processing
|
72
|
-
expect(simple).to receive(:stop!).and_call_original
|
73
|
-
simple.answer!
|
74
|
-
expect(simple).to be_sleeping
|
75
|
-
expect(simple).to be_answered
|
76
|
-
end
|
77
|
-
|
78
|
-
it 'does not persist' do
|
79
|
-
expect(simple).to be_sleeping
|
80
|
-
expect(simple).to be_answered
|
81
|
-
expect(simple).to receive(:start).and_call_original
|
82
|
-
simple.ask
|
83
|
-
expect(simple).to be_asked
|
84
|
-
expect(simple).to be_processing
|
85
|
-
expect(simple).to receive(:stop).and_call_original
|
86
|
-
simple.answer
|
87
|
-
expect(simple).to be_sleeping
|
88
|
-
expect(simple).to be_answered
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|