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,16 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "edge cases" do
4
- describe "for classes with multiple state machines" do
5
- it "allows accessing a multiple state machine class without state machine name" do
6
- # it's like starting to define a new state machine within the
7
- # requested class
8
- expect(SimpleMultipleExample.aasm.states.map(&:name)).to be_empty
9
- end
10
-
11
- it "do not know yet" do
12
- example = ComplexExampleMultiple.new
13
- expect { example.aasm.states.inspect }.to raise_error(AASM::UnknownStateMachineError)
14
- end
15
- end
16
- end
@@ -1,73 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'current event' do
4
- let(:pe) {ParametrisedEventMultiple.new}
5
-
6
- it 'if no event has been triggered' do
7
- expect(pe.aasm(:left).current_event).to be_nil
8
- end
9
-
10
- it 'if a event has been triggered' do
11
- pe.wakeup
12
- expect(pe.aasm(:left).current_event).to eql :wakeup
13
- end
14
-
15
- it 'if no event has been triggered' do
16
- pe.wakeup!
17
- expect(pe.aasm(:left).current_event).to eql :wakeup!
18
- end
19
- end
20
-
21
- describe 'parametrised events' do
22
- let(:pe) {ParametrisedEventMultiple.new}
23
-
24
- it 'should transition to specified next state (sleeping to showering)' do
25
- pe.wakeup!(:showering)
26
- expect(pe.aasm(:left).current_state).to eq(:showering)
27
- end
28
-
29
- it 'should transition to specified next state (sleeping to working)' do
30
- pe.wakeup!(:working)
31
- expect(pe.aasm(:left).current_state).to eq(:working)
32
- end
33
-
34
- it 'should transition to default (first or showering) state' do
35
- pe.wakeup!
36
- expect(pe.aasm(:left).current_state).to eq(:showering)
37
- end
38
-
39
- it 'should transition to default state when :after transition invoked' do
40
- pe.dress!('purple', 'dressy')
41
- expect(pe.aasm(:left).current_state).to eq(:working)
42
- end
43
-
44
- it 'should call :after transition method with args' do
45
- pe.wakeup!(:showering)
46
- expect(pe).to receive(:wear_clothes).with('blue', 'jeans')
47
- pe.dress!(:working, 'blue', 'jeans')
48
- end
49
-
50
- it 'should call :after transition proc' do
51
- pe.wakeup!(:showering)
52
- expect(pe).to receive(:wear_clothes).with('purple', 'slacks')
53
- pe.dress!(:dating, 'purple', 'slacks')
54
- end
55
-
56
- it 'should call :after transition with an array of methods' do
57
- pe.wakeup!(:showering)
58
- expect(pe).to receive(:condition_hair)
59
- expect(pe).to receive(:fix_hair)
60
- pe.dress!(:prettying_up)
61
- end
62
- end
63
-
64
- describe 'event firing without persistence' do
65
- it 'should attempt to persist if aasm_write_state is defined' do
66
- foo = Foo.new
67
- def foo.aasm_write_state; end
68
- expect(foo).to be_open
69
-
70
- expect(foo).to receive(:aasm_write_state_without_persistence)
71
- foo.close
72
- end
73
- end
@@ -1,16 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "event naming" do
4
- let(:state_machine) { StateMachineWithFailedEvent.new }
5
-
6
- it "allows an event of failed without blowing the stack aka stack level too deep" do
7
- state_machine.failed
8
- expect { state_machine.failed }.to raise_error(AASM::InvalidTransition)
9
- end
10
-
11
- it "allows send as event name" do
12
- expect(state_machine.aasm.current_state).to eq :init
13
- state_machine.send
14
- expect(state_machine.aasm.current_state).to eq :sent
15
- end
16
- end
@@ -1,381 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'adding an event' do
4
- let(:state_machine) { AASM::StateMachine.new(:name) }
5
- let(:event) do
6
- AASM::Core::Event.new(:close_order, state_machine, {:success => :success_callback}) do
7
- before :before_callback
8
- after :after_callback
9
- transitions :to => :closed, :from => [:open, :received], success: [:transition_success_callback]
10
- end
11
- end
12
-
13
- it 'should set the name' do
14
- expect(event.name).to eq(:close_order)
15
- end
16
-
17
- it 'should set the success callback' do
18
- expect(event.options[:success]).to eq(:success_callback)
19
- end
20
-
21
- it 'should set the after callback' do
22
- expect(event.options[:after]).to eq([:after_callback])
23
- end
24
-
25
- it 'should set the before callback' do
26
- expect(event.options[:before]).to eq([:before_callback])
27
- end
28
-
29
- it 'should create transitions' do
30
- transitions = event.transitions
31
- expect(transitions[0].from).to eq(:open)
32
- expect(transitions[0].to).to eq(:closed)
33
- expect(transitions[1].from).to eq(:received)
34
- expect(transitions[1].to).to eq(:closed)
35
- end
36
- end
37
-
38
- describe 'transition inspection' do
39
- let(:state_machine) { AASM::StateMachine.new(:name) }
40
- let(:event) do
41
- AASM::Core::Event.new(:run, state_machine) do
42
- transitions :to => :running, :from => :sleeping
43
- end
44
- end
45
-
46
- it 'should support inspecting transitions from other states' do
47
- expect(event.transitions_from_state(:sleeping).map(&:to)).to eq([:running])
48
- expect(event.transitions_from_state?(:sleeping)).to be_truthy
49
-
50
- expect(event.transitions_from_state(:cleaning).map(&:to)).to eq([])
51
- expect(event.transitions_from_state?(:cleaning)).to be_falsey
52
- end
53
-
54
- it 'should support inspecting transitions to other states' do
55
- expect(event.transitions_to_state(:running).map(&:from)).to eq([:sleeping])
56
- expect(event.transitions_to_state?(:running)).to be_truthy
57
-
58
- expect(event.transitions_to_state(:cleaning).map(&:to)).to eq([])
59
- expect(event.transitions_to_state?(:cleaning)).to be_falsey
60
- end
61
- end
62
-
63
- describe 'transition inspection without from' do
64
- let(:state_machine) { AASM::StateMachine.new(:name) }
65
- let(:event) do
66
- AASM::Core::Event.new(:run, state_machine) do
67
- transitions :to => :running
68
- end
69
- end
70
-
71
- it 'should support inspecting transitions from other states' do
72
- expect(event.transitions_from_state(:sleeping).map(&:to)).to eq([:running])
73
- expect(event.transitions_from_state?(:sleeping)).to be_truthy
74
-
75
- expect(event.transitions_from_state(:cleaning).map(&:to)).to eq([:running])
76
- expect(event.transitions_from_state?(:cleaning)).to be_truthy
77
- end
78
-
79
- end
80
-
81
- describe 'firing an event' do
82
- let(:state_machine) { AASM::StateMachine.new(:name) }
83
-
84
- it 'should return nil if the transitions are empty' do
85
- obj = double('object', :aasm => double('aasm', :current_state => 'open'))
86
-
87
- event = AASM::Core::Event.new(:event, state_machine)
88
- expect(event.fire(obj)).to be_nil
89
- end
90
-
91
- it 'should return the state of the first matching transition it finds' do
92
- event = AASM::Core::Event.new(:event, state_machine) do
93
- transitions :to => :closed, :from => [:open, :received]
94
- end
95
-
96
- obj = double('object', :aasm => double('aasm', :current_state => :open))
97
-
98
- expect(event.fire(obj)).to eq(:closed)
99
- end
100
-
101
- it 'should call the guard with the params passed in' do
102
- event = AASM::Core::Event.new(:event, state_machine) do
103
- transitions :to => :closed, :from => [:open, :received], :guard => :guard_fn
104
- end
105
-
106
- obj = double('object', :aasm => double('aasm', :current_state => :open))
107
- expect(obj).to receive(:guard_fn).with('arg1', 'arg2').and_return(true)
108
-
109
- expect(event.fire(obj, {}, 'arg1', 'arg2')).to eq(:closed)
110
- end
111
-
112
- context 'when given a gaurd proc' do
113
- it 'should have access to callback failures in the transitions' do
114
- event = AASM::Core::Event.new(:graduate, state_machine) do
115
- transitions :to => :alumni, :from => [:student, :applicant],
116
- :guard => Proc.new { 1 + 1 == 3 }
117
- end
118
- line_number = __LINE__ - 2
119
- obj = double('object', :aasm => double('aasm', :current_state => :student))
120
-
121
- event.fire(obj, {})
122
- expect(event.failed_callbacks).to eq ["#{__FILE__}##{line_number}"]
123
- end
124
- end
125
-
126
- context 'when given a guard symbol' do
127
- it 'should have access to callback failures in the transitions' do
128
- event = AASM::Core::Event.new(:graduate, state_machine) do
129
- transitions :to => :alumni, :from => [:student, :applicant],
130
- guard: :paid_tuition?
131
- end
132
-
133
- obj = double('object', :aasm => double('aasm', :current_state => :student))
134
- allow(obj).to receive(:paid_tuition?).and_return(false)
135
-
136
- event.fire(obj, {})
137
- expect(event.failed_callbacks).to eq [:paid_tuition?]
138
- end
139
- end
140
-
141
- end
142
-
143
- describe 'should fire callbacks' do
144
- describe 'success' do
145
- it "if it's a symbol" do
146
- ThisNameBetterNotBeInUse.instance_eval {
147
- aasm do
148
- event :with_symbol, :success => :symbol_success_callback do
149
- transitions :to => :symbol, :from => [:initial]
150
- end
151
- end
152
- }
153
-
154
- model = ThisNameBetterNotBeInUse.new
155
- expect(model).to receive(:symbol_success_callback)
156
- model.with_symbol!
157
- end
158
-
159
- it "if it's a string" do
160
- ThisNameBetterNotBeInUse.instance_eval {
161
- aasm do
162
- event :with_string, :success => 'string_success_callback' do
163
- transitions :to => :string, :from => [:initial]
164
- end
165
- end
166
- }
167
-
168
- model = ThisNameBetterNotBeInUse.new
169
- expect(model).to receive(:string_success_callback)
170
- model.with_string!
171
- end
172
-
173
- it "if passed an array of strings and/or symbols" do
174
- ThisNameBetterNotBeInUse.instance_eval {
175
- aasm do
176
- event :with_array, :success => [:success_callback1, 'success_callback2'] do
177
- transitions :to => :array, :from => [:initial]
178
- end
179
- end
180
- }
181
-
182
- model = ThisNameBetterNotBeInUse.new
183
- expect(model).to receive(:success_callback1)
184
- expect(model).to receive(:success_callback2)
185
- model.with_array!
186
- end
187
-
188
- it "if passed an array of strings and/or symbols and/or procs" do
189
- ThisNameBetterNotBeInUse.instance_eval {
190
- aasm do
191
- event :with_array_including_procs, :success => [:success_callback1, 'success_callback2', lambda { proc_success_callback }] do
192
- transitions :to => :array, :from => [:initial]
193
- end
194
- end
195
- }
196
-
197
- model = ThisNameBetterNotBeInUse.new
198
- expect(model).to receive(:success_callback1)
199
- expect(model).to receive(:success_callback2)
200
- expect(model).to receive(:proc_success_callback)
201
- model.with_array_including_procs!
202
- end
203
-
204
- it "if it's a proc" do
205
- ThisNameBetterNotBeInUse.instance_eval {
206
- aasm do
207
- event :with_proc, :success => lambda { proc_success_callback } do
208
- transitions :to => :proc, :from => [:initial]
209
- end
210
- end
211
- }
212
-
213
- model = ThisNameBetterNotBeInUse.new
214
- expect(model).to receive(:proc_success_callback)
215
- model.with_proc!
216
- end
217
- end
218
-
219
- describe 'after' do
220
- it "if they set different ways" do
221
- ThisNameBetterNotBeInUse.instance_eval do
222
- aasm do
223
- event :with_afters, :after => :do_one_thing_after do
224
- after do
225
- do_another_thing_after_too
226
- end
227
- after do
228
- do_third_thing_at_last
229
- end
230
- transitions :to => :proc, :from => [:initial]
231
- end
232
- end
233
- end
234
-
235
- model = ThisNameBetterNotBeInUse.new
236
- expect(model).to receive(:do_one_thing_after).once.ordered
237
- expect(model).to receive(:do_another_thing_after_too).once.ordered
238
- expect(model).to receive(:do_third_thing_at_last).once.ordered
239
- model.with_afters!
240
- end
241
- end
242
-
243
- describe 'before' do
244
- it "if it's a proc" do
245
- ThisNameBetterNotBeInUse.instance_eval do
246
- aasm do
247
- event :before_as_proc do
248
- before do
249
- do_something_before
250
- end
251
- transitions :to => :proc, :from => [:initial]
252
- end
253
- end
254
- end
255
-
256
- model = ThisNameBetterNotBeInUse.new
257
- expect(model).to receive(:do_something_before).once
258
- model.before_as_proc!
259
- end
260
- end
261
-
262
- it 'in right order' do
263
- ThisNameBetterNotBeInUse.instance_eval do
264
- aasm do
265
- event :in_right_order, :after => :do_something_after do
266
- before do
267
- do_something_before
268
- end
269
- transitions :to => :proc, :from => [:initial]
270
- end
271
- end
272
- end
273
-
274
- model = ThisNameBetterNotBeInUse.new
275
- expect(model).to receive(:do_something_before).once.ordered
276
- expect(model).to receive(:do_something_after).once.ordered
277
- model.in_right_order!
278
- end
279
- end
280
-
281
- describe 'current event' do
282
- let(:pe) {ParametrisedEvent.new}
283
-
284
- it 'if no event has been triggered' do
285
- expect(pe.aasm.current_event).to be_nil
286
- end
287
-
288
- it 'if a event has been triggered' do
289
- pe.wakeup
290
- expect(pe.aasm.current_event).to eql :wakeup
291
- end
292
-
293
- it 'if no event has been triggered' do
294
- pe.wakeup!
295
- expect(pe.aasm.current_event).to eql :wakeup!
296
- end
297
- end
298
-
299
- describe 'parametrised events' do
300
- let(:pe) {ParametrisedEvent.new}
301
-
302
- it 'should transition to specified next state (sleeping to showering)' do
303
- pe.wakeup!(:showering)
304
- expect(pe.aasm.current_state).to eq(:showering)
305
- end
306
-
307
- it 'should transition to specified next state (sleeping to working)' do
308
- pe.wakeup!(:working)
309
- expect(pe.aasm.current_state).to eq(:working)
310
- end
311
-
312
- it 'should transition to default (first or showering) state' do
313
- pe.wakeup!
314
- expect(pe.aasm.current_state).to eq(:showering)
315
- end
316
-
317
- it 'should transition to default state when :after transition invoked' do
318
- pe.dress!('purple', 'dressy')
319
- expect(pe.aasm.current_state).to eq(:working)
320
- end
321
-
322
- it 'should call :after transition method with args' do
323
- pe.wakeup!(:showering)
324
- expect(pe).to receive(:wear_clothes).with('blue', 'jeans')
325
- pe.dress!(:working, 'blue', 'jeans')
326
- end
327
-
328
- it 'should call :after transition method if arg is nil' do
329
- dryer = nil
330
- expect(pe).to receive(:wet_hair).with(dryer)
331
- pe.shower!(dryer)
332
- end
333
-
334
- it 'should call :after transition proc' do
335
- pe.wakeup!(:showering)
336
- expect(pe).to receive(:wear_clothes).with('purple', 'slacks')
337
- pe.dress!(:dating, 'purple', 'slacks')
338
- end
339
-
340
- it 'should call :after transition with an array of methods' do
341
- pe.wakeup!(:showering)
342
- expect(pe).to receive(:condition_hair)
343
- expect(pe).to receive(:fix_hair)
344
- pe.dress!(:prettying_up)
345
- end
346
-
347
- it 'should call :success transition method with args' do
348
- pe.wakeup!(:showering)
349
- expect(pe).to receive(:wear_makeup).with('foundation', 'SPF')
350
- pe.dress!(:working, 'foundation', 'SPF')
351
- end
352
-
353
- it 'should call :success transition method if arg is nil' do
354
- shirt_color = nil
355
- expect(pe).to receive(:wear_clothes).with(shirt_color)
356
- pe.shower!(shirt_color)
357
- end
358
-
359
- it 'should call :success transition proc' do
360
- pe.wakeup!(:showering)
361
- expect(pe).to receive(:wear_makeup).with('purple', 'slacks')
362
- pe.dress!(:dating, 'purple', 'slacks')
363
- end
364
-
365
- it 'should call :success transition with an array of methods' do
366
- pe.wakeup!(:showering)
367
- expect(pe).to receive(:touch_up_hair)
368
- pe.dress!(:prettying_up)
369
- end
370
- end
371
-
372
- describe 'event firing without persistence' do
373
- it 'should attempt to persist if aasm_write_state is defined' do
374
- foo = Foo.new
375
- def foo.aasm_write_state; end
376
- expect(foo).to be_open
377
-
378
- expect(foo).to receive(:aasm_write_state_without_persistence)
379
- foo.close
380
- end
381
- end
@@ -1,11 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe AASM::InvalidTransition do
4
- it 'should not be lazy detecting originating state' do
5
- process = ProcessWithNewDsl.new
6
- expect { process.stop! }.to raise_error do |err|
7
- process.start
8
- expect(err.message).to eql("Event 'stop' cannot transition from 'sleeping'.")
9
- end
10
- end
11
- end
@@ -1,9 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "nil as first argument" do
4
- let(:guard) { GuardArgumentsCheck.new }
5
-
6
- it 'does not raise errors' do
7
- expect { guard.mark_as_reviewed(nil, 'second arg') }.not_to raise_error
8
- end
9
- end
@@ -1,60 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "per-transition guards" do
4
- let(:guardian) { GuardianMultiple.new }
5
-
6
- it "allows the transition if the guard succeeds" do
7
- expect { guardian.use_one_guard_that_succeeds! }.to_not raise_error
8
- expect(guardian).to be_beta
9
- end
10
-
11
- it "stops the transition if the guard fails" do
12
- expect { guardian.use_one_guard_that_fails! }.to raise_error(AASM::InvalidTransition)
13
- expect(guardian).to be_alpha
14
- end
15
-
16
- it "allows the transition if all guards succeeds" do
17
- expect { guardian.use_guards_that_succeed! }.to_not raise_error
18
- expect(guardian).to be_beta
19
- end
20
-
21
- it "stops the transition if the first guard fails" do
22
- expect { guardian.use_guards_where_the_first_fails! }.to raise_error(AASM::InvalidTransition)
23
- expect(guardian).to be_alpha
24
- end
25
-
26
- it "stops the transition if the second guard fails" do
27
- expect { guardian.use_guards_where_the_second_fails! }.to raise_error(AASM::InvalidTransition)
28
- expect(guardian).to be_alpha
29
- end
30
- end
31
-
32
- describe "event guards" do
33
- let(:guardian) { GuardianMultiple.new }
34
-
35
- it "allows the transition if the event guards succeed" do
36
- expect { guardian.use_event_guards_that_succeed! }.to_not raise_error
37
- expect(guardian).to be_beta
38
- end
39
-
40
- it "allows the transition if the event and transition guards succeed" do
41
- expect { guardian.use_event_and_transition_guards_that_succeed! }.to_not raise_error
42
- expect(guardian).to be_beta
43
- end
44
-
45
- it "stops the transition if the first event guard fails" do
46
- expect { guardian.use_event_guards_where_the_first_fails! }.to raise_error(AASM::InvalidTransition)
47
- expect(guardian).to be_alpha
48
- end
49
-
50
- it "stops the transition if the second event guard fails" do
51
- expect { guardian.use_event_guards_where_the_second_fails! }.to raise_error(AASM::InvalidTransition)
52
- expect(guardian).to be_alpha
53
- end
54
-
55
- it "stops the transition if the transition guard fails" do
56
- expect { guardian.use_event_and_transition_guards_where_third_fails! }.to raise_error(AASM::InvalidTransition)
57
- expect(guardian).to be_alpha
58
- end
59
-
60
- end
@@ -1,89 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "per-transition guards" do
4
- let(:guardian) { Guardian.new }
5
-
6
- it "allows the transition if the guard succeeds" do
7
- expect { guardian.use_one_guard_that_succeeds! }.to_not raise_error
8
- expect(guardian).to be_beta
9
- end
10
-
11
- it "stops the transition if the guard fails" do
12
- expect { guardian.use_one_guard_that_fails! }.to raise_error(AASM::InvalidTransition)
13
- expect(guardian).to be_alpha
14
- end
15
-
16
- it "allows the transition if all guards succeeds" do
17
- expect { guardian.use_guards_that_succeed! }.to_not raise_error
18
- expect(guardian).to be_beta
19
- end
20
-
21
- it "stops the transition if the first guard fails" do
22
- expect { guardian.use_guards_where_the_first_fails! }.to raise_error(AASM::InvalidTransition)
23
- expect(guardian).to be_alpha
24
- end
25
-
26
- it "stops the transition if the second guard fails" do
27
- expect { guardian.use_guards_where_the_second_fails! }.to raise_error(AASM::InvalidTransition)
28
- expect(guardian).to be_alpha
29
- end
30
-
31
- describe "with params" do
32
- it "using a Proc" do
33
- expect(guardian).to receive(:inner_guard).with({:flag => true}).and_return(true)
34
- guardian.use_proc_guard_with_params(:flag => true)
35
- end
36
-
37
- it "using a lambda" do
38
- expect(guardian).to receive(:inner_guard).with({:flag => true}).and_return(true)
39
- guardian.use_lambda_guard_with_params(:flag => true)
40
- end
41
- end
42
- end
43
-
44
- describe "event guards" do
45
- let(:guardian) { Guardian.new }
46
-
47
- it "allows the transition if the event guards succeed" do
48
- expect { guardian.use_event_guards_that_succeed! }.to_not raise_error
49
- expect(guardian).to be_beta
50
- end
51
-
52
- it "allows the transition if the event and transition guards succeed" do
53
- expect { guardian.use_event_and_transition_guards_that_succeed! }.to_not raise_error
54
- expect(guardian).to be_beta
55
- end
56
-
57
- it "stops the transition if the first event guard fails" do
58
- expect { guardian.use_event_guards_where_the_first_fails! }.to raise_error(AASM::InvalidTransition)
59
- expect(guardian).to be_alpha
60
- end
61
-
62
- it "stops the transition if the second event guard fails" do
63
- expect { guardian.use_event_guards_where_the_second_fails! }.to raise_error(AASM::InvalidTransition)
64
- expect(guardian).to be_alpha
65
- end
66
-
67
- it "stops the transition if the transition guard fails" do
68
- expect { guardian.use_event_and_transition_guards_where_third_fails! }.to raise_error(AASM::InvalidTransition)
69
- expect(guardian).to be_alpha
70
- end
71
-
72
- end
73
-
74
- if defined?(ActiveRecord)
75
-
76
- Dir[File.dirname(__FILE__) + "/../models/active_record/*.rb"].sort.each do |f|
77
- require File.expand_path(f)
78
- end
79
-
80
- load_schema
81
-
82
- describe "ActiveRecord per-transition guards" do
83
- let(:example) { ComplexActiveRecordExample.new }
84
-
85
- it "should be able to increment" do
86
- expect(example.may_increment?).to be true
87
- end
88
- end
89
- end
@@ -1,10 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "guards with params" do
4
- let(:guard) { GuardWithParamsMultiple.new }
5
- let(:user) {GuardParamsClass.new}
6
-
7
- it "list permitted states" do
8
- expect(guard.aasm(:left).states({:permitted => true}, user).map(&:name)).to eql [:reviewed]
9
- end
10
- end
@@ -1,14 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "guards with params" do
4
- let(:guard) { GuardWithParams.new }
5
- let(:user) {GuardParamsClass.new}
6
-
7
- it "list permitted states" do
8
- expect(guard.aasm.states({:permitted => true}, user).map(&:name)).to eql [:reviewed]
9
- end
10
-
11
- it "list no states if user is blank" do
12
- expect(guard.aasm.states({:permitted => true}, nil).map(&:name)).to eql []
13
- end
14
- end
@@ -1,10 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "transitions without from specified" do
4
- let(:guardian) { GuardianWithoutFromSpecified.new }
5
-
6
- it "allows the transitions if guard succeeds" do
7
- expect { guardian.use_guards_where_the_first_fails! }.to_not raise_error
8
- expect(guardian).to be_gamma
9
- end
10
- end