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.
Files changed (231) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +243 -118
  3. data/lib/aasm/aasm.rb +29 -27
  4. data/lib/aasm/base.rb +61 -11
  5. data/lib/aasm/configuration.rb +3 -0
  6. data/lib/aasm/core/event.rb +21 -9
  7. data/lib/aasm/core/invokers/class_invoker.rb +1 -1
  8. data/lib/aasm/core/invokers/literal_invoker.rb +3 -1
  9. data/lib/aasm/core/state.rb +6 -5
  10. data/lib/aasm/core/transition.rb +1 -1
  11. data/lib/aasm/dsl_helper.rb +24 -22
  12. data/lib/aasm/errors.rb +3 -1
  13. data/lib/aasm/instance_base.rb +28 -5
  14. data/lib/aasm/localizer.rb +13 -3
  15. data/lib/aasm/persistence/active_record_persistence.rb +25 -5
  16. data/lib/aasm/persistence/base.rb +14 -3
  17. data/lib/aasm/persistence/core_data_query_persistence.rb +2 -1
  18. data/lib/aasm/persistence/dynamoid_persistence.rb +1 -1
  19. data/lib/aasm/persistence/mongoid_persistence.rb +1 -1
  20. data/lib/aasm/persistence/no_brainer_persistence.rb +1 -1
  21. data/lib/aasm/persistence/orm.rb +23 -19
  22. data/lib/aasm/persistence/redis_persistence.rb +1 -1
  23. data/lib/aasm/rspec/transition_from.rb +5 -1
  24. data/lib/aasm/version.rb +1 -1
  25. data/lib/aasm.rb +0 -2
  26. data/lib/generators/aasm/orm_helpers.rb +7 -1
  27. data/lib/generators/active_record/aasm_generator.rb +3 -1
  28. data/lib/generators/active_record/templates/migration.rb +1 -1
  29. metadata +35 -385
  30. data/.document +0 -6
  31. data/.gitignore +0 -20
  32. data/.travis.yml +0 -54
  33. data/API +0 -34
  34. data/Appraisals +0 -66
  35. data/CHANGELOG.md +0 -377
  36. data/CODE_OF_CONDUCT.md +0 -13
  37. data/CONTRIBUTING.md +0 -24
  38. data/Dockerfile +0 -44
  39. data/Gemfile +0 -6
  40. data/Gemfile.lock_old +0 -151
  41. data/HOWTO +0 -12
  42. data/PLANNED_CHANGES.md +0 -11
  43. data/README_FROM_VERSION_3_TO_4.md +0 -240
  44. data/Rakefile +0 -31
  45. data/TESTING.md +0 -25
  46. data/aasm.gemspec +0 -35
  47. data/callbacks.txt +0 -51
  48. data/docker-compose.yml +0 -40
  49. data/gemfiles/rails_3.2.gemfile +0 -13
  50. data/gemfiles/rails_4.0.gemfile +0 -15
  51. data/gemfiles/rails_4.2.gemfile +0 -16
  52. data/gemfiles/rails_4.2_mongoid_5.gemfile +0 -11
  53. data/gemfiles/rails_4.2_nobrainer.gemfile +0 -9
  54. data/gemfiles/rails_5.0.gemfile +0 -13
  55. data/gemfiles/rails_5.0_nobrainer.gemfile +0 -9
  56. data/gemfiles/rails_5.1.gemfile +0 -13
  57. data/spec/database.rb +0 -44
  58. data/spec/database.yml +0 -3
  59. data/spec/en.yml +0 -12
  60. data/spec/en_deprecated_style.yml +0 -10
  61. data/spec/generators/active_record_generator_spec.rb +0 -47
  62. data/spec/generators/mongoid_generator_spec.rb +0 -31
  63. data/spec/generators/no_brainer_generator_spec.rb +0 -29
  64. data/spec/models/active_record/basic_active_record_two_state_machines_example.rb +0 -25
  65. data/spec/models/active_record/complex_active_record_example.rb +0 -37
  66. data/spec/models/active_record/derivate_new_dsl.rb +0 -7
  67. data/spec/models/active_record/false_state.rb +0 -35
  68. data/spec/models/active_record/gate.rb +0 -39
  69. data/spec/models/active_record/invalid_persistor.rb +0 -29
  70. data/spec/models/active_record/localizer_test_model.rb +0 -34
  71. data/spec/models/active_record/no_direct_assignment.rb +0 -21
  72. data/spec/models/active_record/no_scope.rb +0 -21
  73. data/spec/models/active_record/persisted_state.rb +0 -12
  74. data/spec/models/active_record/provided_and_persisted_state.rb +0 -24
  75. data/spec/models/active_record/reader.rb +0 -7
  76. data/spec/models/active_record/readme_job.rb +0 -21
  77. data/spec/models/active_record/silent_persistor.rb +0 -29
  78. data/spec/models/active_record/simple_new_dsl.rb +0 -17
  79. data/spec/models/active_record/thief.rb +0 -29
  80. data/spec/models/active_record/transactor.rb +0 -124
  81. data/spec/models/active_record/transient.rb +0 -6
  82. data/spec/models/active_record/validator.rb +0 -118
  83. data/spec/models/active_record/with_enum.rb +0 -39
  84. data/spec/models/active_record/with_enum_without_column.rb +0 -38
  85. data/spec/models/active_record/with_false_enum.rb +0 -31
  86. data/spec/models/active_record/with_true_enum.rb +0 -39
  87. data/spec/models/active_record/worker.rb +0 -2
  88. data/spec/models/active_record/writer.rb +0 -6
  89. data/spec/models/basic_two_state_machines_example.rb +0 -25
  90. data/spec/models/callbacks/basic.rb +0 -98
  91. data/spec/models/callbacks/basic_multiple.rb +0 -75
  92. data/spec/models/callbacks/guard_within_block.rb +0 -67
  93. data/spec/models/callbacks/guard_within_block_multiple.rb +0 -66
  94. data/spec/models/callbacks/multiple_transitions_transition_guard.rb +0 -66
  95. data/spec/models/callbacks/multiple_transitions_transition_guard_multiple.rb +0 -65
  96. data/spec/models/callbacks/private_method.rb +0 -44
  97. data/spec/models/callbacks/private_method_multiple.rb +0 -44
  98. data/spec/models/callbacks/with_args.rb +0 -62
  99. data/spec/models/callbacks/with_args_multiple.rb +0 -61
  100. data/spec/models/callbacks/with_state_arg.rb +0 -30
  101. data/spec/models/callbacks/with_state_arg_multiple.rb +0 -26
  102. data/spec/models/complex_example.rb +0 -222
  103. data/spec/models/conversation.rb +0 -93
  104. data/spec/models/default_state.rb +0 -12
  105. data/spec/models/double_definer.rb +0 -21
  106. data/spec/models/dynamoid/complex_dynamoid_example.rb +0 -37
  107. data/spec/models/dynamoid/dynamoid_multiple.rb +0 -18
  108. data/spec/models/dynamoid/dynamoid_simple.rb +0 -18
  109. data/spec/models/foo.rb +0 -106
  110. data/spec/models/foo_callback_multiple.rb +0 -45
  111. data/spec/models/guard_arguments_check.rb +0 -17
  112. data/spec/models/guard_with_params.rb +0 -24
  113. data/spec/models/guard_with_params_multiple.rb +0 -18
  114. data/spec/models/guardian.rb +0 -58
  115. data/spec/models/guardian_multiple.rb +0 -48
  116. data/spec/models/guardian_without_from_specified.rb +0 -18
  117. data/spec/models/initial_state_proc.rb +0 -31
  118. data/spec/models/mongoid/complex_mongoid_example.rb +0 -37
  119. data/spec/models/mongoid/invalid_persistor_mongoid.rb +0 -39
  120. data/spec/models/mongoid/mongoid_relationships.rb +0 -26
  121. data/spec/models/mongoid/no_scope_mongoid.rb +0 -21
  122. data/spec/models/mongoid/silent_persistor_mongoid.rb +0 -39
  123. data/spec/models/mongoid/simple_mongoid.rb +0 -23
  124. data/spec/models/mongoid/simple_new_dsl_mongoid.rb +0 -25
  125. data/spec/models/mongoid/validator_mongoid.rb +0 -100
  126. data/spec/models/multi_transitioner.rb +0 -34
  127. data/spec/models/multiple_transitions_that_differ_only_by_guard.rb +0 -31
  128. data/spec/models/namespaced_multiple_example.rb +0 -42
  129. data/spec/models/no_initial_state.rb +0 -25
  130. data/spec/models/nobrainer/complex_no_brainer_example.rb +0 -36
  131. data/spec/models/nobrainer/invalid_persistor_no_brainer.rb +0 -39
  132. data/spec/models/nobrainer/no_scope_no_brainer.rb +0 -21
  133. data/spec/models/nobrainer/nobrainer_relationships.rb +0 -25
  134. data/spec/models/nobrainer/silent_persistor_no_brainer.rb +0 -39
  135. data/spec/models/nobrainer/simple_new_dsl_nobrainer.rb +0 -25
  136. data/spec/models/nobrainer/simple_no_brainer.rb +0 -23
  137. data/spec/models/nobrainer/validator_no_brainer.rb +0 -98
  138. data/spec/models/not_auto_loaded/process.rb +0 -21
  139. data/spec/models/parametrised_event.rb +0 -42
  140. data/spec/models/parametrised_event_multiple.rb +0 -29
  141. data/spec/models/process_with_new_dsl.rb +0 -31
  142. data/spec/models/provided_state.rb +0 -24
  143. data/spec/models/redis/complex_redis_example.rb +0 -40
  144. data/spec/models/redis/redis_multiple.rb +0 -20
  145. data/spec/models/redis/redis_simple.rb +0 -20
  146. data/spec/models/sequel/complex_sequel_example.rb +0 -46
  147. data/spec/models/sequel/invalid_persistor.rb +0 -52
  148. data/spec/models/sequel/sequel_multiple.rb +0 -25
  149. data/spec/models/sequel/sequel_simple.rb +0 -26
  150. data/spec/models/sequel/silent_persistor.rb +0 -50
  151. data/spec/models/sequel/transactor.rb +0 -112
  152. data/spec/models/sequel/validator.rb +0 -93
  153. data/spec/models/sequel/worker.rb +0 -12
  154. data/spec/models/silencer.rb +0 -27
  155. data/spec/models/simple_custom_example.rb +0 -53
  156. data/spec/models/simple_example.rb +0 -17
  157. data/spec/models/simple_example_with_guard_args.rb +0 -17
  158. data/spec/models/simple_multiple_example.rb +0 -42
  159. data/spec/models/state_machine_with_failed_event.rb +0 -20
  160. data/spec/models/states_on_one_line_example.rb +0 -8
  161. data/spec/models/sub_class.rb +0 -41
  162. data/spec/models/sub_class_with_more_states.rb +0 -18
  163. data/spec/models/sub_classing.rb +0 -3
  164. data/spec/models/super_class.rb +0 -46
  165. data/spec/models/this_name_better_not_be_in_use.rb +0 -11
  166. data/spec/models/valid_state_name.rb +0 -23
  167. data/spec/spec_helper.rb +0 -26
  168. data/spec/spec_helpers/active_record.rb +0 -8
  169. data/spec/spec_helpers/dynamoid.rb +0 -35
  170. data/spec/spec_helpers/mongoid.rb +0 -26
  171. data/spec/spec_helpers/nobrainer.rb +0 -15
  172. data/spec/spec_helpers/redis.rb +0 -18
  173. data/spec/spec_helpers/remove_warnings.rb +0 -1
  174. data/spec/spec_helpers/sequel.rb +0 -7
  175. data/spec/unit/api_spec.rb +0 -100
  176. data/spec/unit/basic_two_state_machines_example_spec.rb +0 -10
  177. data/spec/unit/callback_multiple_spec.rb +0 -300
  178. data/spec/unit/callbacks_spec.rb +0 -491
  179. data/spec/unit/complex_example_spec.rb +0 -94
  180. data/spec/unit/complex_multiple_example_spec.rb +0 -115
  181. data/spec/unit/edge_cases_spec.rb +0 -16
  182. data/spec/unit/event_multiple_spec.rb +0 -73
  183. data/spec/unit/event_naming_spec.rb +0 -16
  184. data/spec/unit/event_spec.rb +0 -381
  185. data/spec/unit/exception_spec.rb +0 -11
  186. data/spec/unit/guard_arguments_check_spec.rb +0 -9
  187. data/spec/unit/guard_multiple_spec.rb +0 -60
  188. data/spec/unit/guard_spec.rb +0 -89
  189. data/spec/unit/guard_with_params_multiple_spec.rb +0 -10
  190. data/spec/unit/guard_with_params_spec.rb +0 -14
  191. data/spec/unit/guard_without_from_specified_spec.rb +0 -10
  192. data/spec/unit/initial_state_multiple_spec.rb +0 -15
  193. data/spec/unit/initial_state_spec.rb +0 -12
  194. data/spec/unit/inspection_multiple_spec.rb +0 -201
  195. data/spec/unit/inspection_spec.rb +0 -149
  196. data/spec/unit/invoker_spec.rb +0 -189
  197. data/spec/unit/invokers/base_invoker_spec.rb +0 -72
  198. data/spec/unit/invokers/class_invoker_spec.rb +0 -95
  199. data/spec/unit/invokers/literal_invoker_spec.rb +0 -86
  200. data/spec/unit/invokers/proc_invoker_spec.rb +0 -86
  201. data/spec/unit/localizer_spec.rb +0 -78
  202. data/spec/unit/memory_leak_spec.rb +0 -38
  203. data/spec/unit/multiple_transitions_that_differ_only_by_guard_spec.rb +0 -14
  204. data/spec/unit/namespaced_multiple_example_spec.rb +0 -75
  205. data/spec/unit/new_dsl_spec.rb +0 -12
  206. data/spec/unit/override_warning_spec.rb +0 -94
  207. data/spec/unit/persistence/active_record_persistence_multiple_spec.rb +0 -618
  208. data/spec/unit/persistence/active_record_persistence_spec.rb +0 -735
  209. data/spec/unit/persistence/dynamoid_persistence_multiple_spec.rb +0 -135
  210. data/spec/unit/persistence/dynamoid_persistence_spec.rb +0 -84
  211. data/spec/unit/persistence/mongoid_persistence_multiple_spec.rb +0 -200
  212. data/spec/unit/persistence/mongoid_persistence_spec.rb +0 -165
  213. data/spec/unit/persistence/no_brainer_persistence_multiple_spec.rb +0 -198
  214. data/spec/unit/persistence/no_brainer_persistence_spec.rb +0 -158
  215. data/spec/unit/persistence/redis_persistence_multiple_spec.rb +0 -88
  216. data/spec/unit/persistence/redis_persistence_spec.rb +0 -53
  217. data/spec/unit/persistence/sequel_persistence_multiple_spec.rb +0 -148
  218. data/spec/unit/persistence/sequel_persistence_spec.rb +0 -368
  219. data/spec/unit/readme_spec.rb +0 -41
  220. data/spec/unit/reloading_spec.rb +0 -15
  221. data/spec/unit/rspec_matcher_spec.rb +0 -85
  222. data/spec/unit/simple_custom_example_spec.rb +0 -39
  223. data/spec/unit/simple_example_spec.rb +0 -42
  224. data/spec/unit/simple_multiple_example_spec.rb +0 -91
  225. data/spec/unit/state_spec.rb +0 -89
  226. data/spec/unit/states_on_one_line_example_spec.rb +0 -16
  227. data/spec/unit/subclassing_multiple_spec.rb +0 -74
  228. data/spec/unit/subclassing_spec.rb +0 -46
  229. data/spec/unit/transition_spec.rb +0 -436
  230. data/test/minitest_helper.rb +0 -57
  231. 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
@@ -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
@@ -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