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