aasm 4.5.1 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. checksums.yaml +5 -5
  2. data/LICENSE +1 -1
  3. data/README.md +809 -129
  4. data/lib/aasm/aasm.rb +74 -37
  5. data/lib/aasm/base.rb +188 -41
  6. data/lib/aasm/configuration.rb +27 -2
  7. data/lib/aasm/core/event.rb +75 -47
  8. data/lib/aasm/core/invoker.rb +129 -0
  9. data/lib/aasm/core/invokers/base_invoker.rb +75 -0
  10. data/lib/aasm/core/invokers/class_invoker.rb +52 -0
  11. data/lib/aasm/core/invokers/literal_invoker.rb +49 -0
  12. data/lib/aasm/core/invokers/proc_invoker.rb +59 -0
  13. data/lib/aasm/core/state.rb +22 -13
  14. data/lib/aasm/core/transition.rb +30 -23
  15. data/lib/aasm/dsl_helper.rb +24 -22
  16. data/lib/aasm/errors.rb +8 -5
  17. data/lib/aasm/instance_base.rb +63 -15
  18. data/lib/aasm/localizer.rb +13 -3
  19. data/lib/aasm/minitest/allow_event.rb +13 -0
  20. data/lib/aasm/minitest/allow_transition_to.rb +13 -0
  21. data/lib/aasm/minitest/have_state.rb +13 -0
  22. data/lib/aasm/minitest/transition_from.rb +21 -0
  23. data/lib/aasm/minitest.rb +5 -0
  24. data/lib/aasm/minitest_spec.rb +15 -0
  25. data/lib/aasm/persistence/active_record_persistence.rb +87 -79
  26. data/lib/aasm/persistence/base.rb +30 -30
  27. data/lib/aasm/persistence/core_data_query_persistence.rb +94 -0
  28. data/lib/aasm/persistence/dynamoid_persistence.rb +92 -0
  29. data/lib/aasm/persistence/mongoid_persistence.rb +49 -35
  30. data/lib/aasm/persistence/no_brainer_persistence.rb +105 -0
  31. data/lib/aasm/persistence/orm.rb +154 -0
  32. data/lib/aasm/persistence/plain_persistence.rb +2 -1
  33. data/lib/aasm/persistence/redis_persistence.rb +112 -0
  34. data/lib/aasm/persistence/sequel_persistence.rb +37 -67
  35. data/lib/aasm/persistence.rb +20 -5
  36. data/lib/aasm/rspec/allow_event.rb +5 -1
  37. data/lib/aasm/rspec/allow_transition_to.rb +5 -1
  38. data/lib/aasm/rspec/transition_from.rb +8 -4
  39. data/lib/aasm/state_machine.rb +6 -12
  40. data/lib/aasm/state_machine_store.rb +76 -0
  41. data/lib/aasm/version.rb +1 -1
  42. data/lib/aasm.rb +8 -2
  43. data/lib/generators/aasm/aasm_generator.rb +16 -0
  44. data/lib/generators/aasm/orm_helpers.rb +41 -0
  45. data/lib/generators/active_record/aasm_generator.rb +40 -0
  46. data/lib/generators/active_record/templates/migration.rb +8 -0
  47. data/lib/generators/active_record/templates/migration_existing.rb +5 -0
  48. data/lib/generators/mongoid/aasm_generator.rb +28 -0
  49. data/lib/generators/nobrainer/aasm_generator.rb +28 -0
  50. data/lib/motion-aasm.rb +37 -0
  51. metadata +104 -259
  52. data/.document +0 -6
  53. data/.gitignore +0 -19
  54. data/.travis.yml +0 -37
  55. data/API +0 -34
  56. data/CHANGELOG.md +0 -272
  57. data/CODE_OF_CONDUCT.md +0 -13
  58. data/Gemfile +0 -15
  59. data/HOWTO +0 -12
  60. data/PLANNED_CHANGES.md +0 -11
  61. data/README_FROM_VERSION_3_TO_4.md +0 -240
  62. data/Rakefile +0 -26
  63. data/aasm.gemspec +0 -31
  64. data/callbacks.txt +0 -51
  65. data/gemfiles/rails_3.2.gemfile +0 -14
  66. data/gemfiles/rails_4.0.gemfile +0 -12
  67. data/gemfiles/rails_4.0_mongo_mapper.gemfile +0 -14
  68. data/gemfiles/rails_4.1.gemfile +0 -12
  69. data/gemfiles/rails_4.1_mongo_mapper.gemfile +0 -14
  70. data/gemfiles/rails_4.2.gemfile +0 -12
  71. data/gemfiles/rails_4.2_mongo_mapper.gemfile +0 -14
  72. data/gemfiles/rails_4.2_mongoid_5.gemfile +0 -12
  73. data/lib/aasm/persistence/mongo_mapper_persistence.rb +0 -157
  74. data/spec/database.rb +0 -63
  75. data/spec/database.yml +0 -3
  76. data/spec/en.yml +0 -9
  77. data/spec/en_deprecated_style.yml +0 -10
  78. data/spec/models/active_record/basic_active_record_two_state_machines_example.rb +0 -25
  79. data/spec/models/active_record/complex_active_record_example.rb +0 -33
  80. data/spec/models/active_record/derivate_new_dsl.rb +0 -7
  81. data/spec/models/active_record/false_state.rb +0 -35
  82. data/spec/models/active_record/gate.rb +0 -39
  83. data/spec/models/active_record/localizer_test_model.rb +0 -34
  84. data/spec/models/active_record/no_direct_assignment.rb +0 -21
  85. data/spec/models/active_record/no_scope.rb +0 -21
  86. data/spec/models/active_record/persisted_state.rb +0 -12
  87. data/spec/models/active_record/provided_and_persisted_state.rb +0 -24
  88. data/spec/models/active_record/reader.rb +0 -7
  89. data/spec/models/active_record/readme_job.rb +0 -21
  90. data/spec/models/active_record/simple_new_dsl.rb +0 -17
  91. data/spec/models/active_record/thief.rb +0 -29
  92. data/spec/models/active_record/transient.rb +0 -6
  93. data/spec/models/active_record/with_enum.rb +0 -39
  94. data/spec/models/active_record/with_false_enum.rb +0 -31
  95. data/spec/models/active_record/with_true_enum.rb +0 -39
  96. data/spec/models/active_record/writer.rb +0 -6
  97. data/spec/models/basic_two_state_machines_example.rb +0 -25
  98. data/spec/models/callbacks/basic.rb +0 -78
  99. data/spec/models/callbacks/basic_multiple.rb +0 -75
  100. data/spec/models/callbacks/guard_within_block.rb +0 -66
  101. data/spec/models/callbacks/guard_within_block_multiple.rb +0 -66
  102. data/spec/models/callbacks/multiple_transitions_transition_guard.rb +0 -65
  103. data/spec/models/callbacks/multiple_transitions_transition_guard_multiple.rb +0 -65
  104. data/spec/models/callbacks/private_method.rb +0 -44
  105. data/spec/models/callbacks/private_method_multiple.rb +0 -44
  106. data/spec/models/callbacks/with_args.rb +0 -61
  107. data/spec/models/callbacks/with_args_multiple.rb +0 -61
  108. data/spec/models/callbacks/with_state_arg.rb +0 -26
  109. data/spec/models/callbacks/with_state_arg_multiple.rb +0 -26
  110. data/spec/models/complex_example.rb +0 -222
  111. data/spec/models/conversation.rb +0 -93
  112. data/spec/models/default_state.rb +0 -12
  113. data/spec/models/double_definer.rb +0 -21
  114. data/spec/models/foo.rb +0 -92
  115. data/spec/models/foo_callback_multiple.rb +0 -45
  116. data/spec/models/guardian.rb +0 -48
  117. data/spec/models/guardian_multiple.rb +0 -48
  118. data/spec/models/initial_state_proc.rb +0 -31
  119. data/spec/models/invalid_persistor.rb +0 -31
  120. data/spec/models/mongo_mapper/complex_mongo_mapper_example.rb +0 -37
  121. data/spec/models/mongo_mapper/no_scope_mongo_mapper.rb +0 -21
  122. data/spec/models/mongo_mapper/simple_mongo_mapper.rb +0 -23
  123. data/spec/models/mongo_mapper/simple_new_dsl_mongo_mapper.rb +0 -25
  124. data/spec/models/mongoid/complex_mongoid_example.rb +0 -37
  125. data/spec/models/mongoid/no_scope_mongoid.rb +0 -21
  126. data/spec/models/mongoid/simple_mongoid.rb +0 -23
  127. data/spec/models/mongoid/simple_new_dsl_mongoid.rb +0 -25
  128. data/spec/models/no_initial_state.rb +0 -25
  129. data/spec/models/not_auto_loaded/process.rb +0 -21
  130. data/spec/models/parametrised_event.rb +0 -29
  131. data/spec/models/parametrised_event_multiple.rb +0 -29
  132. data/spec/models/process_with_new_dsl.rb +0 -31
  133. data/spec/models/provided_state.rb +0 -24
  134. data/spec/models/sequel/complex_sequel_example.rb +0 -45
  135. data/spec/models/sequel/sequel_multiple.rb +0 -25
  136. data/spec/models/sequel/sequel_simple.rb +0 -25
  137. data/spec/models/silencer.rb +0 -27
  138. data/spec/models/simple_example.rb +0 -15
  139. data/spec/models/simple_multiple_example.rb +0 -30
  140. data/spec/models/state_machine_with_failed_event.rb +0 -12
  141. data/spec/models/sub_class.rb +0 -7
  142. data/spec/models/sub_class_with_more_states.rb +0 -18
  143. data/spec/models/sub_classing.rb +0 -3
  144. data/spec/models/super_class.rb +0 -46
  145. data/spec/models/this_name_better_not_be_in_use.rb +0 -11
  146. data/spec/models/transactor.rb +0 -53
  147. data/spec/models/valid_state_name.rb +0 -23
  148. data/spec/models/validator.rb +0 -79
  149. data/spec/models/worker.rb +0 -2
  150. data/spec/spec_helper.rb +0 -25
  151. data/spec/unit/api_spec.rb +0 -77
  152. data/spec/unit/basic_two_state_machines_example_spec.rb +0 -10
  153. data/spec/unit/callback_multiple_spec.rb +0 -295
  154. data/spec/unit/callbacks_spec.rb +0 -296
  155. data/spec/unit/complex_example_spec.rb +0 -84
  156. data/spec/unit/complex_multiple_example_spec.rb +0 -99
  157. data/spec/unit/edge_cases_spec.rb +0 -16
  158. data/spec/unit/event_multiple_spec.rb +0 -73
  159. data/spec/unit/event_naming_spec.rb +0 -11
  160. data/spec/unit/event_spec.rb +0 -322
  161. data/spec/unit/guard_multiple_spec.rb +0 -60
  162. data/spec/unit/guard_spec.rb +0 -60
  163. data/spec/unit/initial_state_multiple_spec.rb +0 -15
  164. data/spec/unit/initial_state_spec.rb +0 -12
  165. data/spec/unit/inspection_multiple_spec.rb +0 -201
  166. data/spec/unit/inspection_spec.rb +0 -111
  167. data/spec/unit/localizer_spec.rb +0 -76
  168. data/spec/unit/memory_leak_spec.rb +0 -38
  169. data/spec/unit/new_dsl_spec.rb +0 -12
  170. data/spec/unit/persistence/active_record_persistence_multiple_spec.rb +0 -573
  171. data/spec/unit/persistence/active_record_persistence_spec.rb +0 -552
  172. data/spec/unit/persistence/mongo_mapper_persistence_multiple_spec.rb +0 -146
  173. data/spec/unit/persistence/mongo_mapper_persistence_spec.rb +0 -93
  174. data/spec/unit/persistence/mongoid_persistence_multiple_spec.rb +0 -127
  175. data/spec/unit/persistence/mongoid_persistence_spec.rb +0 -79
  176. data/spec/unit/persistence/sequel_persistence_multiple_spec.rb +0 -153
  177. data/spec/unit/persistence/sequel_persistence_spec.rb +0 -100
  178. data/spec/unit/readme_spec.rb +0 -42
  179. data/spec/unit/reloading_spec.rb +0 -15
  180. data/spec/unit/rspec_matcher_spec.rb +0 -79
  181. data/spec/unit/simple_example_spec.rb +0 -42
  182. data/spec/unit/simple_multiple_example_spec.rb +0 -63
  183. data/spec/unit/state_spec.rb +0 -89
  184. data/spec/unit/subclassing_multiple_spec.rb +0 -39
  185. data/spec/unit/subclassing_spec.rb +0 -31
  186. data/spec/unit/transition_spec.rb +0 -291
@@ -1,99 +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!(nil, :please)
43
-
44
- auth.right_suspend!
45
- expect(auth.may_right_wait?(:waiting)).to be false
46
- auth.right_wait!(nil, :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!(nil, :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
- end
@@ -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!(nil, '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,11 +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
-
9
- expect { state_machine.failed }.to raise_error(AASM::InvalidTransition)
10
- end
11
- end
@@ -1,322 +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]
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, {}, nil, 'arg1', 'arg2')).to eq(:closed)
110
- end
111
-
112
- end
113
-
114
- describe 'should fire callbacks' do
115
- describe 'success' do
116
- it "if it's a symbol" do
117
- ThisNameBetterNotBeInUse.instance_eval {
118
- aasm do
119
- event :with_symbol, :success => :symbol_success_callback do
120
- transitions :to => :symbol, :from => [:initial]
121
- end
122
- end
123
- }
124
-
125
- model = ThisNameBetterNotBeInUse.new
126
- expect(model).to receive(:symbol_success_callback)
127
- model.with_symbol!
128
- end
129
-
130
- it "if it's a string" do
131
- ThisNameBetterNotBeInUse.instance_eval {
132
- aasm do
133
- event :with_string, :success => 'string_success_callback' do
134
- transitions :to => :string, :from => [:initial]
135
- end
136
- end
137
- }
138
-
139
- model = ThisNameBetterNotBeInUse.new
140
- expect(model).to receive(:string_success_callback)
141
- model.with_string!
142
- end
143
-
144
- it "if passed an array of strings and/or symbols" do
145
- ThisNameBetterNotBeInUse.instance_eval {
146
- aasm do
147
- event :with_array, :success => [:success_callback1, 'success_callback2'] do
148
- transitions :to => :array, :from => [:initial]
149
- end
150
- end
151
- }
152
-
153
- model = ThisNameBetterNotBeInUse.new
154
- expect(model).to receive(:success_callback1)
155
- expect(model).to receive(:success_callback2)
156
- model.with_array!
157
- end
158
-
159
- it "if passed an array of strings and/or symbols and/or procs" do
160
- ThisNameBetterNotBeInUse.instance_eval {
161
- aasm do
162
- event :with_array_including_procs, :success => [:success_callback1, 'success_callback2', lambda { proc_success_callback }] do
163
- transitions :to => :array, :from => [:initial]
164
- end
165
- end
166
- }
167
-
168
- model = ThisNameBetterNotBeInUse.new
169
- expect(model).to receive(:success_callback1)
170
- expect(model).to receive(:success_callback2)
171
- expect(model).to receive(:proc_success_callback)
172
- model.with_array_including_procs!
173
- end
174
-
175
- it "if it's a proc" do
176
- ThisNameBetterNotBeInUse.instance_eval {
177
- aasm do
178
- event :with_proc, :success => lambda { proc_success_callback } do
179
- transitions :to => :proc, :from => [:initial]
180
- end
181
- end
182
- }
183
-
184
- model = ThisNameBetterNotBeInUse.new
185
- expect(model).to receive(:proc_success_callback)
186
- model.with_proc!
187
- end
188
- end
189
-
190
- describe 'after' do
191
- it "if they set different ways" do
192
- ThisNameBetterNotBeInUse.instance_eval do
193
- aasm do
194
- event :with_afters, :after => :do_one_thing_after do
195
- after do
196
- do_another_thing_after_too
197
- end
198
- after do
199
- do_third_thing_at_last
200
- end
201
- transitions :to => :proc, :from => [:initial]
202
- end
203
- end
204
- end
205
-
206
- model = ThisNameBetterNotBeInUse.new
207
- expect(model).to receive(:do_one_thing_after).once.ordered
208
- expect(model).to receive(:do_another_thing_after_too).once.ordered
209
- expect(model).to receive(:do_third_thing_at_last).once.ordered
210
- model.with_afters!
211
- end
212
- end
213
-
214
- describe 'before' do
215
- it "if it's a proc" do
216
- ThisNameBetterNotBeInUse.instance_eval do
217
- aasm do
218
- event :before_as_proc do
219
- before do
220
- do_something_before
221
- end
222
- transitions :to => :proc, :from => [:initial]
223
- end
224
- end
225
- end
226
-
227
- model = ThisNameBetterNotBeInUse.new
228
- expect(model).to receive(:do_something_before).once
229
- model.before_as_proc!
230
- end
231
- end
232
-
233
- it 'in right order' do
234
- ThisNameBetterNotBeInUse.instance_eval do
235
- aasm do
236
- event :in_right_order, :after => :do_something_after do
237
- before do
238
- do_something_before
239
- end
240
- transitions :to => :proc, :from => [:initial]
241
- end
242
- end
243
- end
244
-
245
- model = ThisNameBetterNotBeInUse.new
246
- expect(model).to receive(:do_something_before).once.ordered
247
- expect(model).to receive(:do_something_after).once.ordered
248
- model.in_right_order!
249
- end
250
- end
251
-
252
- describe 'current event' do
253
- let(:pe) {ParametrisedEvent.new}
254
-
255
- it 'if no event has been triggered' do
256
- expect(pe.aasm.current_event).to be_nil
257
- end
258
-
259
- it 'if a event has been triggered' do
260
- pe.wakeup
261
- expect(pe.aasm.current_event).to eql :wakeup
262
- end
263
-
264
- it 'if no event has been triggered' do
265
- pe.wakeup!
266
- expect(pe.aasm.current_event).to eql :wakeup!
267
- end
268
- end
269
-
270
- describe 'parametrised events' do
271
- let(:pe) {ParametrisedEvent.new}
272
-
273
- it 'should transition to specified next state (sleeping to showering)' do
274
- pe.wakeup!(:showering)
275
- expect(pe.aasm.current_state).to eq(:showering)
276
- end
277
-
278
- it 'should transition to specified next state (sleeping to working)' do
279
- pe.wakeup!(:working)
280
- expect(pe.aasm.current_state).to eq(:working)
281
- end
282
-
283
- it 'should transition to default (first or showering) state' do
284
- pe.wakeup!
285
- expect(pe.aasm.current_state).to eq(:showering)
286
- end
287
-
288
- it 'should transition to default state when :after transition invoked' do
289
- pe.dress!(nil, 'purple', 'dressy')
290
- expect(pe.aasm.current_state).to eq(:working)
291
- end
292
-
293
- it 'should call :after transition method with args' do
294
- pe.wakeup!(:showering)
295
- expect(pe).to receive(:wear_clothes).with('blue', 'jeans')
296
- pe.dress!(:working, 'blue', 'jeans')
297
- end
298
-
299
- it 'should call :after transition proc' do
300
- pe.wakeup!(:showering)
301
- expect(pe).to receive(:wear_clothes).with('purple', 'slacks')
302
- pe.dress!(:dating, 'purple', 'slacks')
303
- end
304
-
305
- it 'should call :after transition with an array of methods' do
306
- pe.wakeup!(:showering)
307
- expect(pe).to receive(:condition_hair)
308
- expect(pe).to receive(:fix_hair)
309
- pe.dress!(:prettying_up)
310
- end
311
- end
312
-
313
- describe 'event firing without persistence' do
314
- it 'should attempt to persist if aasm_write_state is defined' do
315
- foo = Foo.new
316
- def foo.aasm_write_state; end
317
- expect(foo).to be_open
318
-
319
- expect(foo).to receive(:aasm_write_state_without_persistence)
320
- foo.close
321
- end
322
- 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,60 +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
- end
31
-
32
- describe "event guards" do
33
- let(:guardian) { Guardian.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,15 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'initial states' do
4
- it 'should use the first state defined if no initial state is given' do
5
- expect(NoInitialStateMultiple.new.aasm(:left).current_state).to eq(:read)
6
- end
7
-
8
- it 'should determine initial state from the Proc results' do
9
- balance = InitialStateProcMultiple::RICH - 1
10
- expect(InitialStateProcMultiple.new(balance).aasm(:left).current_state).to eq(:selling_bad_mortgages)
11
-
12
- balance = InitialStateProcMultiple::RICH + 1
13
- expect(InitialStateProcMultiple.new(balance).aasm(:left).current_state).to eq(:retired)
14
- end
15
- end
@@ -1,12 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'initial states' do
4
- it 'should use the first state defined if no initial state is given' do
5
- expect(NoInitialState.new.aasm.current_state).to eq(:read)
6
- end
7
-
8
- it 'should determine initial state from the Proc results' do
9
- expect(InitialStateProc.new(InitialStateProc::RICH - 1).aasm.current_state).to eq(:selling_bad_mortgages)
10
- expect(InitialStateProc.new(InitialStateProc::RICH + 1).aasm.current_state).to eq(:retired)
11
- end
12
- end