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,89 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe AASM::Core::State do
4
- let(:state_machine) { AASM::StateMachine.new(:name) }
5
-
6
- before(:each) do
7
- @name = :astate
8
- @options = { :crazy_custom_key => 'key' }
9
- end
10
-
11
- def new_state(options={})
12
- AASM::Core::State.new(@name, Conversation, state_machine, @options.merge(options))
13
- end
14
-
15
- it 'should set the name' do
16
- state = new_state
17
- expect(state.name).to eq(:astate)
18
- end
19
-
20
- it 'should set the display_name from name' do
21
- expect(new_state.display_name).to eq('Astate')
22
- end
23
-
24
- it 'should set the display_name from options' do
25
- expect(new_state(:display => "A State").display_name).to eq('A State')
26
- end
27
-
28
- it 'should set the options and expose them as options' do
29
- expect(new_state.options).to eq(@options)
30
- end
31
-
32
- it 'should be equal to a symbol of the same name' do
33
- expect(new_state).to eq(:astate)
34
- end
35
-
36
- it 'should be equal to a State of the same name' do
37
- expect(new_state).to eq(new_state)
38
- end
39
-
40
- it 'should send a message to the record for an action if the action is present as a symbol' do
41
- state = new_state(:entering => :foo)
42
-
43
- record = double('record')
44
- expect(record).to receive(:foo)
45
-
46
- state.fire_callbacks(:entering, record)
47
- end
48
-
49
- it 'should send a message to the record for an action if the action is present as a string' do
50
- state = new_state(:entering => 'foo')
51
-
52
- record = double('record')
53
- expect(record).to receive(:foo)
54
-
55
- state.fire_callbacks(:entering, record)
56
- end
57
-
58
- it 'should send a message to the record for each action' do
59
- state = new_state(:entering => [:a, :b, "c", lambda {|r| r.foobar }])
60
-
61
- record = double('record')
62
- expect(record).to receive(:a)
63
- expect(record).to receive(:b)
64
- expect(record).to receive(:c)
65
- expect(record).to receive(:foobar)
66
-
67
- state.fire_callbacks(:entering, record, record)
68
- end
69
-
70
- it "should stop calling actions if one of them raises :halt_aasm_chain" do
71
- state = new_state(:entering => [:a, :b, :c])
72
-
73
- record = double('record')
74
- expect(record).to receive(:a)
75
- expect(record).to receive(:b).and_throw(:halt_aasm_chain)
76
- expect(record).not_to receive(:c)
77
-
78
- state.fire_callbacks(:entering, record)
79
- end
80
-
81
- it 'should call a proc, passing in the record for an action if the action is present' do
82
- state = new_state(:entering => Proc.new {|r| r.foobar})
83
-
84
- record = double('record')
85
- expect(record).to receive(:foobar)
86
-
87
- state.fire_callbacks(:entering, record, record)
88
- end
89
- end
@@ -1,16 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe StatesOnOneLineExample do
4
- let(:example) { StatesOnOneLineExample.new }
5
- describe 'on initialize' do
6
- it 'should be in the initial state' do
7
- expect(example.aasm(:one_line).current_state).to eql :initial
8
- end
9
- end
10
-
11
- describe 'states' do
12
- it 'should have all 3 states defined' do
13
- expect(example.aasm(:one_line).states.map(&:name)).to eq [:initial, :first, :second]
14
- end
15
- end
16
- end
@@ -1,74 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'subclassing with multiple state machines' do
4
-
5
- it 'should have the parent states' do
6
- SuperClassMultiple.aasm(:left).states.each do |state|
7
- expect(SubClassWithMoreStatesMultiple.aasm(:left).states).to include(state)
8
- end
9
- expect(SubClassMultiple.aasm(:left).states).to eq(SuperClassMultiple.aasm(:left).states)
10
-
11
- SuperClassMultiple.aasm(:right).states.each do |state|
12
- expect(SubClassWithMoreStatesMultiple.aasm(:right).states).to include(state)
13
- end
14
- expect(SubClassMultiple.aasm(:right).states).to eq(SuperClassMultiple.aasm(:right).states)
15
- end
16
-
17
- it 'should not add the child states to the parent machine' do
18
- expect(SuperClassMultiple.aasm(:left).states).not_to include(:foo)
19
- expect(SuperClassMultiple.aasm(:right).states).not_to include(:archived)
20
- end
21
-
22
- it 'should have the same events as its parent' do
23
- expect(SubClassMultiple.aasm(:left).events).to eq(SuperClassMultiple.aasm(:left).events)
24
- expect(SubClassMultiple.aasm(:right).events).to eq(SuperClassMultiple.aasm(:right).events)
25
- end
26
-
27
- it 'should know how to respond to question methods' do
28
- expect(SubClassMultiple.new.may_foo?).to be_truthy
29
- expect(SubClassMultiple.new.may_close?).to be_truthy
30
- end
31
-
32
- it 'should not break if I call methods from super class' do
33
- son = SubClassMultiple.new
34
- son.update_state
35
- expect(son.aasm(:left).current_state).to eq(:ended)
36
- end
37
-
38
- it 'should allow the child to modify its left state machine' do
39
- son = SubClassMultiple.new
40
- expect(son.left_called_after).to eq(nil)
41
- expect(son.right_called_after).to eq(nil)
42
- son.foo
43
- expect(son.left_called_after).to eq(true)
44
- expect(son.right_called_after).to eq(nil)
45
- global_callbacks = SubClassMultiple.aasm(:left).state_machine.global_callbacks
46
- expect(global_callbacks).to_not be_empty
47
- expect(global_callbacks[:after_all_transitions]).to eq :left_after_all_event
48
- end
49
-
50
- it 'should allow the child to modify its right state machine' do
51
- son = SubClassMultiple.new
52
- expect(son.right_called_after).to eq(nil)
53
- expect(son.left_called_after).to eq(nil)
54
- son.close
55
- expect(son.right_called_after).to eq(true)
56
- expect(son.left_called_after).to eq(nil)
57
- global_callbacks = SubClassMultiple.aasm(:right).state_machine.global_callbacks
58
- expect(global_callbacks).to_not be_empty
59
- expect(global_callbacks[:after_all_transitions]).to eq :right_after_all_event
60
- end
61
-
62
- it 'should not modify the parent left state machine' do
63
- super_class_event = SuperClassMultiple.aasm(:left).events.select { |event| event.name == :foo }.first
64
- expect(super_class_event.options).to be_empty
65
- expect(SuperClassMultiple.aasm(:left).state_machine.global_callbacks).to be_empty
66
- end
67
-
68
- it 'should not modify the parent right state machine' do
69
- super_class_event = SuperClassMultiple.aasm(:right).events.select { |event| event.name == :close }.first
70
- expect(super_class_event.options).to be_empty
71
- expect(SuperClassMultiple.aasm(:right).state_machine.global_callbacks).to be_empty
72
- end
73
-
74
- end
@@ -1,46 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'subclassing' do
4
-
5
- it 'should have the parent states' do
6
- SuperClass.aasm.states.each do |state|
7
- expect(SubClassWithMoreStates.aasm.states).to include(state)
8
- end
9
- expect(SubClass.aasm.states).to eq(SuperClass.aasm.states)
10
- end
11
-
12
- it 'should not add the child states to the parent machine' do
13
- expect(SuperClass.aasm.states).not_to include(:foo)
14
- end
15
-
16
- it 'should have the same events as its parent' do
17
- expect(SubClass.aasm.events).to eq(SuperClass.aasm.events)
18
- end
19
-
20
- it 'should know how to respond to question methods' do
21
- expect(SubClass.new.may_foo?).to be_truthy
22
- end
23
-
24
- it 'should not break if I call methods from super class' do
25
- son = SubClass.new
26
- son.update_state
27
- expect(son.aasm.current_state).to eq(:ended)
28
- end
29
-
30
- it 'should allow the child to modify its state machine' do
31
- son = SubClass.new
32
- expect(son.called_after).to eq(nil)
33
- son.foo
34
- expect(son.called_after).to eq(true)
35
- global_callbacks = SubClass.aasm.state_machine.global_callbacks
36
- expect(global_callbacks).to_not be_empty
37
- expect(global_callbacks[:after_all_transitions]).to eq :after_all_event
38
- end
39
-
40
- it 'should not modify the parent state machine' do
41
- super_class_event = SuperClass.aasm.events.select { |event| event.name == :foo }.first
42
- expect(super_class_event.options).to be_empty
43
- expect(SuperClass.aasm.state_machine.global_callbacks).to be_empty
44
- end
45
-
46
- end
@@ -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