aasm 4.12.3 → 5.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (218) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +284 -119
  3. data/lib/aasm/aasm.rb +30 -27
  4. data/lib/aasm/base.rb +61 -11
  5. data/lib/aasm/configuration.rb +3 -0
  6. data/lib/aasm/core/event.rb +26 -30
  7. data/lib/aasm/core/invoker.rb +129 -0
  8. data/lib/aasm/core/invokers/base_invoker.rb +75 -0
  9. data/lib/aasm/core/invokers/class_invoker.rb +52 -0
  10. data/lib/aasm/core/invokers/literal_invoker.rb +49 -0
  11. data/lib/aasm/core/invokers/proc_invoker.rb +59 -0
  12. data/lib/aasm/core/state.rb +16 -14
  13. data/lib/aasm/core/transition.rb +8 -69
  14. data/lib/aasm/dsl_helper.rb +24 -22
  15. data/lib/aasm/errors.rb +5 -3
  16. data/lib/aasm/instance_base.rb +28 -5
  17. data/lib/aasm/localizer.rb +13 -3
  18. data/lib/aasm/persistence/active_record_persistence.rb +25 -5
  19. data/lib/aasm/persistence/base.rb +14 -3
  20. data/lib/aasm/persistence/core_data_query_persistence.rb +2 -1
  21. data/lib/aasm/persistence/dynamoid_persistence.rb +1 -1
  22. data/lib/aasm/persistence/mongoid_persistence.rb +1 -1
  23. data/lib/aasm/persistence/no_brainer_persistence.rb +105 -0
  24. data/lib/aasm/persistence/orm.rb +23 -19
  25. data/lib/aasm/persistence/plain_persistence.rb +2 -1
  26. data/lib/aasm/persistence/redis_persistence.rb +1 -1
  27. data/lib/aasm/persistence/sequel_persistence.rb +0 -1
  28. data/lib/aasm/persistence.rb +3 -0
  29. data/lib/aasm/rspec/allow_event.rb +5 -1
  30. data/lib/aasm/rspec/allow_transition_to.rb +5 -1
  31. data/lib/aasm/rspec/transition_from.rb +5 -1
  32. data/lib/aasm/version.rb +1 -1
  33. data/lib/aasm.rb +5 -2
  34. data/lib/generators/aasm/orm_helpers.rb +7 -1
  35. data/lib/generators/active_record/aasm_generator.rb +3 -1
  36. data/lib/generators/active_record/templates/migration.rb +1 -1
  37. data/lib/generators/nobrainer/aasm_generator.rb +28 -0
  38. data/lib/motion-aasm.rb +1 -0
  39. metadata +42 -344
  40. data/.document +0 -6
  41. data/.gitignore +0 -20
  42. data/.travis.yml +0 -52
  43. data/API +0 -34
  44. data/Appraisals +0 -43
  45. data/CHANGELOG.md +0 -370
  46. data/CODE_OF_CONDUCT.md +0 -13
  47. data/CONTRIBUTING.md +0 -24
  48. data/Gemfile +0 -7
  49. data/Gemfile.lock_old +0 -151
  50. data/HOWTO +0 -12
  51. data/PLANNED_CHANGES.md +0 -11
  52. data/README_FROM_VERSION_3_TO_4.md +0 -240
  53. data/Rakefile +0 -31
  54. data/TESTING.md +0 -25
  55. data/aasm.gemspec +0 -35
  56. data/callbacks.txt +0 -51
  57. data/gemfiles/rails_3.2.gemfile +0 -13
  58. data/gemfiles/rails_4.0.gemfile +0 -15
  59. data/gemfiles/rails_4.2.gemfile +0 -16
  60. data/gemfiles/rails_4.2_mongoid_5.gemfile +0 -11
  61. data/gemfiles/rails_5.0.gemfile +0 -14
  62. data/spec/database.rb +0 -44
  63. data/spec/database.yml +0 -3
  64. data/spec/en.yml +0 -12
  65. data/spec/en_deprecated_style.yml +0 -10
  66. data/spec/generators/active_record_generator_spec.rb +0 -47
  67. data/spec/generators/mongoid_generator_spec.rb +0 -31
  68. data/spec/models/active_record/basic_active_record_two_state_machines_example.rb +0 -25
  69. data/spec/models/active_record/complex_active_record_example.rb +0 -37
  70. data/spec/models/active_record/derivate_new_dsl.rb +0 -7
  71. data/spec/models/active_record/false_state.rb +0 -35
  72. data/spec/models/active_record/gate.rb +0 -39
  73. data/spec/models/active_record/invalid_persistor.rb +0 -29
  74. data/spec/models/active_record/localizer_test_model.rb +0 -34
  75. data/spec/models/active_record/no_direct_assignment.rb +0 -21
  76. data/spec/models/active_record/no_scope.rb +0 -21
  77. data/spec/models/active_record/persisted_state.rb +0 -12
  78. data/spec/models/active_record/provided_and_persisted_state.rb +0 -24
  79. data/spec/models/active_record/reader.rb +0 -7
  80. data/spec/models/active_record/readme_job.rb +0 -21
  81. data/spec/models/active_record/silent_persistor.rb +0 -29
  82. data/spec/models/active_record/simple_new_dsl.rb +0 -17
  83. data/spec/models/active_record/thief.rb +0 -29
  84. data/spec/models/active_record/transactor.rb +0 -124
  85. data/spec/models/active_record/transient.rb +0 -6
  86. data/spec/models/active_record/validator.rb +0 -118
  87. data/spec/models/active_record/with_enum.rb +0 -39
  88. data/spec/models/active_record/with_enum_without_column.rb +0 -38
  89. data/spec/models/active_record/with_false_enum.rb +0 -31
  90. data/spec/models/active_record/with_true_enum.rb +0 -39
  91. data/spec/models/active_record/worker.rb +0 -2
  92. data/spec/models/active_record/writer.rb +0 -6
  93. data/spec/models/basic_two_state_machines_example.rb +0 -25
  94. data/spec/models/callbacks/basic.rb +0 -98
  95. data/spec/models/callbacks/basic_multiple.rb +0 -75
  96. data/spec/models/callbacks/guard_within_block.rb +0 -67
  97. data/spec/models/callbacks/guard_within_block_multiple.rb +0 -66
  98. data/spec/models/callbacks/multiple_transitions_transition_guard.rb +0 -66
  99. data/spec/models/callbacks/multiple_transitions_transition_guard_multiple.rb +0 -65
  100. data/spec/models/callbacks/private_method.rb +0 -44
  101. data/spec/models/callbacks/private_method_multiple.rb +0 -44
  102. data/spec/models/callbacks/with_args.rb +0 -62
  103. data/spec/models/callbacks/with_args_multiple.rb +0 -61
  104. data/spec/models/callbacks/with_state_arg.rb +0 -30
  105. data/spec/models/callbacks/with_state_arg_multiple.rb +0 -26
  106. data/spec/models/complex_example.rb +0 -222
  107. data/spec/models/conversation.rb +0 -93
  108. data/spec/models/default_state.rb +0 -12
  109. data/spec/models/double_definer.rb +0 -21
  110. data/spec/models/dynamoid/complex_dynamoid_example.rb +0 -37
  111. data/spec/models/dynamoid/dynamoid_multiple.rb +0 -18
  112. data/spec/models/dynamoid/dynamoid_simple.rb +0 -18
  113. data/spec/models/foo.rb +0 -106
  114. data/spec/models/foo_callback_multiple.rb +0 -45
  115. data/spec/models/guard_arguments_check.rb +0 -17
  116. data/spec/models/guard_with_params.rb +0 -24
  117. data/spec/models/guard_with_params_multiple.rb +0 -18
  118. data/spec/models/guardian.rb +0 -58
  119. data/spec/models/guardian_multiple.rb +0 -48
  120. data/spec/models/guardian_without_from_specified.rb +0 -18
  121. data/spec/models/initial_state_proc.rb +0 -31
  122. data/spec/models/mongoid/complex_mongoid_example.rb +0 -37
  123. data/spec/models/mongoid/invalid_persistor_mongoid.rb +0 -39
  124. data/spec/models/mongoid/mongoid_relationships.rb +0 -26
  125. data/spec/models/mongoid/no_scope_mongoid.rb +0 -21
  126. data/spec/models/mongoid/silent_persistor_mongoid.rb +0 -39
  127. data/spec/models/mongoid/simple_mongoid.rb +0 -23
  128. data/spec/models/mongoid/simple_new_dsl_mongoid.rb +0 -25
  129. data/spec/models/mongoid/validator_mongoid.rb +0 -100
  130. data/spec/models/multi_transitioner.rb +0 -34
  131. data/spec/models/multiple_transitions_that_differ_only_by_guard.rb +0 -31
  132. data/spec/models/namespaced_multiple_example.rb +0 -42
  133. data/spec/models/no_initial_state.rb +0 -25
  134. data/spec/models/not_auto_loaded/process.rb +0 -21
  135. data/spec/models/parametrised_event.rb +0 -42
  136. data/spec/models/parametrised_event_multiple.rb +0 -29
  137. data/spec/models/process_with_new_dsl.rb +0 -31
  138. data/spec/models/provided_state.rb +0 -24
  139. data/spec/models/redis/complex_redis_example.rb +0 -40
  140. data/spec/models/redis/redis_multiple.rb +0 -20
  141. data/spec/models/redis/redis_simple.rb +0 -20
  142. data/spec/models/sequel/complex_sequel_example.rb +0 -46
  143. data/spec/models/sequel/invalid_persistor.rb +0 -52
  144. data/spec/models/sequel/sequel_multiple.rb +0 -25
  145. data/spec/models/sequel/sequel_simple.rb +0 -26
  146. data/spec/models/sequel/silent_persistor.rb +0 -50
  147. data/spec/models/sequel/transactor.rb +0 -112
  148. data/spec/models/sequel/validator.rb +0 -93
  149. data/spec/models/sequel/worker.rb +0 -12
  150. data/spec/models/silencer.rb +0 -27
  151. data/spec/models/simple_custom_example.rb +0 -53
  152. data/spec/models/simple_example.rb +0 -15
  153. data/spec/models/simple_multiple_example.rb +0 -42
  154. data/spec/models/state_machine_with_failed_event.rb +0 -20
  155. data/spec/models/states_on_one_line_example.rb +0 -8
  156. data/spec/models/sub_class.rb +0 -41
  157. data/spec/models/sub_class_with_more_states.rb +0 -18
  158. data/spec/models/sub_classing.rb +0 -3
  159. data/spec/models/super_class.rb +0 -46
  160. data/spec/models/this_name_better_not_be_in_use.rb +0 -11
  161. data/spec/models/valid_state_name.rb +0 -23
  162. data/spec/spec_helper.rb +0 -26
  163. data/spec/spec_helpers/active_record.rb +0 -7
  164. data/spec/spec_helpers/dynamoid.rb +0 -33
  165. data/spec/spec_helpers/mongoid.rb +0 -7
  166. data/spec/spec_helpers/redis.rb +0 -15
  167. data/spec/spec_helpers/remove_warnings.rb +0 -1
  168. data/spec/spec_helpers/sequel.rb +0 -7
  169. data/spec/unit/api_spec.rb +0 -100
  170. data/spec/unit/basic_two_state_machines_example_spec.rb +0 -10
  171. data/spec/unit/callback_multiple_spec.rb +0 -300
  172. data/spec/unit/callbacks_spec.rb +0 -491
  173. data/spec/unit/complex_example_spec.rb +0 -94
  174. data/spec/unit/complex_multiple_example_spec.rb +0 -115
  175. data/spec/unit/edge_cases_spec.rb +0 -16
  176. data/spec/unit/event_multiple_spec.rb +0 -73
  177. data/spec/unit/event_naming_spec.rb +0 -16
  178. data/spec/unit/event_spec.rb +0 -381
  179. data/spec/unit/exception_spec.rb +0 -11
  180. data/spec/unit/guard_arguments_check_spec.rb +0 -9
  181. data/spec/unit/guard_multiple_spec.rb +0 -60
  182. data/spec/unit/guard_spec.rb +0 -89
  183. data/spec/unit/guard_with_params_multiple_spec.rb +0 -10
  184. data/spec/unit/guard_with_params_spec.rb +0 -14
  185. data/spec/unit/guard_without_from_specified_spec.rb +0 -10
  186. data/spec/unit/initial_state_multiple_spec.rb +0 -15
  187. data/spec/unit/initial_state_spec.rb +0 -12
  188. data/spec/unit/inspection_multiple_spec.rb +0 -201
  189. data/spec/unit/inspection_spec.rb +0 -149
  190. data/spec/unit/localizer_spec.rb +0 -78
  191. data/spec/unit/memory_leak_spec.rb +0 -38
  192. data/spec/unit/multiple_transitions_that_differ_only_by_guard_spec.rb +0 -14
  193. data/spec/unit/namespaced_multiple_example_spec.rb +0 -75
  194. data/spec/unit/new_dsl_spec.rb +0 -12
  195. data/spec/unit/override_warning_spec.rb +0 -94
  196. data/spec/unit/persistence/active_record_persistence_multiple_spec.rb +0 -618
  197. data/spec/unit/persistence/active_record_persistence_spec.rb +0 -735
  198. data/spec/unit/persistence/dynamoid_persistence_multiple_spec.rb +0 -135
  199. data/spec/unit/persistence/dynamoid_persistence_spec.rb +0 -84
  200. data/spec/unit/persistence/mongoid_persistence_multiple_spec.rb +0 -204
  201. data/spec/unit/persistence/mongoid_persistence_spec.rb +0 -169
  202. data/spec/unit/persistence/redis_persistence_multiple_spec.rb +0 -88
  203. data/spec/unit/persistence/redis_persistence_spec.rb +0 -53
  204. data/spec/unit/persistence/sequel_persistence_multiple_spec.rb +0 -148
  205. data/spec/unit/persistence/sequel_persistence_spec.rb +0 -368
  206. data/spec/unit/readme_spec.rb +0 -41
  207. data/spec/unit/reloading_spec.rb +0 -15
  208. data/spec/unit/rspec_matcher_spec.rb +0 -79
  209. data/spec/unit/simple_custom_example_spec.rb +0 -39
  210. data/spec/unit/simple_example_spec.rb +0 -42
  211. data/spec/unit/simple_multiple_example_spec.rb +0 -91
  212. data/spec/unit/state_spec.rb +0 -89
  213. data/spec/unit/states_on_one_line_example_spec.rb +0 -16
  214. data/spec/unit/subclassing_multiple_spec.rb +0 -74
  215. data/spec/unit/subclassing_spec.rb +0 -46
  216. data/spec/unit/transition_spec.rb +0 -436
  217. data/test/minitest_helper.rb +0 -57
  218. data/test/unit/minitest_matcher_test.rb +0 -80
@@ -1,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