aasm 5.1.1 → 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 (228) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +74 -15
  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 +14 -3
  13. data/lib/aasm/localizer.rb +13 -3
  14. data/lib/aasm/persistence/active_record_persistence.rb +1 -1
  15. data/lib/aasm/persistence/base.rb +13 -2
  16. data/lib/aasm/version.rb +1 -1
  17. data/lib/generators/aasm/orm_helpers.rb +1 -1
  18. data/lib/generators/active_record/templates/migration.rb +1 -1
  19. metadata +6 -402
  20. data/.document +0 -6
  21. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -27
  22. data/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  23. data/.gitignore +0 -20
  24. data/.travis.yml +0 -82
  25. data/API +0 -34
  26. data/Appraisals +0 -67
  27. data/CHANGELOG.md +0 -442
  28. data/CODE_OF_CONDUCT.md +0 -13
  29. data/CONTRIBUTING.md +0 -24
  30. data/Dockerfile +0 -44
  31. data/Gemfile +0 -6
  32. data/Gemfile.lock_old +0 -151
  33. data/HOWTO +0 -12
  34. data/PLANNED_CHANGES.md +0 -11
  35. data/README_FROM_VERSION_3_TO_4.md +0 -240
  36. data/Rakefile +0 -31
  37. data/TESTING.md +0 -25
  38. data/aasm.gemspec +0 -37
  39. data/docker-compose.yml +0 -40
  40. data/gemfiles/norails.gemfile +0 -10
  41. data/gemfiles/rails_4.2.gemfile +0 -17
  42. data/gemfiles/rails_4.2_mongoid_5.gemfile +0 -12
  43. data/gemfiles/rails_4.2_nobrainer.gemfile +0 -9
  44. data/gemfiles/rails_5.0.gemfile +0 -14
  45. data/gemfiles/rails_5.0_nobrainer.gemfile +0 -9
  46. data/gemfiles/rails_5.1.gemfile +0 -14
  47. data/gemfiles/rails_5.2.gemfile +0 -14
  48. data/spec/database.rb +0 -59
  49. data/spec/database.yml +0 -3
  50. data/spec/en.yml +0 -9
  51. data/spec/generators/active_record_generator_spec.rb +0 -53
  52. data/spec/generators/mongoid_generator_spec.rb +0 -31
  53. data/spec/generators/no_brainer_generator_spec.rb +0 -29
  54. data/spec/localizer_test_model_deprecated_style.yml +0 -6
  55. data/spec/localizer_test_model_new_style.yml +0 -5
  56. data/spec/models/active_record/active_record_callback.rb +0 -93
  57. data/spec/models/active_record/basic_active_record_two_state_machines_example.rb +0 -25
  58. data/spec/models/active_record/complex_active_record_example.rb +0 -37
  59. data/spec/models/active_record/derivate_new_dsl.rb +0 -7
  60. data/spec/models/active_record/false_state.rb +0 -35
  61. data/spec/models/active_record/gate.rb +0 -39
  62. data/spec/models/active_record/instance_level_skip_validation_example.rb +0 -19
  63. data/spec/models/active_record/invalid_persistor.rb +0 -29
  64. data/spec/models/active_record/localizer_test_model.rb +0 -34
  65. data/spec/models/active_record/no_direct_assignment.rb +0 -21
  66. data/spec/models/active_record/no_scope.rb +0 -21
  67. data/spec/models/active_record/persisted_state.rb +0 -12
  68. data/spec/models/active_record/person.rb +0 -23
  69. data/spec/models/active_record/provided_and_persisted_state.rb +0 -24
  70. data/spec/models/active_record/reader.rb +0 -7
  71. data/spec/models/active_record/readme_job.rb +0 -21
  72. data/spec/models/active_record/silent_persistor.rb +0 -29
  73. data/spec/models/active_record/simple_new_dsl.rb +0 -32
  74. data/spec/models/active_record/thief.rb +0 -29
  75. data/spec/models/active_record/transactor.rb +0 -124
  76. data/spec/models/active_record/transient.rb +0 -6
  77. data/spec/models/active_record/validator.rb +0 -118
  78. data/spec/models/active_record/with_enum.rb +0 -39
  79. data/spec/models/active_record/with_enum_without_column.rb +0 -38
  80. data/spec/models/active_record/with_false_enum.rb +0 -31
  81. data/spec/models/active_record/with_true_enum.rb +0 -39
  82. data/spec/models/active_record/work.rb +0 -3
  83. data/spec/models/active_record/worker.rb +0 -2
  84. data/spec/models/active_record/writer.rb +0 -6
  85. data/spec/models/basic_two_state_machines_example.rb +0 -25
  86. data/spec/models/callbacks/basic.rb +0 -98
  87. data/spec/models/callbacks/basic_multiple.rb +0 -75
  88. data/spec/models/callbacks/guard_within_block.rb +0 -67
  89. data/spec/models/callbacks/guard_within_block_multiple.rb +0 -66
  90. data/spec/models/callbacks/multiple_transitions_transition_guard.rb +0 -66
  91. data/spec/models/callbacks/multiple_transitions_transition_guard_multiple.rb +0 -65
  92. data/spec/models/callbacks/private_method.rb +0 -44
  93. data/spec/models/callbacks/private_method_multiple.rb +0 -44
  94. data/spec/models/callbacks/with_args.rb +0 -62
  95. data/spec/models/callbacks/with_args_multiple.rb +0 -61
  96. data/spec/models/callbacks/with_state_arg.rb +0 -34
  97. data/spec/models/callbacks/with_state_arg_multiple.rb +0 -29
  98. data/spec/models/complex_example.rb +0 -222
  99. data/spec/models/conversation.rb +0 -93
  100. data/spec/models/default_state.rb +0 -12
  101. data/spec/models/double_definer.rb +0 -21
  102. data/spec/models/dynamoid/complex_dynamoid_example.rb +0 -37
  103. data/spec/models/dynamoid/dynamoid_multiple.rb +0 -18
  104. data/spec/models/dynamoid/dynamoid_simple.rb +0 -18
  105. data/spec/models/foo.rb +0 -106
  106. data/spec/models/foo_callback_multiple.rb +0 -45
  107. data/spec/models/guard_arguments_check.rb +0 -17
  108. data/spec/models/guard_with_params.rb +0 -24
  109. data/spec/models/guard_with_params_multiple.rb +0 -18
  110. data/spec/models/guardian.rb +0 -58
  111. data/spec/models/guardian_multiple.rb +0 -48
  112. data/spec/models/guardian_without_from_specified.rb +0 -18
  113. data/spec/models/initial_state_proc.rb +0 -31
  114. data/spec/models/mongoid/complex_mongoid_example.rb +0 -37
  115. data/spec/models/mongoid/invalid_persistor_mongoid.rb +0 -39
  116. data/spec/models/mongoid/mongoid_relationships.rb +0 -26
  117. data/spec/models/mongoid/no_scope_mongoid.rb +0 -21
  118. data/spec/models/mongoid/silent_persistor_mongoid.rb +0 -39
  119. data/spec/models/mongoid/simple_mongoid.rb +0 -23
  120. data/spec/models/mongoid/simple_new_dsl_mongoid.rb +0 -25
  121. data/spec/models/mongoid/validator_mongoid.rb +0 -100
  122. data/spec/models/multi_transitioner.rb +0 -34
  123. data/spec/models/multiple_transitions_that_differ_only_by_guard.rb +0 -31
  124. data/spec/models/namespaced_multiple_example.rb +0 -42
  125. data/spec/models/no_initial_state.rb +0 -25
  126. data/spec/models/nobrainer/complex_no_brainer_example.rb +0 -36
  127. data/spec/models/nobrainer/invalid_persistor_no_brainer.rb +0 -39
  128. data/spec/models/nobrainer/no_scope_no_brainer.rb +0 -21
  129. data/spec/models/nobrainer/nobrainer_relationships.rb +0 -25
  130. data/spec/models/nobrainer/silent_persistor_no_brainer.rb +0 -39
  131. data/spec/models/nobrainer/simple_new_dsl_nobrainer.rb +0 -25
  132. data/spec/models/nobrainer/simple_no_brainer.rb +0 -23
  133. data/spec/models/nobrainer/validator_no_brainer.rb +0 -98
  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 -23
  153. data/spec/models/simple_example_with_guard_args.rb +0 -17
  154. data/spec/models/simple_multiple_example.rb +0 -42
  155. data/spec/models/state_machine_with_failed_event.rb +0 -20
  156. data/spec/models/states_on_one_line_example.rb +0 -8
  157. data/spec/models/sub_class.rb +0 -41
  158. data/spec/models/sub_class_with_more_states.rb +0 -18
  159. data/spec/models/sub_classing.rb +0 -3
  160. data/spec/models/super_class.rb +0 -46
  161. data/spec/models/this_name_better_not_be_in_use.rb +0 -11
  162. data/spec/models/valid_state_name.rb +0 -23
  163. data/spec/spec_helper.rb +0 -41
  164. data/spec/spec_helpers/active_record.rb +0 -8
  165. data/spec/spec_helpers/dynamoid.rb +0 -35
  166. data/spec/spec_helpers/mongoid.rb +0 -26
  167. data/spec/spec_helpers/nobrainer.rb +0 -15
  168. data/spec/spec_helpers/redis.rb +0 -18
  169. data/spec/spec_helpers/remove_warnings.rb +0 -1
  170. data/spec/spec_helpers/sequel.rb +0 -7
  171. data/spec/unit/abstract_class_spec.rb +0 -27
  172. data/spec/unit/api_spec.rb +0 -104
  173. data/spec/unit/basic_two_state_machines_example_spec.rb +0 -10
  174. data/spec/unit/callback_multiple_spec.rb +0 -304
  175. data/spec/unit/callbacks_spec.rb +0 -521
  176. data/spec/unit/complex_example_spec.rb +0 -93
  177. data/spec/unit/complex_multiple_example_spec.rb +0 -115
  178. data/spec/unit/edge_cases_spec.rb +0 -16
  179. data/spec/unit/event_multiple_spec.rb +0 -73
  180. data/spec/unit/event_naming_spec.rb +0 -16
  181. data/spec/unit/event_spec.rb +0 -394
  182. data/spec/unit/exception_spec.rb +0 -11
  183. data/spec/unit/guard_arguments_check_spec.rb +0 -9
  184. data/spec/unit/guard_multiple_spec.rb +0 -60
  185. data/spec/unit/guard_spec.rb +0 -89
  186. data/spec/unit/guard_with_params_multiple_spec.rb +0 -10
  187. data/spec/unit/guard_with_params_spec.rb +0 -14
  188. data/spec/unit/guard_without_from_specified_spec.rb +0 -10
  189. data/spec/unit/initial_state_multiple_spec.rb +0 -15
  190. data/spec/unit/initial_state_spec.rb +0 -12
  191. data/spec/unit/inspection_multiple_spec.rb +0 -205
  192. data/spec/unit/inspection_spec.rb +0 -153
  193. data/spec/unit/invoker_spec.rb +0 -189
  194. data/spec/unit/invokers/base_invoker_spec.rb +0 -72
  195. data/spec/unit/invokers/class_invoker_spec.rb +0 -95
  196. data/spec/unit/invokers/literal_invoker_spec.rb +0 -86
  197. data/spec/unit/invokers/proc_invoker_spec.rb +0 -86
  198. data/spec/unit/localizer_spec.rb +0 -77
  199. data/spec/unit/memory_leak_spec.rb +0 -38
  200. data/spec/unit/multiple_transitions_that_differ_only_by_guard_spec.rb +0 -14
  201. data/spec/unit/namespaced_multiple_example_spec.rb +0 -75
  202. data/spec/unit/new_dsl_spec.rb +0 -12
  203. data/spec/unit/override_warning_spec.rb +0 -94
  204. data/spec/unit/persistence/active_record_persistence_multiple_spec.rb +0 -618
  205. data/spec/unit/persistence/active_record_persistence_spec.rb +0 -840
  206. data/spec/unit/persistence/dynamoid_persistence_multiple_spec.rb +0 -135
  207. data/spec/unit/persistence/dynamoid_persistence_spec.rb +0 -84
  208. data/spec/unit/persistence/mongoid_persistence_multiple_spec.rb +0 -200
  209. data/spec/unit/persistence/mongoid_persistence_spec.rb +0 -165
  210. data/spec/unit/persistence/no_brainer_persistence_multiple_spec.rb +0 -198
  211. data/spec/unit/persistence/no_brainer_persistence_spec.rb +0 -158
  212. data/spec/unit/persistence/redis_persistence_multiple_spec.rb +0 -88
  213. data/spec/unit/persistence/redis_persistence_spec.rb +0 -53
  214. data/spec/unit/persistence/sequel_persistence_multiple_spec.rb +0 -148
  215. data/spec/unit/persistence/sequel_persistence_spec.rb +0 -368
  216. data/spec/unit/readme_spec.rb +0 -41
  217. data/spec/unit/reloading_spec.rb +0 -15
  218. data/spec/unit/rspec_matcher_spec.rb +0 -88
  219. data/spec/unit/simple_custom_example_spec.rb +0 -39
  220. data/spec/unit/simple_example_spec.rb +0 -57
  221. data/spec/unit/simple_multiple_example_spec.rb +0 -91
  222. data/spec/unit/state_spec.rb +0 -105
  223. data/spec/unit/states_on_one_line_example_spec.rb +0 -16
  224. data/spec/unit/subclassing_multiple_spec.rb +0 -74
  225. data/spec/unit/subclassing_spec.rb +0 -46
  226. data/spec/unit/transition_spec.rb +0 -436
  227. data/test/minitest_helper.rb +0 -57
  228. data/test/unit/minitest_matcher_test.rb +0 -80
@@ -1,18 +0,0 @@
1
- # encoding: utf-8
2
-
3
- begin
4
- require 'redis-objects'
5
- require 'redis/objects/version'
6
- puts "redis-objects #{Redis::Objects::VERSION} gem found, running Redis specs \e[32m#{'✔'}\e[0m"
7
-
8
- Redis.current = Redis.new(host: (ENV['REDIS_HOST'] || '127.0.0.1'),
9
- port: (ENV['REDIS_PORT'] || 6379))
10
-
11
- RSpec.configure do |c|
12
- c.before(:each) do
13
- Redis.current.keys('redis_*').each { |k| Redis.current.del k }
14
- end
15
- end
16
- rescue LoadError
17
- puts "redis-objects gem not found, not running Redis specs \e[31m#{'✖'}\e[0m"
18
- end
@@ -1 +0,0 @@
1
- AASM::Configuration.hide_warnings = true
@@ -1,7 +0,0 @@
1
- # encoding: utf-8
2
- begin
3
- require 'sequel'
4
- puts "sequel #{Sequel::VERSION} gem found, running Sequel specs \e[32m#{'✔'}\e[0m"
5
- rescue LoadError
6
- puts "sequel gem not found, not running Sequel specs \e[31m#{'✖'}\e[0m"
7
- end
@@ -1,27 +0,0 @@
1
- require 'spec_helper'
2
- if defined?(ActiveRecord)
3
- require 'models/active_record/person'
4
-
5
- load_schema
6
- describe 'Abstract subclassing' do
7
-
8
- it 'should have the parent states' do
9
- Person.aasm.states.each do |state|
10
- expect(Base.aasm.states).to include(state)
11
- end
12
- expect(Person.aasm.states).to eq(Base.aasm.states)
13
- end
14
-
15
- it 'should have the same events as its parent' do
16
- expect(Base.aasm.events).to eq(Person.aasm.events)
17
- end
18
-
19
- it 'should not break aasm methods when super class is abstract_class' do
20
- person = Person.new
21
- person.status = 'active'
22
- person.deactivate!
23
- expect(person.aasm.current_state).to eq(:inactive)
24
- end
25
-
26
- end
27
- end
@@ -1,104 +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 display option" do
17
- expect(DefaultState.new.aasm.human_state).to eql "ALPHA"
18
- end
19
-
20
- it "uses the provided method" do
21
- expect(ProvidedState.new.aasm.current_state).to eql :beta
22
- end
23
-
24
- it "uses the persistence storage" do
25
- expect(PersistedState.new.aasm.current_state).to eql :alpha
26
- end
27
-
28
- it "uses the provided method even if persisted" do
29
- expect(ProvidedAndPersistedState.new.aasm.current_state).to eql :gamma
30
- end
31
-
32
- context "after dup" do
33
- it "uses the persistence storage" do
34
- source = PersistedState.create!
35
- copy = source.dup
36
- copy.save!
37
-
38
- copy.release!
39
-
40
- expect(source.aasm_state).to eql 'alpha'
41
- expect(source.aasm.current_state).to eql :alpha
42
-
43
- source2 = PersistedState.find(source.id)
44
- expect(source2.reload.aasm_state).to eql 'alpha'
45
- expect(source2.aasm.current_state).to eql :alpha
46
-
47
- expect(copy.aasm_state).to eql 'beta'
48
- expect(copy.aasm.current_state).to eql :beta
49
- end
50
- end
51
- end
52
-
53
- describe "writing and persisting the current state" do
54
- it "uses the AASM default" do
55
- o = DefaultState.new
56
- o.release!
57
- expect(o.persisted_store).to be_nil
58
- end
59
-
60
- it "uses the provided method" do
61
- o = ProvidedState.new
62
- o.release!
63
- expect(o.persisted_store).to eql :beta
64
- end
65
-
66
- it "uses the persistence storage" do
67
- o = PersistedState.new
68
- o.release!
69
- expect(o.persisted_store).to be_nil
70
- end
71
-
72
- it "uses the provided method even if persisted" do
73
- o = ProvidedAndPersistedState.new
74
- o.release!
75
- expect(o.persisted_store).to eql :beta
76
- end
77
- end
78
-
79
- describe "writing the current state without persisting it" do
80
- it "uses the AASM default" do
81
- o = DefaultState.new
82
- o.release
83
- expect(o.transient_store).to be_nil
84
- end
85
-
86
- it "uses the provided method" do
87
- o = ProvidedState.new
88
- o.release
89
- expect(o.transient_store).to eql :beta
90
- end
91
-
92
- it "uses the persistence storage" do
93
- o = PersistedState.new
94
- o.release
95
- expect(o.transient_store).to be_nil
96
- end
97
-
98
- it "uses the provided method even if persisted" do
99
- o = ProvidedAndPersistedState.new
100
- o.release
101
- expect(o.transient_store).to eql :beta
102
- end
103
- end
104
- 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,304 +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): [: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): [: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(:before_success_method).with(:arg1).once.ordered
158
- expect(cb).to receive(:success_method).with(:arg1).once.ordered
159
- expect(cb).to receive(:after_method).with(:arg1).once.ordered
160
- cb.close!(:out_to_lunch, :arg1)
161
-
162
- cb = Callbacks::WithStateArgMultiple.new
163
- some_object = double('some object')
164
- expect(cb).to receive(:before_method).with(some_object).once.ordered
165
- expect(cb).to receive(:transition_method2).with(some_object).once.ordered
166
- expect(cb).to receive(:before_success_method).with(some_object).once.ordered
167
- expect(cb).to receive(:success_method).with(some_object).once.ordered
168
- expect(cb).to receive(:after_method).with(some_object).once.ordered
169
- cb.close!(:out_to_lunch, some_object)
170
- end
171
-
172
- it "should call the proper methods just with arguments" do
173
- cb = Callbacks::WithStateArgMultiple.new
174
- expect(cb).to receive(:before_method).with(:arg1).once.ordered
175
- expect(cb).to receive(:transition_method).with(:arg1).once.ordered
176
- expect(cb).to receive(:transition_method).never
177
- expect(cb).to receive(:after_method).with(:arg1).once.ordered
178
- cb.close!(:arg1)
179
-
180
- cb = Callbacks::WithStateArgMultiple.new
181
- some_object = double('some object')
182
- expect(cb).to receive(:before_method).with(some_object).once.ordered
183
- expect(cb).to receive(:transition_method).with(some_object).once.ordered
184
- expect(cb).to receive(:transition_method).never
185
- expect(cb).to receive(:after_method).with(some_object).once.ordered
186
- cb.close!(some_object)
187
- end
188
- end # callbacks for the new DSL
189
-
190
- describe 'event callbacks' do
191
- describe "with an error callback defined" do
192
- before do
193
- class FooCallbackMultiple
194
- # this hack is needed to allow testing of parameters, since RSpec
195
- # destroys a method's arity when mocked
196
- attr_accessor :data
197
-
198
- aasm(:left) do
199
- event :safe_close, :success => :success_callback, :error => :error_callback do
200
- transitions :to => :closed, :from => [:open]
201
- end
202
- end
203
- end
204
-
205
- @foo = FooCallbackMultiple.new
206
- end
207
-
208
- context "error_callback defined" do
209
- it "should run error_callback if an exception is raised" do
210
- def @foo.error_callback(e)
211
- @data = [e]
212
- end
213
-
214
- allow(@foo).to receive(:before_enter).and_raise(e = StandardError.new)
215
-
216
- @foo.safe_close!
217
- expect(@foo.data).to eql [e]
218
- end
219
-
220
- it "should run error_callback without parameters if callback does not support any" do
221
- def @foo.error_callback(e)
222
- @data = []
223
- end
224
-
225
- allow(@foo).to receive(:before_enter).and_raise(e = StandardError.new)
226
-
227
- @foo.safe_close!('arg1', 'arg2')
228
- expect(@foo.data).to eql []
229
- end
230
-
231
- it "should run error_callback with parameters if callback supports them" do
232
- def @foo.error_callback(e, arg1, arg2)
233
- @data = [arg1, arg2]
234
- end
235
-
236
- allow(@foo).to receive(:before_enter).and_raise(e = StandardError.new)
237
-
238
- @foo.safe_close!('arg1', 'arg2')
239
- expect(@foo.data).to eql ['arg1', 'arg2']
240
- end
241
- end
242
-
243
- it "should raise NoMethodError if exception is raised and error_callback is declared but not defined" do
244
- allow(@foo).to receive(:before_enter).and_raise(StandardError)
245
- expect{@foo.safe_close!}.to raise_error(NoMethodError)
246
- end
247
-
248
- it "should propagate an error if no error callback is declared" do
249
- allow(@foo).to receive(:before_enter).and_raise("Cannot enter safe")
250
- expect{@foo.close!}.to raise_error(StandardError, "Cannot enter safe")
251
- end
252
- end
253
-
254
- describe "with aasm_event_fired defined" do
255
- before do
256
- @foo = FooMultiple.new
257
- def @foo.aasm_event_fired(event, from, to); end
258
- end
259
-
260
- it 'should call it for successful bang fire' do
261
- expect(@foo).to receive(:aasm_event_fired).with(:close, :open, :closed)
262
- @foo.close!
263
- end
264
-
265
- it 'should call it for successful non-bang fire' do
266
- expect(@foo).to receive(:aasm_event_fired)
267
- @foo.close
268
- end
269
-
270
- it 'should not call it for failing bang fire' do
271
- allow(@foo.aasm(:left)).to receive(:set_current_state_with_persistence).and_return(false)
272
- expect(@foo).not_to receive(:aasm_event_fired)
273
- @foo.close!
274
- end
275
- end
276
-
277
- describe "with aasm_event_failed defined" do
278
- before do
279
- @foo = FooMultiple.new
280
- def @foo.aasm_event_failed(event, from); end
281
- end
282
-
283
- it 'should call it when transition failed for bang fire' do
284
- expect(@foo).to receive(:aasm_event_failed).with(:null, :open)
285
- expect{
286
- @foo.null!
287
- }.to raise_error(AASM::InvalidTransition, "Event 'null' cannot transition from 'open'. Failed callback(s): [:always_false].")
288
- end
289
-
290
- it 'should call it when transition failed for non-bang fire' do
291
- expect(@foo).to receive(:aasm_event_failed).with(:null, :open)
292
- expect{
293
- @foo.null
294
- }.to raise_error(AASM::InvalidTransition, "Event 'null' cannot transition from 'open'. Failed callback(s): [:always_false].")
295
- end
296
-
297
- it 'should not call it if persist fails for bang fire' do
298
- allow(@foo.aasm(:left)).to receive(:set_current_state_with_persistence).and_return(false)
299
- expect(@foo).to receive(:aasm_event_failed)
300
- @foo.close!
301
- end
302
- end
303
-
304
- end # event callbacks