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