aasm 4.12.3 → 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 (218) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +284 -119
  3. data/lib/aasm/aasm.rb +30 -27
  4. data/lib/aasm/base.rb +61 -11
  5. data/lib/aasm/configuration.rb +3 -0
  6. data/lib/aasm/core/event.rb +26 -30
  7. data/lib/aasm/core/invoker.rb +129 -0
  8. data/lib/aasm/core/invokers/base_invoker.rb +75 -0
  9. data/lib/aasm/core/invokers/class_invoker.rb +52 -0
  10. data/lib/aasm/core/invokers/literal_invoker.rb +49 -0
  11. data/lib/aasm/core/invokers/proc_invoker.rb +59 -0
  12. data/lib/aasm/core/state.rb +16 -14
  13. data/lib/aasm/core/transition.rb +8 -69
  14. data/lib/aasm/dsl_helper.rb +24 -22
  15. data/lib/aasm/errors.rb +5 -3
  16. data/lib/aasm/instance_base.rb +28 -5
  17. data/lib/aasm/localizer.rb +13 -3
  18. data/lib/aasm/persistence/active_record_persistence.rb +25 -5
  19. data/lib/aasm/persistence/base.rb +14 -3
  20. data/lib/aasm/persistence/core_data_query_persistence.rb +2 -1
  21. data/lib/aasm/persistence/dynamoid_persistence.rb +1 -1
  22. data/lib/aasm/persistence/mongoid_persistence.rb +1 -1
  23. data/lib/aasm/persistence/no_brainer_persistence.rb +105 -0
  24. data/lib/aasm/persistence/orm.rb +23 -19
  25. data/lib/aasm/persistence/plain_persistence.rb +2 -1
  26. data/lib/aasm/persistence/redis_persistence.rb +1 -1
  27. data/lib/aasm/persistence/sequel_persistence.rb +0 -1
  28. data/lib/aasm/persistence.rb +3 -0
  29. data/lib/aasm/rspec/allow_event.rb +5 -1
  30. data/lib/aasm/rspec/allow_transition_to.rb +5 -1
  31. data/lib/aasm/rspec/transition_from.rb +5 -1
  32. data/lib/aasm/version.rb +1 -1
  33. data/lib/aasm.rb +5 -2
  34. data/lib/generators/aasm/orm_helpers.rb +7 -1
  35. data/lib/generators/active_record/aasm_generator.rb +3 -1
  36. data/lib/generators/active_record/templates/migration.rb +1 -1
  37. data/lib/generators/nobrainer/aasm_generator.rb +28 -0
  38. data/lib/motion-aasm.rb +1 -0
  39. metadata +42 -344
  40. data/.document +0 -6
  41. data/.gitignore +0 -20
  42. data/.travis.yml +0 -52
  43. data/API +0 -34
  44. data/Appraisals +0 -43
  45. data/CHANGELOG.md +0 -370
  46. data/CODE_OF_CONDUCT.md +0 -13
  47. data/CONTRIBUTING.md +0 -24
  48. data/Gemfile +0 -7
  49. data/Gemfile.lock_old +0 -151
  50. data/HOWTO +0 -12
  51. data/PLANNED_CHANGES.md +0 -11
  52. data/README_FROM_VERSION_3_TO_4.md +0 -240
  53. data/Rakefile +0 -31
  54. data/TESTING.md +0 -25
  55. data/aasm.gemspec +0 -35
  56. data/callbacks.txt +0 -51
  57. data/gemfiles/rails_3.2.gemfile +0 -13
  58. data/gemfiles/rails_4.0.gemfile +0 -15
  59. data/gemfiles/rails_4.2.gemfile +0 -16
  60. data/gemfiles/rails_4.2_mongoid_5.gemfile +0 -11
  61. data/gemfiles/rails_5.0.gemfile +0 -14
  62. data/spec/database.rb +0 -44
  63. data/spec/database.yml +0 -3
  64. data/spec/en.yml +0 -12
  65. data/spec/en_deprecated_style.yml +0 -10
  66. data/spec/generators/active_record_generator_spec.rb +0 -47
  67. data/spec/generators/mongoid_generator_spec.rb +0 -31
  68. data/spec/models/active_record/basic_active_record_two_state_machines_example.rb +0 -25
  69. data/spec/models/active_record/complex_active_record_example.rb +0 -37
  70. data/spec/models/active_record/derivate_new_dsl.rb +0 -7
  71. data/spec/models/active_record/false_state.rb +0 -35
  72. data/spec/models/active_record/gate.rb +0 -39
  73. data/spec/models/active_record/invalid_persistor.rb +0 -29
  74. data/spec/models/active_record/localizer_test_model.rb +0 -34
  75. data/spec/models/active_record/no_direct_assignment.rb +0 -21
  76. data/spec/models/active_record/no_scope.rb +0 -21
  77. data/spec/models/active_record/persisted_state.rb +0 -12
  78. data/spec/models/active_record/provided_and_persisted_state.rb +0 -24
  79. data/spec/models/active_record/reader.rb +0 -7
  80. data/spec/models/active_record/readme_job.rb +0 -21
  81. data/spec/models/active_record/silent_persistor.rb +0 -29
  82. data/spec/models/active_record/simple_new_dsl.rb +0 -17
  83. data/spec/models/active_record/thief.rb +0 -29
  84. data/spec/models/active_record/transactor.rb +0 -124
  85. data/spec/models/active_record/transient.rb +0 -6
  86. data/spec/models/active_record/validator.rb +0 -118
  87. data/spec/models/active_record/with_enum.rb +0 -39
  88. data/spec/models/active_record/with_enum_without_column.rb +0 -38
  89. data/spec/models/active_record/with_false_enum.rb +0 -31
  90. data/spec/models/active_record/with_true_enum.rb +0 -39
  91. data/spec/models/active_record/worker.rb +0 -2
  92. data/spec/models/active_record/writer.rb +0 -6
  93. data/spec/models/basic_two_state_machines_example.rb +0 -25
  94. data/spec/models/callbacks/basic.rb +0 -98
  95. data/spec/models/callbacks/basic_multiple.rb +0 -75
  96. data/spec/models/callbacks/guard_within_block.rb +0 -67
  97. data/spec/models/callbacks/guard_within_block_multiple.rb +0 -66
  98. data/spec/models/callbacks/multiple_transitions_transition_guard.rb +0 -66
  99. data/spec/models/callbacks/multiple_transitions_transition_guard_multiple.rb +0 -65
  100. data/spec/models/callbacks/private_method.rb +0 -44
  101. data/spec/models/callbacks/private_method_multiple.rb +0 -44
  102. data/spec/models/callbacks/with_args.rb +0 -62
  103. data/spec/models/callbacks/with_args_multiple.rb +0 -61
  104. data/spec/models/callbacks/with_state_arg.rb +0 -30
  105. data/spec/models/callbacks/with_state_arg_multiple.rb +0 -26
  106. data/spec/models/complex_example.rb +0 -222
  107. data/spec/models/conversation.rb +0 -93
  108. data/spec/models/default_state.rb +0 -12
  109. data/spec/models/double_definer.rb +0 -21
  110. data/spec/models/dynamoid/complex_dynamoid_example.rb +0 -37
  111. data/spec/models/dynamoid/dynamoid_multiple.rb +0 -18
  112. data/spec/models/dynamoid/dynamoid_simple.rb +0 -18
  113. data/spec/models/foo.rb +0 -106
  114. data/spec/models/foo_callback_multiple.rb +0 -45
  115. data/spec/models/guard_arguments_check.rb +0 -17
  116. data/spec/models/guard_with_params.rb +0 -24
  117. data/spec/models/guard_with_params_multiple.rb +0 -18
  118. data/spec/models/guardian.rb +0 -58
  119. data/spec/models/guardian_multiple.rb +0 -48
  120. data/spec/models/guardian_without_from_specified.rb +0 -18
  121. data/spec/models/initial_state_proc.rb +0 -31
  122. data/spec/models/mongoid/complex_mongoid_example.rb +0 -37
  123. data/spec/models/mongoid/invalid_persistor_mongoid.rb +0 -39
  124. data/spec/models/mongoid/mongoid_relationships.rb +0 -26
  125. data/spec/models/mongoid/no_scope_mongoid.rb +0 -21
  126. data/spec/models/mongoid/silent_persistor_mongoid.rb +0 -39
  127. data/spec/models/mongoid/simple_mongoid.rb +0 -23
  128. data/spec/models/mongoid/simple_new_dsl_mongoid.rb +0 -25
  129. data/spec/models/mongoid/validator_mongoid.rb +0 -100
  130. data/spec/models/multi_transitioner.rb +0 -34
  131. data/spec/models/multiple_transitions_that_differ_only_by_guard.rb +0 -31
  132. data/spec/models/namespaced_multiple_example.rb +0 -42
  133. data/spec/models/no_initial_state.rb +0 -25
  134. data/spec/models/not_auto_loaded/process.rb +0 -21
  135. data/spec/models/parametrised_event.rb +0 -42
  136. data/spec/models/parametrised_event_multiple.rb +0 -29
  137. data/spec/models/process_with_new_dsl.rb +0 -31
  138. data/spec/models/provided_state.rb +0 -24
  139. data/spec/models/redis/complex_redis_example.rb +0 -40
  140. data/spec/models/redis/redis_multiple.rb +0 -20
  141. data/spec/models/redis/redis_simple.rb +0 -20
  142. data/spec/models/sequel/complex_sequel_example.rb +0 -46
  143. data/spec/models/sequel/invalid_persistor.rb +0 -52
  144. data/spec/models/sequel/sequel_multiple.rb +0 -25
  145. data/spec/models/sequel/sequel_simple.rb +0 -26
  146. data/spec/models/sequel/silent_persistor.rb +0 -50
  147. data/spec/models/sequel/transactor.rb +0 -112
  148. data/spec/models/sequel/validator.rb +0 -93
  149. data/spec/models/sequel/worker.rb +0 -12
  150. data/spec/models/silencer.rb +0 -27
  151. data/spec/models/simple_custom_example.rb +0 -53
  152. data/spec/models/simple_example.rb +0 -15
  153. data/spec/models/simple_multiple_example.rb +0 -42
  154. data/spec/models/state_machine_with_failed_event.rb +0 -20
  155. data/spec/models/states_on_one_line_example.rb +0 -8
  156. data/spec/models/sub_class.rb +0 -41
  157. data/spec/models/sub_class_with_more_states.rb +0 -18
  158. data/spec/models/sub_classing.rb +0 -3
  159. data/spec/models/super_class.rb +0 -46
  160. data/spec/models/this_name_better_not_be_in_use.rb +0 -11
  161. data/spec/models/valid_state_name.rb +0 -23
  162. data/spec/spec_helper.rb +0 -26
  163. data/spec/spec_helpers/active_record.rb +0 -7
  164. data/spec/spec_helpers/dynamoid.rb +0 -33
  165. data/spec/spec_helpers/mongoid.rb +0 -7
  166. data/spec/spec_helpers/redis.rb +0 -15
  167. data/spec/spec_helpers/remove_warnings.rb +0 -1
  168. data/spec/spec_helpers/sequel.rb +0 -7
  169. data/spec/unit/api_spec.rb +0 -100
  170. data/spec/unit/basic_two_state_machines_example_spec.rb +0 -10
  171. data/spec/unit/callback_multiple_spec.rb +0 -300
  172. data/spec/unit/callbacks_spec.rb +0 -491
  173. data/spec/unit/complex_example_spec.rb +0 -94
  174. data/spec/unit/complex_multiple_example_spec.rb +0 -115
  175. data/spec/unit/edge_cases_spec.rb +0 -16
  176. data/spec/unit/event_multiple_spec.rb +0 -73
  177. data/spec/unit/event_naming_spec.rb +0 -16
  178. data/spec/unit/event_spec.rb +0 -381
  179. data/spec/unit/exception_spec.rb +0 -11
  180. data/spec/unit/guard_arguments_check_spec.rb +0 -9
  181. data/spec/unit/guard_multiple_spec.rb +0 -60
  182. data/spec/unit/guard_spec.rb +0 -89
  183. data/spec/unit/guard_with_params_multiple_spec.rb +0 -10
  184. data/spec/unit/guard_with_params_spec.rb +0 -14
  185. data/spec/unit/guard_without_from_specified_spec.rb +0 -10
  186. data/spec/unit/initial_state_multiple_spec.rb +0 -15
  187. data/spec/unit/initial_state_spec.rb +0 -12
  188. data/spec/unit/inspection_multiple_spec.rb +0 -201
  189. data/spec/unit/inspection_spec.rb +0 -149
  190. data/spec/unit/localizer_spec.rb +0 -78
  191. data/spec/unit/memory_leak_spec.rb +0 -38
  192. data/spec/unit/multiple_transitions_that_differ_only_by_guard_spec.rb +0 -14
  193. data/spec/unit/namespaced_multiple_example_spec.rb +0 -75
  194. data/spec/unit/new_dsl_spec.rb +0 -12
  195. data/spec/unit/override_warning_spec.rb +0 -94
  196. data/spec/unit/persistence/active_record_persistence_multiple_spec.rb +0 -618
  197. data/spec/unit/persistence/active_record_persistence_spec.rb +0 -735
  198. data/spec/unit/persistence/dynamoid_persistence_multiple_spec.rb +0 -135
  199. data/spec/unit/persistence/dynamoid_persistence_spec.rb +0 -84
  200. data/spec/unit/persistence/mongoid_persistence_multiple_spec.rb +0 -204
  201. data/spec/unit/persistence/mongoid_persistence_spec.rb +0 -169
  202. data/spec/unit/persistence/redis_persistence_multiple_spec.rb +0 -88
  203. data/spec/unit/persistence/redis_persistence_spec.rb +0 -53
  204. data/spec/unit/persistence/sequel_persistence_multiple_spec.rb +0 -148
  205. data/spec/unit/persistence/sequel_persistence_spec.rb +0 -368
  206. data/spec/unit/readme_spec.rb +0 -41
  207. data/spec/unit/reloading_spec.rb +0 -15
  208. data/spec/unit/rspec_matcher_spec.rb +0 -79
  209. data/spec/unit/simple_custom_example_spec.rb +0 -39
  210. data/spec/unit/simple_example_spec.rb +0 -42
  211. data/spec/unit/simple_multiple_example_spec.rb +0 -91
  212. data/spec/unit/state_spec.rb +0 -89
  213. data/spec/unit/states_on_one_line_example_spec.rb +0 -16
  214. data/spec/unit/subclassing_multiple_spec.rb +0 -74
  215. data/spec/unit/subclassing_spec.rb +0 -46
  216. data/spec/unit/transition_spec.rb +0 -436
  217. data/test/minitest_helper.rb +0 -57
  218. data/test/unit/minitest_matcher_test.rb +0 -80
@@ -1,100 +0,0 @@
1
- require 'spec_helper'
2
-
3
- if defined?(ActiveRecord)
4
- require 'models/default_state.rb'
5
- require 'models/provided_state.rb'
6
- require 'models/active_record/persisted_state.rb'
7
- require 'models/active_record/provided_and_persisted_state.rb'
8
-
9
- load_schema
10
-
11
- describe "reading the current state" do
12
- it "uses the AASM default" do
13
- expect(DefaultState.new.aasm.current_state).to eql :alpha
14
- end
15
-
16
- it "uses the provided method" do
17
- expect(ProvidedState.new.aasm.current_state).to eql :beta
18
- end
19
-
20
- it "uses the persistence storage" do
21
- expect(PersistedState.new.aasm.current_state).to eql :alpha
22
- end
23
-
24
- it "uses the provided method even if persisted" do
25
- expect(ProvidedAndPersistedState.new.aasm.current_state).to eql :gamma
26
- end
27
-
28
- context "after dup" do
29
- it "uses the persistence storage" do
30
- source = PersistedState.create!
31
- copy = source.dup
32
- copy.save!
33
-
34
- copy.release!
35
-
36
- expect(source.aasm_state).to eql 'alpha'
37
- expect(source.aasm.current_state).to eql :alpha
38
-
39
- source2 = PersistedState.find(source.id)
40
- expect(source2.reload.aasm_state).to eql 'alpha'
41
- expect(source2.aasm.current_state).to eql :alpha
42
-
43
- expect(copy.aasm_state).to eql 'beta'
44
- expect(copy.aasm.current_state).to eql :beta
45
- end
46
- end
47
- end
48
-
49
- describe "writing and persisting the current state" do
50
- it "uses the AASM default" do
51
- o = DefaultState.new
52
- o.release!
53
- expect(o.persisted_store).to be_nil
54
- end
55
-
56
- it "uses the provided method" do
57
- o = ProvidedState.new
58
- o.release!
59
- expect(o.persisted_store).to eql :beta
60
- end
61
-
62
- it "uses the persistence storage" do
63
- o = PersistedState.new
64
- o.release!
65
- expect(o.persisted_store).to be_nil
66
- end
67
-
68
- it "uses the provided method even if persisted" do
69
- o = ProvidedAndPersistedState.new
70
- o.release!
71
- expect(o.persisted_store).to eql :beta
72
- end
73
- end
74
-
75
- describe "writing the current state without persisting it" do
76
- it "uses the AASM default" do
77
- o = DefaultState.new
78
- o.release
79
- expect(o.transient_store).to be_nil
80
- end
81
-
82
- it "uses the provided method" do
83
- o = ProvidedState.new
84
- o.release
85
- expect(o.transient_store).to eql :beta
86
- end
87
-
88
- it "uses the persistence storage" do
89
- o = PersistedState.new
90
- o.release
91
- expect(o.transient_store).to be_nil
92
- end
93
-
94
- it "uses the provided method even if persisted" do
95
- o = ProvidedAndPersistedState.new
96
- o.release
97
- expect(o.transient_store).to eql :beta
98
- end
99
- end
100
- end
@@ -1,10 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'on initialization' do
4
- let(:example) { BasicTwoStateMachinesExample.new }
5
-
6
- it 'should be in the initial state' do
7
- expect(example.aasm(:search).current_state).to eql :initialised
8
- expect(example.aasm(:sync).current_state).to eql :unsynced
9
- end
10
- end
@@ -1,300 +0,0 @@
1
- require 'spec_helper'
2
- Dir[File.dirname(__FILE__) + "/../models/callbacks/*.rb"].sort.each { |f| require File.expand_path(f) }
3
-
4
- describe 'callbacks for the new DSL' do
5
-
6
- it "be called in order" do
7
- show_debug_log = false
8
-
9
- callback = Callbacks::BasicMultiple.new(:log => show_debug_log)
10
- callback.aasm(:left).current_state
11
-
12
- unless show_debug_log
13
- expect(callback).to receive(:before_event).once.ordered
14
- expect(callback).to receive(:event_guard).once.ordered.and_return(true)
15
- expect(callback).to receive(:transition_guard).once.ordered.and_return(true)
16
- expect(callback).to receive(:before_exit_open).once.ordered # these should be before the state changes
17
- expect(callback).to receive(:exit_open).once.ordered
18
- # expect(callback).to receive(:event_guard).once.ordered.and_return(true)
19
- # expect(callback).to receive(:transition_guard).once.ordered.and_return(true)
20
- expect(callback).to receive(:after_transition).once.ordered
21
- expect(callback).to receive(:before_enter_closed).once.ordered
22
- expect(callback).to receive(:enter_closed).once.ordered
23
- expect(callback).to receive(:aasm_write_state).with(:closed, :left).once.ordered.and_return(true) # this is when the state changes
24
- expect(callback).to receive(:after_exit_open).once.ordered # these should be after the state changes
25
- expect(callback).to receive(:after_enter_closed).once.ordered
26
- expect(callback).to receive(:after_event).once.ordered
27
- end
28
-
29
- # puts "------- close!"
30
- callback.left_close!
31
- end
32
-
33
- it "does not run any state callback if the event guard fails" do
34
- callback = Callbacks::BasicMultiple.new(:log => false)
35
- callback.aasm(:left).current_state
36
-
37
- expect(callback).to receive(:before_event).once.ordered
38
- expect(callback).to receive(:event_guard).once.ordered.and_return(false)
39
- expect(callback).to_not receive(:transition_guard)
40
- expect(callback).to_not receive(:before_exit_open)
41
- expect(callback).to_not receive(:exit_open)
42
- expect(callback).to_not receive(:after_transition)
43
- expect(callback).to_not receive(:before_enter_closed)
44
- expect(callback).to_not receive(:enter_closed)
45
- expect(callback).to_not receive(:aasm_write_state)
46
- expect(callback).to_not receive(:after_exit_open)
47
- expect(callback).to_not receive(:after_enter_closed)
48
- expect(callback).to_not receive(:after_event)
49
-
50
- expect {
51
- callback.left_close!
52
- }.to raise_error(AASM::InvalidTransition, "Event 'left_close' cannot transition from 'open'. Failed callback(s): [:after_transition, :event_guard].")
53
-
54
- end
55
-
56
- it "handles private callback methods as well" do
57
- show_debug_log = false
58
-
59
- callback = Callbacks::PrivateMethodMultiple.new(:log => show_debug_log)
60
- callback.aasm(:left).current_state
61
-
62
- # puts "------- close!"
63
- expect {
64
- callback.close!
65
- }.to_not raise_error
66
- end
67
-
68
- context "if the transition guard fails" do
69
- it "does not run any state callback if guard is defined inline" do
70
- show_debug_log = false
71
- callback = Callbacks::BasicMultiple.new(:log => show_debug_log, :fail_transition_guard => true)
72
- callback.aasm(:left).current_state
73
-
74
- unless show_debug_log
75
- expect(callback).to receive(:before_event).once.ordered
76
- expect(callback).to receive(:event_guard).once.ordered.and_return(true)
77
- expect(callback).to receive(:transition_guard).once.ordered.and_return(false)
78
- expect(callback).to_not receive(:before_exit_open)
79
- expect(callback).to_not receive(:exit_open)
80
- expect(callback).to_not receive(:after_transition)
81
- expect(callback).to_not receive(:before_enter_closed)
82
- expect(callback).to_not receive(:enter_closed)
83
- expect(callback).to_not receive(:aasm_write_state)
84
- expect(callback).to_not receive(:after_exit_open)
85
- expect(callback).to_not receive(:after_enter_closed)
86
- expect(callback).to_not receive(:after_event)
87
- end
88
-
89
- expect {
90
- callback.left_close!
91
- }.to raise_error(AASM::InvalidTransition, "Event 'left_close' cannot transition from 'open'. Failed callback(s): [:after_transition, :event_guard, :transition_guard].")
92
- end
93
-
94
- it "does not run transition_guard twice for multiple permitted transitions" do
95
- show_debug_log = false
96
- callback = Callbacks::MultipleTransitionsTransitionGuardMultiple.new(:log => show_debug_log, :fail_transition_guard => true)
97
- callback.aasm(:left).current_state
98
-
99
- unless show_debug_log
100
- expect(callback).to receive(:before).once.ordered
101
- expect(callback).to receive(:event_guard).once.ordered.and_return(true)
102
- expect(callback).to receive(:transition_guard).once.ordered.and_return(false)
103
- expect(callback).to receive(:event_guard).once.ordered.and_return(true)
104
- expect(callback).to receive(:before_exit_open).once.ordered
105
- expect(callback).to receive(:exit_open).once.ordered
106
- expect(callback).to receive(:aasm_write_state).once.ordered.and_return(true) # this is when the state changes
107
- expect(callback).to receive(:after_exit_open).once.ordered
108
- expect(callback).to receive(:after).once.ordered
109
-
110
- expect(callback).to_not receive(:transitioning)
111
- expect(callback).to_not receive(:before_enter_closed)
112
- expect(callback).to_not receive(:enter_closed)
113
- expect(callback).to_not receive(:after_enter_closed)
114
- end
115
-
116
- callback.close!
117
- expect(callback.aasm(:left).current_state).to eql :failed
118
- end
119
-
120
- it "does not run any state callback if guard is defined with block" do
121
- callback = Callbacks::GuardWithinBlockMultiple.new #(:log => true, :fail_transition_guard => true)
122
- callback.aasm(:left).current_state
123
-
124
- expect(callback).to receive(:before).once.ordered
125
- expect(callback).to receive(:event_guard).once.ordered.and_return(true)
126
- expect(callback).to receive(:transition_guard).once.ordered.and_return(false)
127
- expect(callback).to_not receive(:before_exit_open)
128
- expect(callback).to_not receive(:exit_open)
129
- expect(callback).to_not receive(:transitioning)
130
- expect(callback).to_not receive(:before_enter_closed)
131
- expect(callback).to_not receive(:enter_closed)
132
- expect(callback).to_not receive(:aasm_write_state)
133
- expect(callback).to_not receive(:after_exit_open)
134
- expect(callback).to_not receive(:after_enter_closed)
135
- expect(callback).to_not receive(:after)
136
- expect {
137
- callback.close!
138
- }.to raise_error(AASM::InvalidTransition)
139
-
140
- end
141
- end
142
-
143
- it "should properly pass arguments" do
144
- cb = Callbacks::WithArgsMultiple.new(:log => false)
145
- cb.aasm(:left).current_state
146
-
147
- cb.reset_data
148
- cb.close!(:arg1, :arg2)
149
- expect(cb.data).to eql 'before(:arg1,:arg2) before_exit_open(:arg1,:arg2) transition_proc(:arg1,:arg2) before_enter_closed(:arg1,:arg2) aasm_write_state after_exit_open(:arg1,:arg2) after_enter_closed(:arg1,:arg2) after(:arg1,:arg2)'
150
- end
151
-
152
- it "should call the callbacks given the to-state as argument" do
153
- cb = Callbacks::WithStateArgMultiple.new
154
- expect(cb).to receive(:before_method).with(:arg1).once.ordered
155
- expect(cb).to receive(:transition_method).never
156
- expect(cb).to receive(:transition_method2).with(:arg1).once.ordered
157
- expect(cb).to receive(:after_method).with(:arg1).once.ordered
158
- cb.close!(:out_to_lunch, :arg1)
159
-
160
- cb = Callbacks::WithStateArgMultiple.new
161
- some_object = double('some object')
162
- expect(cb).to receive(:before_method).with(some_object).once.ordered
163
- expect(cb).to receive(:transition_method2).with(some_object).once.ordered
164
- expect(cb).to receive(:after_method).with(some_object).once.ordered
165
- cb.close!(:out_to_lunch, some_object)
166
- end
167
-
168
- it "should call the proper methods just with arguments" do
169
- cb = Callbacks::WithStateArgMultiple.new
170
- expect(cb).to receive(:before_method).with(:arg1).once.ordered
171
- expect(cb).to receive(:transition_method).with(:arg1).once.ordered
172
- expect(cb).to receive(:transition_method).never
173
- expect(cb).to receive(:after_method).with(:arg1).once.ordered
174
- cb.close!(:arg1)
175
-
176
- cb = Callbacks::WithStateArgMultiple.new
177
- some_object = double('some object')
178
- expect(cb).to receive(:before_method).with(some_object).once.ordered
179
- expect(cb).to receive(:transition_method).with(some_object).once.ordered
180
- expect(cb).to receive(:transition_method).never
181
- expect(cb).to receive(:after_method).with(some_object).once.ordered
182
- cb.close!(some_object)
183
- end
184
- end # callbacks for the new DSL
185
-
186
- describe 'event callbacks' do
187
- describe "with an error callback defined" do
188
- before do
189
- class FooCallbackMultiple
190
- # this hack is needed to allow testing of parameters, since RSpec
191
- # destroys a method's arity when mocked
192
- attr_accessor :data
193
-
194
- aasm(:left) do
195
- event :safe_close, :success => :success_callback, :error => :error_callback do
196
- transitions :to => :closed, :from => [:open]
197
- end
198
- end
199
- end
200
-
201
- @foo = FooCallbackMultiple.new
202
- end
203
-
204
- context "error_callback defined" do
205
- it "should run error_callback if an exception is raised" do
206
- def @foo.error_callback(e)
207
- @data = [e]
208
- end
209
-
210
- allow(@foo).to receive(:before_enter).and_raise(e = StandardError.new)
211
-
212
- @foo.safe_close!
213
- expect(@foo.data).to eql [e]
214
- end
215
-
216
- it "should run error_callback without parameters if callback does not support any" do
217
- def @foo.error_callback(e)
218
- @data = []
219
- end
220
-
221
- allow(@foo).to receive(:before_enter).and_raise(e = StandardError.new)
222
-
223
- @foo.safe_close!('arg1', 'arg2')
224
- expect(@foo.data).to eql []
225
- end
226
-
227
- it "should run error_callback with parameters if callback supports them" do
228
- def @foo.error_callback(e, arg1, arg2)
229
- @data = [arg1, arg2]
230
- end
231
-
232
- allow(@foo).to receive(:before_enter).and_raise(e = StandardError.new)
233
-
234
- @foo.safe_close!('arg1', 'arg2')
235
- expect(@foo.data).to eql ['arg1', 'arg2']
236
- end
237
- end
238
-
239
- it "should raise NoMethodError if exception is raised and error_callback is declared but not defined" do
240
- allow(@foo).to receive(:before_enter).and_raise(StandardError)
241
- expect{@foo.safe_close!}.to raise_error(NoMethodError)
242
- end
243
-
244
- it "should propagate an error if no error callback is declared" do
245
- allow(@foo).to receive(:before_enter).and_raise("Cannot enter safe")
246
- expect{@foo.close!}.to raise_error(StandardError, "Cannot enter safe")
247
- end
248
- end
249
-
250
- describe "with aasm_event_fired defined" do
251
- before do
252
- @foo = FooMultiple.new
253
- def @foo.aasm_event_fired(event, from, to); end
254
- end
255
-
256
- it 'should call it for successful bang fire' do
257
- expect(@foo).to receive(:aasm_event_fired).with(:close, :open, :closed)
258
- @foo.close!
259
- end
260
-
261
- it 'should call it for successful non-bang fire' do
262
- expect(@foo).to receive(:aasm_event_fired)
263
- @foo.close
264
- end
265
-
266
- it 'should not call it for failing bang fire' do
267
- allow(@foo.aasm(:left)).to receive(:set_current_state_with_persistence).and_return(false)
268
- expect(@foo).not_to receive(:aasm_event_fired)
269
- @foo.close!
270
- end
271
- end
272
-
273
- describe "with aasm_event_failed defined" do
274
- before do
275
- @foo = FooMultiple.new
276
- def @foo.aasm_event_failed(event, from); end
277
- end
278
-
279
- it 'should call it when transition failed for bang fire' do
280
- expect(@foo).to receive(:aasm_event_failed).with(:null, :open)
281
- expect{
282
- @foo.null!
283
- }.to raise_error(AASM::InvalidTransition, "Event 'null' cannot transition from 'open'. Failed callback(s): [:always_false].")
284
- end
285
-
286
- it 'should call it when transition failed for non-bang fire' do
287
- expect(@foo).to receive(:aasm_event_failed).with(:null, :open)
288
- expect{
289
- @foo.null
290
- }.to raise_error(AASM::InvalidTransition, "Event 'null' cannot transition from 'open'. Failed callback(s): [:always_false, :always_false].")
291
- end
292
-
293
- it 'should not call it if persist fails for bang fire' do
294
- allow(@foo.aasm(:left)).to receive(:set_current_state_with_persistence).and_return(false)
295
- expect(@foo).to receive(:aasm_event_failed)
296
- @foo.close!
297
- end
298
- end
299
-
300
- end # event callbacks