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,491 +0,0 @@
1
- require 'spec_helper'
2
- Dir[File.dirname(__FILE__) + "/../models/callbacks/*.rb"].sort.each { |f| require File.expand_path(f) }
3
-
4
- shared_examples 'an implemented callback that accepts error' do
5
- context 'with callback defined' do
6
- it "should run error_callback if an exception is raised and always return false" do
7
- aasm_model.class.send(:define_method, callback_name) do |e|
8
- @data = [e]
9
- end
10
-
11
- allow(aasm_model).to receive(:before_enter).and_raise(e = StandardError.new)
12
-
13
- expect(aasm_model.safe_close!).to be false
14
- expect(aasm_model.data).to eql [e]
15
- end
16
-
17
- it "should run error_callback without parameters if callback does not support any" do
18
- aasm_model.class.send(:define_method, callback_name) do |e|
19
- @data = []
20
- end
21
-
22
- allow(aasm_model).to receive(:before_enter).and_raise(e = StandardError.new)
23
-
24
- aasm_model.safe_close!('arg1', 'arg2')
25
- expect(aasm_model.data).to eql []
26
- end
27
-
28
- it "should run error_callback with parameters if callback supports them" do
29
- aasm_model.class.send(:define_method, callback_name) do |e, arg1, arg2|
30
- @data = [arg1, arg2]
31
- end
32
-
33
- allow(aasm_model).to receive(:before_enter).and_raise(e = StandardError.new)
34
-
35
- aasm_model.safe_close!('arg1', 'arg2')
36
- expect(aasm_model.data).to eql ['arg1', 'arg2']
37
- end
38
- end
39
- end
40
-
41
- shared_examples 'an implemented callback' do
42
- context 'with callback defined' do
43
- it 'should run callback without parameters if callback does not support any' do
44
- aasm_model.class.send(:define_method, callback_name) do
45
- @data = ['callback-was-called']
46
- end
47
-
48
- aasm_model.safe_close!
49
- expect(aasm_model.data).to eql ['callback-was-called']
50
- end
51
-
52
- it 'should run callback with parameters if callback supports them' do
53
- aasm_model.class.send(:define_method, callback_name) do |arg1, arg2|
54
- @data = [arg1, arg2]
55
- end
56
-
57
- aasm_model.safe_close!('arg1', 'arg2')
58
- expect(aasm_model.data).to eql ['arg1', 'arg2']
59
- end
60
- end
61
- end
62
-
63
- describe 'callbacks for the new DSL' do
64
-
65
- it "be called in order" do
66
- show_debug_log = false
67
-
68
- callback = Callbacks::Basic.new(:log => show_debug_log)
69
- callback.aasm.current_state
70
-
71
- unless show_debug_log
72
- expect(callback).to receive(:before_all_events).once.ordered
73
- expect(callback).to receive(:before_event).once.ordered
74
- expect(callback).to receive(:event_guard).once.ordered.and_return(true)
75
- expect(callback).to receive(:transition_guard).once.ordered.and_return(true)
76
- expect(callback).to receive(:before_exit_open).once.ordered # these should be before the state changes
77
- expect(callback).to receive(:exit_open).once.ordered
78
- # expect(callback).to receive(:event_guard).once.ordered.and_return(true)
79
- # expect(callback).to receive(:transition_guard).once.ordered.and_return(true)
80
- expect(callback).to receive(:after_all_transitions).once.ordered
81
- expect(callback).to receive(:after_transition).once.ordered
82
- expect(callback).to receive(:before_enter_closed).once.ordered
83
- expect(callback).to receive(:enter_closed).once.ordered
84
- expect(callback).to receive(:aasm_write_state).once.ordered.and_return(true) # this is when the state changes
85
- expect(callback).to receive(:after_exit_open).once.ordered # these should be after the state changes
86
- expect(callback).to receive(:after_enter_closed).once.ordered
87
- expect(callback).to receive(:after_event).once.ordered
88
- expect(callback).to receive(:after_all_events).once.ordered
89
- expect(callback).to receive(:ensure_event).once.ordered
90
- expect(callback).to receive(:ensure_on_all_events).once.ordered
91
- end
92
-
93
- # puts "------- close!"
94
- callback.close!
95
- end
96
-
97
-
98
- it "works fine after reload" do
99
- show_debug_log = false
100
-
101
- callback = Callbacks::Basic.new(:log => show_debug_log)
102
- callback.aasm.current_state
103
-
104
- # reload the class
105
- Callbacks.send(:remove_const, :Basic)
106
- load 'models/callbacks/basic.rb'
107
-
108
- unless show_debug_log
109
- expect(callback).to receive(:before_event).once.ordered
110
- expect(callback).to receive(:event_guard).once.ordered.and_return(true)
111
- expect(callback).to receive(:transition_guard).once.ordered.and_return(true)
112
- expect(callback).to receive(:before_exit_open).once.ordered # these should be before the state changes
113
- expect(callback).to receive(:exit_open).once.ordered
114
- # expect(callback).to receive(:event_guard).once.ordered.and_return(true)
115
- # expect(callback).to receive(:transition_guard).once.ordered.and_return(true)
116
- expect(callback).to receive(:after_all_transitions).once.ordered
117
- expect(callback).to receive(:after_transition).once.ordered
118
- expect(callback).to receive(:before_enter_closed).once.ordered
119
- expect(callback).to receive(:enter_closed).once.ordered
120
- expect(callback).to receive(:aasm_write_state).once.ordered.and_return(true) # this is when the state changes
121
- expect(callback).to receive(:event_before_success).once.ordered
122
- expect(callback).to receive(:success_transition).once.ordered.and_return(true) # these should be after the state changes
123
- expect(callback).to receive(:after_exit_open).once.ordered
124
- expect(callback).to receive(:after_enter_closed).once.ordered
125
- expect(callback).to receive(:after_event).once.ordered
126
- end
127
-
128
- # puts "------- close!"
129
- callback.close!
130
- end
131
-
132
- it "does not run any state callback if the event guard fails" do
133
- callback = Callbacks::Basic.new(:log => false)
134
- callback.aasm.current_state
135
-
136
- expect(callback).to receive(:before_all_events).once.ordered
137
- expect(callback).to receive(:before_event).once.ordered
138
- expect(callback).to receive(:event_guard).once.ordered.and_return(false)
139
- expect(callback).to_not receive(:transition_guard)
140
- expect(callback).to_not receive(:before_exit_open)
141
- expect(callback).to_not receive(:exit_open)
142
- expect(callback).to_not receive(:after_all_transitions)
143
- expect(callback).to_not receive(:after_transition)
144
- expect(callback).to_not receive(:before_enter_closed)
145
- expect(callback).to_not receive(:enter_closed)
146
- expect(callback).to_not receive(:aasm_write_state)
147
- expect(callback).to_not receive(:event_before_success)
148
- expect(callback).to_not receive(:success_transition)
149
- expect(callback).to_not receive(:after_exit_open)
150
- expect(callback).to_not receive(:after_enter_closed)
151
- expect(callback).to_not receive(:after_event)
152
- expect(callback).to_not receive(:after_all_events)
153
- expect(callback).to receive(:ensure_event).once.ordered
154
- expect(callback).to receive(:ensure_on_all_events).once.ordered
155
-
156
- expect {
157
- callback.close!
158
- }.to raise_error(AASM::InvalidTransition)
159
- end
160
-
161
- it "handles private callback methods as well" do
162
- show_debug_log = false
163
-
164
- callback = Callbacks::PrivateMethod.new(:log => show_debug_log)
165
- callback.aasm.current_state
166
-
167
- # puts "------- close!"
168
- expect {
169
- callback.close!
170
- }.to_not raise_error
171
- end
172
-
173
- context "if the transition guard fails" do
174
- it "does not run any state callback if guard is defined inline" do
175
- show_debug_log = false
176
- callback = Callbacks::Basic.new(:log => show_debug_log, :fail_transition_guard => true)
177
- callback.aasm.current_state
178
-
179
- unless show_debug_log
180
- expect(callback).to receive(:before_all_events).once.ordered
181
- expect(callback).to receive(:before_event).once.ordered
182
- expect(callback).to receive(:event_guard).once.ordered.and_return(true)
183
- expect(callback).to receive(:transition_guard).once.ordered.and_return(false)
184
- expect(callback).to_not receive(:before_exit_open)
185
- expect(callback).to_not receive(:exit_open)
186
- expect(callback).to_not receive(:after_all_transitions)
187
- expect(callback).to_not receive(:after_transition)
188
- expect(callback).to_not receive(:before_enter_closed)
189
- expect(callback).to_not receive(:enter_closed)
190
- expect(callback).to_not receive(:aasm_write_state)
191
- expect(callback).to_not receive(:event_before_success)
192
- expect(callback).to_not receive(:success_transition)
193
- expect(callback).to_not receive(:after_exit_open)
194
- expect(callback).to_not receive(:after_enter_closed)
195
- expect(callback).to_not receive(:after_event)
196
- expect(callback).to_not receive(:after_all_events)
197
- expect(callback).to receive(:ensure_event).once.ordered
198
- expect(callback).to receive(:ensure_on_all_events).once.ordered
199
- end
200
-
201
- expect {
202
- callback.close!
203
- }.to raise_error(AASM::InvalidTransition)
204
- end
205
-
206
- it "does not run transition_guard twice for multiple permitted transitions" do
207
- show_debug_log = false
208
- callback = Callbacks::MultipleTransitionsTransitionGuard.new(:log => show_debug_log, :fail_transition_guard => true)
209
- callback.aasm.current_state
210
-
211
- unless show_debug_log
212
- expect(callback).to receive(:before).once.ordered
213
- expect(callback).to receive(:event_guard).once.ordered.and_return(true)
214
- expect(callback).to receive(:transition_guard).once.ordered.and_return(false)
215
- expect(callback).to receive(:event_guard).once.ordered.and_return(true)
216
- expect(callback).to receive(:before_exit_open).once.ordered
217
- expect(callback).to receive(:exit_open).once.ordered
218
- expect(callback).to receive(:aasm_write_state).once.ordered.and_return(true) # this is when the state changes
219
- expect(callback).to receive(:after_exit_open).once.ordered
220
- expect(callback).to receive(:after).once.ordered
221
-
222
- expect(callback).to_not receive(:transitioning)
223
- expect(callback).to_not receive(:event_before_success)
224
- expect(callback).to_not receive(:success_transition)
225
- expect(callback).to_not receive(:before_enter_closed)
226
- expect(callback).to_not receive(:enter_closed)
227
- expect(callback).to_not receive(:after_enter_closed)
228
- end
229
-
230
- callback.close!
231
- expect(callback.aasm.current_state).to eql :failed
232
- end
233
-
234
- it "does not run any state callback if guard is defined with block" do
235
- callback = Callbacks::GuardWithinBlock.new #(:log => true, :fail_transition_guard => true)
236
- callback.aasm.current_state
237
-
238
- expect(callback).to receive(:before).once.ordered
239
- expect(callback).to receive(:event_guard).once.ordered.and_return(true)
240
- expect(callback).to receive(:transition_guard).once.ordered.and_return(false)
241
- expect(callback).to_not receive(:before_exit_open)
242
- expect(callback).to_not receive(:exit_open)
243
- expect(callback).to_not receive(:transitioning)
244
- expect(callback).to_not receive(:before_enter_closed)
245
- expect(callback).to_not receive(:enter_closed)
246
- expect(callback).to_not receive(:aasm_write_state)
247
- expect(callback).to_not receive(:event_before_success)
248
- expect(callback).to_not receive(:success_transition)
249
- expect(callback).to_not receive(:after_exit_open)
250
- expect(callback).to_not receive(:after_enter_closed)
251
- expect(callback).to_not receive(:after)
252
-
253
- expect {
254
- callback.close!
255
- }.to raise_error(AASM::InvalidTransition)
256
- end
257
- end
258
-
259
- it "should properly pass arguments" do
260
- cb = Callbacks::WithArgs.new(:log => false)
261
- cb.aasm.current_state
262
-
263
- cb.reset_data
264
- cb.close!(:arg1, :arg2)
265
- 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 transition_success(:arg1,:arg2) after_exit_open(:arg1,:arg2) after_enter_closed(:arg1,:arg2) after(:arg1,:arg2)'
266
- end
267
-
268
- it "should call the callbacks given the to-state as argument" do
269
- cb = Callbacks::WithStateArg.new
270
- expect(cb).to receive(:before_method).with(:arg1).once.ordered
271
- expect(cb).to receive(:transition_method).never
272
- expect(cb).to receive(:success_method).never
273
- expect(cb).to receive(:transition_method2).with(:arg1).once.ordered
274
- expect(cb).to receive(:success_method2).with(:arg1).once.ordered
275
- expect(cb).to receive(:after_method).with(:arg1).once.ordered
276
- cb.close!(:out_to_lunch, :arg1)
277
-
278
- cb = Callbacks::WithStateArg.new
279
- some_object = double('some object')
280
- expect(cb).to receive(:before_method).with(some_object).once.ordered
281
- expect(cb).to receive(:transition_method2).with(some_object).once.ordered
282
- expect(cb).to receive(:success_method2).with(some_object).once.ordered
283
- expect(cb).to receive(:after_method).with(some_object).once.ordered
284
- cb.close!(:out_to_lunch, some_object)
285
- end
286
-
287
- it "should call the proper methods just with arguments" do
288
- cb = Callbacks::WithStateArg.new
289
- expect(cb).to receive(:before_method).with(:arg1).once.ordered
290
- expect(cb).to receive(:transition_method).with(:arg1).once.ordered
291
- expect(cb).to receive(:transition_method).never
292
- expect(cb).to receive(:success_method).with(:arg1).once.ordered
293
- expect(cb).to receive(:success_method).never
294
- expect(cb).to receive(:after_method).with(:arg1).once.ordered
295
- cb.close!(:arg1)
296
-
297
- cb = Callbacks::WithStateArg.new
298
- some_object = double('some object')
299
- expect(cb).to receive(:before_method).with(some_object).once.ordered
300
- expect(cb).to receive(:transition_method).with(some_object).once.ordered
301
- expect(cb).to receive(:transition_method).never
302
- expect(cb).to receive(:success_method).with(some_object).once.ordered
303
- expect(cb).to receive(:success_method).never
304
- expect(cb).to receive(:after_method).with(some_object).once.ordered
305
- cb.close!(some_object)
306
- end
307
- end
308
-
309
- describe 'event callbacks' do
310
- describe "with an error callback defined" do
311
- before do
312
- class Foo
313
- # this hack is needed to allow testing of parameters, since RSpec
314
- # destroys a method's arity when mocked
315
- attr_accessor :data
316
-
317
- aasm do
318
- event :safe_close, :success => :success_callback, :error => :error_callback do
319
- transitions :to => :closed, :from => [:open], :success => :transition_success_callback
320
- end
321
- end
322
- end
323
-
324
- @foo = Foo.new
325
- end
326
-
327
- it_behaves_like 'an implemented callback that accepts error' do
328
- let(:aasm_model) { @foo }
329
- let(:callback_name) { :error_callback }
330
- end
331
-
332
- it "should raise NoMethodError if exception is raised and error_callback is declared but not defined" do
333
- allow(@foo).to receive(:before_enter).and_raise(StandardError)
334
- expect{@foo.safe_close!}.to raise_error(NoMethodError)
335
- end
336
-
337
- it "should propagate an error if no error callback is declared" do
338
- allow(@foo).to receive(:before_enter).and_raise("Cannot enter safe")
339
- expect{@foo.close!}.to raise_error(StandardError, "Cannot enter safe")
340
- end
341
- end
342
-
343
- describe 'with an ensure callback defined' do
344
- before do
345
- class Foo
346
- # this hack is needed to allow testing of parameters, since RSpec
347
- # destroys a method's arity when mocked
348
- attr_accessor :data
349
-
350
- aasm do
351
- event :safe_close, :success => :success_callback, :ensure => :ensure_callback do
352
- transitions :to => :closed, :from => [:open]
353
- end
354
- end
355
- end
356
-
357
- @foo = Foo.new
358
- end
359
-
360
- it_behaves_like 'an implemented callback' do
361
- let(:aasm_model) { @foo }
362
- let(:callback_name) { :ensure_callback }
363
- end
364
-
365
- it "should raise NoMethodError if ensure_callback is declared but not defined" do
366
- expect{@foo.safe_close!}.to raise_error(NoMethodError)
367
- end
368
-
369
- it "should not raise any error if no ensure_callback is declared" do
370
- expect{@foo.close!}.to_not raise_error
371
- end
372
- end
373
-
374
- describe "with aasm_event_fired defined" do
375
- before do
376
- @foo = Foo.new
377
- def @foo.aasm_event_fired(event, from, to); end
378
- end
379
-
380
- it 'should call it for successful bang fire' do
381
- expect(@foo).to receive(:aasm_event_fired).with(:close, :open, :closed)
382
- @foo.close!
383
- end
384
-
385
- it 'should call it for successful non-bang fire' do
386
- expect(@foo).to receive(:aasm_event_fired)
387
- @foo.close
388
- end
389
-
390
- it 'should not call it for failing bang fire' do
391
- allow(@foo.aasm).to receive(:set_current_state_with_persistence).and_return(false)
392
- expect(@foo).not_to receive(:aasm_event_fired)
393
- @foo.close!
394
- end
395
- end
396
-
397
- describe "with aasm_event_failed defined" do
398
- before do
399
- @foo = Foo.new
400
- def @foo.aasm_event_failed(event, from); end
401
- end
402
-
403
- it 'should call it when transition failed for bang fire' do
404
- expect(@foo).to receive(:aasm_event_failed).with(:null, :open)
405
- expect {@foo.null!}.to raise_error(AASM::InvalidTransition)
406
- end
407
-
408
- it 'should call it when transition failed for non-bang fire' do
409
- expect(@foo).to receive(:aasm_event_failed).with(:null, :open)
410
- expect {@foo.null}.to raise_error(AASM::InvalidTransition)
411
- end
412
-
413
- it 'should not call it if persist fails for bang fire' do
414
- allow(@foo.aasm).to receive(:set_current_state_with_persistence).and_return(false)
415
- expect(@foo).to receive(:aasm_event_failed)
416
- @foo.close!
417
- end
418
- end
419
- end
420
-
421
- describe 'global error_on_all_events_callback callbacks' do
422
- describe "with an error_on_all_events" do
423
- before do
424
- class FooGlobal
425
- # this hack is needed to allow testing of parameters, since RSpec
426
- # destroys a method's arity when mocked
427
- attr_accessor :data
428
-
429
- aasm do
430
- error_on_all_events :error_on_all_events_callback
431
-
432
- event :safe_close do
433
- transitions :to => :closed, :from => [:open]
434
- end
435
- end
436
- end
437
-
438
- @foo = FooGlobal.new
439
- end
440
-
441
- it_behaves_like 'an implemented callback that accepts error' do
442
- let(:aasm_model) { @foo }
443
- let(:callback_name) { :error_on_all_events_callback }
444
- end
445
-
446
- it "should raise NoMethodError if exception is raised and error_callback is declared but not defined" do
447
- allow(@foo).to receive(:before_enter).and_raise(StandardError)
448
- expect{@foo.safe_close!}.to raise_error(NoMethodError)
449
- end
450
-
451
- it "should raise NoMethodError if no error callback is declared" do
452
- allow(@foo).to receive(:before_enter).and_raise("Cannot enter safe")
453
- expect{@foo.close!}.to raise_error(NoMethodError)
454
- end
455
- end
456
- end
457
-
458
- describe 'global ensure_on_all_events_callback callbacks' do
459
- describe "with an ensure_on_all_events" do
460
- before do
461
- class FooGlobal
462
- # this hack is needed to allow testing of parameters, since RSpec
463
- # destroys a method's arity when mocked
464
- attr_accessor :data
465
-
466
- aasm do
467
- ensure_on_all_events :ensure_on_all_events_callback
468
-
469
- event :safe_close do
470
- transitions :to => :closed, :from => [:open]
471
- end
472
- end
473
- end
474
-
475
- @foo = FooGlobal.new
476
- end
477
-
478
- it_behaves_like 'an implemented callback' do
479
- let(:aasm_model) { @foo }
480
- let(:callback_name) { :ensure_on_all_events_callback }
481
- end
482
-
483
- it "should raise NoMethodError if ensure_on_all_events callback is declared but not defined" do
484
- expect{@foo.safe_close!}.to raise_error(NoMethodError)
485
- end
486
-
487
- it "should raise NoMethodError if no ensure_on_all_events callback is declared" do
488
- expect{@foo.close!}.to raise_error(NoMethodError)
489
- end
490
- end
491
- end
@@ -1,94 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'on initialization' do
4
- let(:auth) {ComplexExample.new}
5
-
6
- it 'should be in the pending state' do
7
- expect(auth.aasm.current_state).to eq(:pending)
8
- end
9
-
10
- it 'should have an activation code' do
11
- expect(auth.has_activation_code?).to be_truthy
12
- expect(auth.activation_code).not_to be_nil
13
- end
14
- end
15
-
16
- describe 'when being unsuspended' do
17
- let(:auth) {ComplexExample.new}
18
-
19
- it 'should be able to be unsuspended' do
20
- auth.activate!
21
- auth.suspend!
22
- expect(auth.may_unsuspend?).to be true
23
- end
24
-
25
- it 'should not be able to be unsuspended into active' do
26
- auth.suspend!
27
- expect(auth.may_unsuspend?(:active)).not_to be true
28
- end
29
-
30
- it 'should be able to be unsuspended into active if polite' do
31
- auth.suspend!
32
- expect(auth.may_wait?(:waiting, :please)).to be true
33
- auth.wait!(:please)
34
- end
35
-
36
- it 'should not be able to be unsuspended into active if not polite' do
37
- auth.suspend!
38
- expect(auth.may_wait?(:waiting)).not_to be true
39
- expect(auth.may_wait?(:waiting, :rude)).not_to be true
40
- expect {auth.wait!(:rude)}.to raise_error(AASM::InvalidTransition)
41
- expect {auth.wait!}.to raise_error(AASM::InvalidTransition)
42
- end
43
-
44
- it 'should not be able to be unpassified' do
45
- auth.activate!
46
- auth.suspend!
47
- auth.unsuspend!
48
-
49
- expect(auth.may_unpassify?).not_to be true
50
- expect {auth.unpassify!}.to raise_error(AASM::InvalidTransition)
51
- end
52
-
53
- it 'should be active if previously activated' do
54
- auth.activate!
55
- auth.suspend!
56
- auth.unsuspend!
57
-
58
- expect(auth.aasm.current_state).to eq(:active)
59
- end
60
-
61
- it 'should be pending if not previously activated, but an activation code is present' do
62
- auth.suspend!
63
- auth.unsuspend!
64
-
65
- expect(auth.aasm.current_state).to eq(:pending)
66
- end
67
-
68
- it 'should be passive if not previously activated and there is no activation code' do
69
- auth.activation_code = nil
70
- auth.suspend!
71
- auth.unsuspend!
72
-
73
- expect(auth.aasm.current_state).to eq(:passive)
74
- end
75
-
76
- it "should be able to fire known events" do
77
- expect(auth.aasm.may_fire_event?(:activate)).to be true
78
- end
79
-
80
- it "should be able to fire event by name" do
81
- expect(auth.aasm.fire(:activate)).to be true
82
- expect(auth.aasm.current_state).to eq(:active)
83
- end
84
-
85
- it "should be able to fire! event by name" do
86
- expect(auth.aasm.fire!(:activate)).to be true
87
- expect(auth.aasm.current_state).to eq(:active)
88
- end
89
-
90
- it "should not be able to fire unknown events" do
91
- expect(auth.aasm.may_fire_event?(:unknown)).to be false
92
- end
93
-
94
- end
@@ -1,115 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'on initialization' do
4
- let(:auth) {ComplexExampleMultiple.new}
5
-
6
- it 'should be in the initial state' do
7
- expect(auth.aasm(:left).current_state).to eq(:pending)
8
- expect(auth.aasm(:right).current_state).to eq(:pending)
9
- end
10
-
11
- it 'should have an activation code' do
12
- expect(auth.has_activation_code?).to be_truthy
13
- expect(auth.activation_code).to eq '12'
14
- end
15
- end
16
-
17
- describe 'when being unsuspended' do
18
- let(:auth) {ComplexExampleMultiple.new}
19
-
20
- it 'should be able to unsuspend' do
21
- auth.left_activate!
22
- auth.left_suspend!
23
- expect(auth.may_left_unsuspend?).to be true
24
-
25
- auth.right_activate!
26
- auth.right_suspend!
27
- expect(auth.may_right_unsuspend?).to be true
28
- end
29
-
30
- it 'should not be able to unsuspend into active' do
31
- auth.left_suspend!
32
- expect(auth.may_left_unsuspend?(:active)).not_to be true
33
-
34
- auth.right_activate!
35
- auth.right_suspend!
36
- expect(auth.may_right_unsuspend?(:active)).to be true
37
- end
38
-
39
- it 'should be able to wait into waiting if polite' do
40
- auth.left_suspend!
41
- expect(auth.may_left_wait?(:waiting, :please)).to be true
42
- auth.left_wait!(:please)
43
-
44
- auth.right_suspend!
45
- expect(auth.may_right_wait?(:waiting)).to be false
46
- auth.right_wait!(:please)
47
- end
48
-
49
- it 'should not be able to be unsuspended into active if not polite' do
50
- auth.left_suspend!
51
- expect(auth.may_left_wait?(:waiting)).not_to be true
52
- expect(auth.may_left_wait?(:waiting, :rude)).not_to be true
53
- expect {auth.left_wait!(:rude)}.to raise_error(AASM::InvalidTransition)
54
- expect {auth.left_wait!}.to raise_error(AASM::InvalidTransition)
55
- end
56
-
57
- it 'should not be able to be unpassified' do
58
- auth.left_activate!
59
- auth.left_suspend!
60
- auth.left_unsuspend!
61
-
62
- expect(auth.may_left_unpassify?).not_to be true
63
- expect {auth.left_unpassify!}.to raise_error(AASM::InvalidTransition)
64
- end
65
-
66
- it 'should be active if previously activated' do
67
- auth.left_activate!
68
- auth.left_suspend!
69
- auth.left_unsuspend!
70
-
71
- expect(auth.aasm(:left).current_state).to eq(:active)
72
- end
73
-
74
- it 'should be pending if not previously activated, but an activation code is present' do
75
- auth.left_suspend!
76
- auth.left_unsuspend!
77
-
78
- expect(auth.aasm(:left).current_state).to eq(:pending)
79
- end
80
-
81
- it 'should be passive if not previously activated and there is no activation code' do
82
- auth.activation_code = nil
83
- auth.left_suspend!
84
- auth.left_unsuspend!
85
-
86
- expect(auth.aasm(:left).current_state).to eq(:passive)
87
- end
88
-
89
- it "should be able to fire known events" do
90
- expect(auth.aasm(:left).may_fire_event?(:left_activate)).to be true
91
- expect(auth.aasm(:right).may_fire_event?(:right_activate)).to be true
92
- end
93
-
94
- it 'should not be able to fire unknown events' do
95
- expect(auth.aasm(:left).may_fire_event?(:unknown)).to be false
96
- expect(auth.aasm(:right).may_fire_event?(:unknown)).to be false
97
- end
98
-
99
- it 'should be able to fire event by name' do
100
- expect(auth.aasm(:left).fire(:left_activate)).to be true
101
- expect(auth.aasm(:left).current_state).to eq(:active)
102
-
103
- expect(auth.aasm(:right).fire(:right_activate)).to be true
104
- expect(auth.aasm(:right).current_state).to eq(:active)
105
- end
106
-
107
- it 'should be able to fire! event by name' do
108
- expect(auth.aasm(:left).fire!(:left_activate)).to be true
109
- expect(auth.aasm(:left).current_state).to eq(:active)
110
-
111
- expect(auth.aasm(:right).fire!(:right_activate)).to be true
112
- expect(auth.aasm(:right).current_state).to eq(:active)
113
- end
114
-
115
- end