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,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
@@ -1,201 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'inspection for common cases' do
4
- it 'should support the new DSL' do
5
- # 1st state machine
6
- expect(FooMultiple.aasm(:left)).to respond_to(:states)
7
- expect(FooMultiple.aasm(:left).states.size).to eql 3
8
- expect(FooMultiple.aasm(:left).states).to include(:open)
9
- expect(FooMultiple.aasm(:left).states).to include(:closed)
10
- expect(FooMultiple.aasm(:left).states).to include(:final)
11
-
12
- expect(FooMultiple.aasm(:left)).to respond_to(:initial_state)
13
- expect(FooMultiple.aasm(:left).initial_state).to eq(:open)
14
-
15
- expect(FooMultiple.aasm(:left)).to respond_to(:events)
16
- expect(FooMultiple.aasm(:left).events.size).to eql 2
17
- expect(FooMultiple.aasm(:left).events).to include(:close)
18
- expect(FooMultiple.aasm(:left).events).to include(:null)
19
-
20
- # 2nd state machine
21
- expect(FooMultiple.aasm(:right)).to respond_to(:states)
22
- expect(FooMultiple.aasm(:right).states.size).to eql 3
23
- expect(FooMultiple.aasm(:right).states).to include(:green)
24
- expect(FooMultiple.aasm(:right).states).to include(:yellow)
25
- expect(FooMultiple.aasm(:right).states).to include(:red)
26
-
27
- expect(FooMultiple.aasm(:right)).to respond_to(:initial_state)
28
- expect(FooMultiple.aasm(:right).initial_state).to eq(:green)
29
-
30
- expect(FooMultiple.aasm(:right)).to respond_to(:events)
31
- expect(FooMultiple.aasm(:right).events.size).to eql 3
32
- expect(FooMultiple.aasm(:right).events).to include(:green)
33
- expect(FooMultiple.aasm(:right).events).to include(:yellow)
34
- expect(FooMultiple.aasm(:right).events).to include(:red)
35
- end
36
-
37
- context "instance level inspection" do
38
- let(:foo) { FooMultiple.new }
39
- let(:two) { FooTwoMultiple.new }
40
-
41
- it "delivers all states" do
42
- # 1st state machine
43
- states = foo.aasm(:left).states
44
- expect(states.size).to eql 3
45
- expect(states).to include(:open)
46
- expect(states).to include(:closed)
47
- expect(states).to include(:final)
48
-
49
- states = foo.aasm(:left).states(:permitted => true)
50
- expect(states.size).to eql 1
51
- expect(states).to include(:closed)
52
- expect(states).not_to include(:open)
53
- expect(states).not_to include(:final)
54
-
55
- foo.close
56
- expect(foo.aasm(:left).states(:permitted => true)).to be_empty
57
-
58
- # 2nd state machine
59
- states = foo.aasm(:right).states
60
- expect(states.size).to eql 3
61
- expect(states).to include(:green)
62
- expect(states).to include(:yellow)
63
- expect(states).to include(:red)
64
-
65
- states = foo.aasm(:right).states(:permitted => true)
66
- expect(states.size).to eql 1
67
- expect(states).to include(:yellow)
68
- expect(states).not_to include(:green)
69
- expect(states).not_to include(:red)
70
-
71
- foo.yellow
72
- states = foo.aasm(:right).states(:permitted => true)
73
- expect(states.size).to eql 2
74
- expect(states).to include(:red)
75
- expect(states).to include(:green)
76
- expect(states).not_to include(:yellow)
77
- end
78
-
79
- it "delivers all states for subclasses" do
80
- # 1st state machine
81
- states = two.aasm(:left).states
82
- expect(states.size).to eql 4
83
- expect(states).to include(:open)
84
- expect(states).to include(:closed)
85
- expect(states).to include(:final)
86
- expect(states).to include(:foo)
87
-
88
- states = two.aasm(:left).states(:permitted => true)
89
- expect(states.size).to eql 1
90
- expect(states).to include(:closed)
91
- expect(states).not_to include(:open)
92
-
93
- two.close
94
- expect(two.aasm(:left).states(:permitted => true)).to be_empty
95
-
96
- # 2nd state machine
97
- states = two.aasm(:right).states
98
- expect(states.size).to eql 4
99
- expect(states).to include(:green)
100
- expect(states).to include(:yellow)
101
- expect(states).to include(:red)
102
- expect(states).to include(:bar)
103
-
104
- states = two.aasm(:right).states(:permitted => true)
105
- expect(states.size).to eql 1
106
- expect(states).to include(:yellow)
107
- expect(states).not_to include(:red)
108
- expect(states).not_to include(:green)
109
- expect(states).not_to include(:bar)
110
-
111
- two.yellow
112
- states = two.aasm(:right).states(:permitted => true)
113
- expect(states.size).to eql 2
114
- expect(states).to include(:green)
115
- expect(states).to include(:red)
116
- expect(states).not_to include(:yellow)
117
- expect(states).not_to include(:bar)
118
- end
119
-
120
- it "delivers all events" do
121
- # 1st state machine
122
- events = foo.aasm(:left).events
123
- expect(events.size).to eql 2
124
- expect(events).to include(:close)
125
- expect(events).to include(:null)
126
-
127
- foo.close
128
- expect(foo.aasm(:left).events).to be_empty
129
-
130
- # 2nd state machine
131
- events = foo.aasm(:right).events
132
- expect(events.size).to eql 1
133
- expect(events).to include(:yellow)
134
- expect(events).not_to include(:green)
135
- expect(events).not_to include(:red)
136
-
137
- foo.yellow
138
- events = foo.aasm(:right).events
139
- expect(events.size).to eql 2
140
- expect(events).to include(:green)
141
- expect(events).to include(:red)
142
- expect(events).not_to include(:yellow)
143
- end
144
- end
145
-
146
- it 'should list states in the order they have been defined' do
147
- expect(ConversationMultiple.aasm(:left).states).to eq([
148
- :needs_attention, :read, :closed, :awaiting_response, :junk
149
- ])
150
- end
151
- end
152
-
153
- describe "special cases" do
154
- it "should support valid as state name" do
155
- expect(ValidStateNameMultiple.aasm(:left).states).to include(:invalid)
156
- expect(ValidStateNameMultiple.aasm(:left).states).to include(:valid)
157
-
158
- argument = ValidStateNameMultiple.new
159
- expect(argument.invalid?).to be_truthy
160
- expect(argument.aasm(:left).current_state).to eq(:invalid)
161
-
162
- argument.valid!
163
- expect(argument.valid?).to be_truthy
164
- expect(argument.aasm(:left).current_state).to eq(:valid)
165
- end
166
- end
167
-
168
- describe 'aasm.states_for_select' do
169
- it "should return a select friendly array of states" do
170
- expect(FooMultiple.aasm(:left)).to respond_to(:states_for_select)
171
- expect(FooMultiple.aasm(:left).states_for_select).to eq(
172
- [['Open', 'open'], ['Closed', 'closed'], ['Final', 'final']]
173
- )
174
- end
175
- end
176
-
177
- describe 'aasm.from_states_for_state' do
178
- it "should return all from states for a state" do
179
- expect(ComplexExampleMultiple.aasm(:left)).to respond_to(:from_states_for_state)
180
- froms = ComplexExampleMultiple.aasm(:left).from_states_for_state(:active)
181
- [:pending, :passive, :suspended].each {|from| expect(froms).to include(from)}
182
- end
183
-
184
- it "should return from states for a state for a particular transition only" do
185
- froms = ComplexExampleMultiple.aasm(:left).from_states_for_state(:active, :transition => :left_unsuspend)
186
- [:suspended].each {|from| expect(froms).to include(from)}
187
- end
188
- end
189
-
190
- describe 'permitted events' do
191
- let(:foo) {FooMultiple.new}
192
-
193
- it 'work' do
194
- expect(foo.aasm(:left).events(:permitted => true)).to include(:close)
195
- expect(foo.aasm(:left).events(:permitted => true)).not_to include(:null)
196
-
197
- expect(foo.aasm(:right).events(:permitted => true)).to include(:yellow)
198
- expect(foo.aasm(:right).events(:permitted => true)).not_to include(:green)
199
- expect(foo.aasm(:right).events(:permitted => true)).not_to include(:red)
200
- end
201
- end
@@ -1,149 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'inspection for common cases' do
4
- it 'should support the new DSL' do
5
- expect(Foo.aasm).to respond_to(:states)
6
- expect(Foo.aasm.states).to include(:open)
7
- expect(Foo.aasm.states).to include(:closed)
8
-
9
- expect(Foo.aasm).to respond_to(:initial_state)
10
- expect(Foo.aasm.initial_state).to eq(:open)
11
-
12
- expect(Foo.aasm).to respond_to(:events)
13
- expect(Foo.aasm.events).to include(:close)
14
- expect(Foo.aasm.events).to include(:null)
15
- end
16
-
17
- context "instance level inspection" do
18
- let(:foo) { Foo.new }
19
- let(:two) { FooTwo.new }
20
- let(:multi) { MultiTransitioner.new }
21
-
22
- it "delivers all states" do
23
- states = foo.aasm.states
24
- expect(states).to include(:open)
25
- expect(states).to include(:closed)
26
- expect(states).to include(:final)
27
-
28
- permitted_states = foo.aasm.states(:permitted => true)
29
- expect(permitted_states).to include(:closed)
30
- expect(permitted_states).not_to include(:open)
31
- expect(permitted_states).not_to include(:final)
32
-
33
- blocked_states = foo.aasm.states(:permitted => false)
34
- expect(blocked_states).to include(:closed)
35
- expect(blocked_states).not_to include(:open)
36
- expect(blocked_states).to include(:final)
37
-
38
- foo.close
39
- expect(foo.aasm.states(:permitted => true)).to be_empty
40
- end
41
-
42
- it "delivers all states for subclasses" do
43
- states = two.aasm.states
44
- expect(states).to include(:open)
45
- expect(states).to include(:closed)
46
- expect(states).to include(:final)
47
- expect(states).to include(:foo)
48
-
49
- states = two.aasm.states(:permitted => true)
50
- expect(states).to include(:closed)
51
- expect(states).not_to include(:open)
52
- expect(states).not_to include(:final)
53
-
54
- two.close
55
- expect(two.aasm.states(:permitted => true)).to be_empty
56
- end
57
-
58
- it "delivers all events" do
59
- events = foo.aasm.events
60
- expect(events).to include(:close)
61
- expect(events).to include(:null)
62
- foo.close
63
- expect(foo.aasm.events).to be_empty
64
- end
65
-
66
- it "delivers permitted states when multiple transitions are defined" do
67
- multi.can_run = false
68
- states = multi.aasm.states(:permitted => true)
69
- expect(states).to_not include(:running)
70
- expect(states).to include(:dancing)
71
-
72
- multi.can_run = true
73
- states = multi.aasm.states(:permitted => true)
74
- expect(states).to include(:running)
75
- expect(states).to_not include(:dancing)
76
- end
77
-
78
- it "transitions to correct state if from state is missing from one transitions" do
79
- multi.sleep
80
- expect(multi.aasm.current_state).to eq(:sleeping)
81
- end
82
- end
83
-
84
- it 'should list states in the order they have been defined' do
85
- expect(Conversation.aasm.states).to eq([:needs_attention, :read, :closed, :awaiting_response, :junk])
86
- end
87
- end
88
-
89
- describe "special cases" do
90
- it "should support valid as state name" do
91
- expect(ValidStateName.aasm.states).to include(:invalid)
92
- expect(ValidStateName.aasm.states).to include(:valid)
93
-
94
- argument = ValidStateName.new
95
- expect(argument.invalid?).to be_truthy
96
- expect(argument.aasm.current_state).to eq(:invalid)
97
-
98
- argument.valid!
99
- expect(argument.valid?).to be_truthy
100
- expect(argument.aasm.current_state).to eq(:valid)
101
- end
102
- end
103
-
104
- describe 'aasm.states_for_select' do
105
- it "should return a select friendly array of states" do
106
- expect(Foo.aasm).to respond_to(:states_for_select)
107
- expect(Foo.aasm.states_for_select).to eq([['Open', 'open'], ['Closed', 'closed'], ['Final', 'final']])
108
- end
109
- end
110
-
111
- describe 'aasm.from_states_for_state' do
112
- it "should return all from states for a state" do
113
- expect(ComplexExample.aasm).to respond_to(:from_states_for_state)
114
- froms = ComplexExample.aasm.from_states_for_state(:active)
115
- [:pending, :passive, :suspended].each {|from| expect(froms).to include(from)}
116
- end
117
-
118
- it "should return from states for a state for a particular transition only" do
119
- froms = ComplexExample.aasm.from_states_for_state(:active, :transition => :unsuspend)
120
- [:suspended].each {|from| expect(froms).to include(from)}
121
- end
122
- end
123
-
124
- describe 'permitted events' do
125
- let(:foo) {Foo.new}
126
-
127
- it 'work' do
128
- expect(foo.aasm.events(:permitted => true)).to include(:close)
129
- expect(foo.aasm.events(:permitted => true)).not_to include(:null)
130
- end
131
-
132
- it 'should not include events in the reject option' do
133
- expect(foo.aasm.events(:permitted => true, reject: :close)).not_to include(:close)
134
- expect(foo.aasm.events(:permitted => true, reject: [:close])).not_to include(:close)
135
- end
136
- end
137
-
138
- describe 'not permitted events' do
139
- let(:foo) {Foo.new}
140
-
141
- it 'work' do
142
- expect(foo.aasm.events(:permitted => false)).to include(:null)
143
- expect(foo.aasm.events(:permitted => false)).not_to include(:close)
144
- end
145
-
146
- it 'should not include events in the reject option' do
147
- expect(foo.aasm.events(:permitted => false, reject: :null)).to eq([])
148
- end
149
- end
@@ -1,189 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe AASM::Core::Invoker do
4
- let(:target) { nil }
5
- let(:record) { double }
6
- let(:args) { [] }
7
-
8
- subject { described_class.new(target, record, args) }
9
-
10
- describe '#with_options' do
11
- context 'when passing array as a subject' do
12
- context 'and "guard" option is set to true' do
13
- let(:target) { [subject_1, subject_2] }
14
-
15
- before { subject.with_options(guard: true) }
16
-
17
- context 'and all the subjects are truthy' do
18
- let(:subject_1) { Proc.new { true } }
19
- let(:subject_2) { Proc.new { true } }
20
-
21
- it 'then returns "true" while invoking' do
22
- expect(subject.invoke).to eq(true)
23
- end
24
- end
25
-
26
- context 'and any subject is falsely' do
27
- let(:subject_1) { Proc.new { false } }
28
- let(:subject_2) { Proc.new { true } }
29
-
30
- it 'then returns "false" while invoking' do
31
- expect(subject.invoke).to eq(false)
32
- end
33
- end
34
- end
35
-
36
- context 'and "unless" option is set to true' do
37
- let(:target) { [subject_1, subject_2] }
38
-
39
- before { subject.with_options(unless: true) }
40
-
41
- context 'and all the subjects are falsely' do
42
- let(:subject_1) { Proc.new { false } }
43
- let(:subject_2) { Proc.new { false } }
44
-
45
- it 'then returns "true" while invoking' do
46
- expect(subject.invoke).to eq(true)
47
- end
48
- end
49
-
50
- context 'and any subject is truthy' do
51
- let(:subject_1) { Proc.new { false } }
52
- let(:subject_2) { Proc.new { true } }
53
-
54
- it 'then returns "false" while invoking' do
55
- expect(subject.invoke).to eq(false)
56
- end
57
- end
58
- end
59
- end
60
- end
61
-
62
- describe '#with_failures' do
63
- let(:concrete_invoker) { AASM::Core::Invokers::ProcInvoker }
64
- let(:target) { Proc.new {} }
65
-
66
- it 'then sets failures buffer for concrete invokers' do
67
- expect_any_instance_of(concrete_invoker)
68
- .to receive(:with_failures)
69
- .and_call_original
70
-
71
- subject.invoke
72
- end
73
- end
74
-
75
- describe '#with_default_return_value' do
76
- context 'when return value is "true"' do
77
- before { subject.with_default_return_value(true) }
78
-
79
- it 'then returns "true" when was not picked up by any invoker' do
80
- expect(subject.invoke).to eq(true)
81
- end
82
- end
83
-
84
- context 'when return value is "false"' do
85
- before { subject.with_default_return_value(false) }
86
-
87
- it 'then returns "false" when was not picked up by any invoker' do
88
- expect(subject.invoke).to eq(false)
89
- end
90
- end
91
- end
92
-
93
- describe '#invoke' do
94
- context 'when subject is a proc' do
95
- let(:concrete_invoker) { AASM::Core::Invokers::ProcInvoker }
96
- let(:target) { Proc.new {} }
97
-
98
- it 'then calls proc invoker' do
99
- expect_any_instance_of(concrete_invoker)
100
- .to receive(:invoke)
101
- .and_call_original
102
-
103
- expect(record).to receive(:instance_exec)
104
-
105
- subject.invoke
106
- end
107
- end
108
-
109
- context 'when subject is a class' do
110
- let(:concrete_invoker) { AASM::Core::Invokers::ClassInvoker }
111
- let(:target) { Class.new { def call; end } }
112
-
113
- it 'then calls proc invoker' do
114
- expect_any_instance_of(concrete_invoker)
115
- .to receive(:invoke)
116
- .and_call_original
117
-
118
- expect_any_instance_of(target).to receive(:call)
119
-
120
- subject.invoke
121
- end
122
- end
123
-
124
- context 'when subject is a literal' do
125
- let(:concrete_invoker) { AASM::Core::Invokers::LiteralInvoker }
126
- let(:record) { double(invoke_me: nil) }
127
- let(:target) { :invoke_me }
128
-
129
- it 'then calls literal invoker' do
130
- expect_any_instance_of(concrete_invoker)
131
- .to receive(:invoke)
132
- .and_call_original
133
-
134
- expect(record).to receive(:invoke_me)
135
-
136
- subject.invoke
137
- end
138
- end
139
-
140
- context 'when subject is an array of procs' do
141
- let(:subject_1) { Proc.new {} }
142
- let(:subject_2) { Proc.new {} }
143
- let(:target) { [subject_1, subject_2] }
144
-
145
- it 'then calls each proc' do
146
- expect(record).to receive(:instance_exec).twice
147
-
148
- subject.invoke
149
- end
150
- end
151
-
152
- context 'when subject is an array of classes' do
153
- let(:subject_1) { Class.new { def call; end } }
154
- let(:subject_2) { Class.new { def call; end } }
155
- let(:target) { [subject_1, subject_2] }
156
-
157
- it 'then calls each class' do
158
- expect_any_instance_of(subject_1).to receive(:call)
159
-
160
- expect_any_instance_of(subject_2).to receive(:call)
161
-
162
- subject.invoke
163
- end
164
- end
165
-
166
- context 'when subject is an array of literals' do
167
- let(:subject_1) { :method_one }
168
- let(:subject_2) { :method_two }
169
- let(:record) { double(method_one: nil, method_two: nil) }
170
- let(:target) { [subject_1, subject_2] }
171
-
172
- it 'then calls each class' do
173
- expect(record).to receive(:method_one)
174
-
175
- expect(record).to receive(:method_two)
176
-
177
- subject.invoke
178
- end
179
- end
180
-
181
- context 'when subject is not supported' do
182
- let(:target) { nil }
183
-
184
- it 'then just returns default value' do
185
- expect(subject.invoke).to eq(described_class::DEFAULT_RETURN_VALUE)
186
- end
187
- end
188
- end
189
- end
@@ -1,72 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe AASM::Core::Invokers::BaseInvoker do
4
- let(:target) { double }
5
- let(:record) { double }
6
- let(:args) { [] }
7
-
8
- subject { described_class.new(target, record, args) }
9
-
10
- describe '#may_invoke?' do
11
- it 'then raises NoMethodError' do
12
- expect { subject.may_invoke? }.to raise_error(NoMethodError)
13
- end
14
- end
15
-
16
- describe '#log_failure' do
17
- it 'then raises NoMethodError' do
18
- expect { subject.log_failure }.to raise_error(NoMethodError)
19
- end
20
- end
21
-
22
- describe '#invoke_subject' do
23
- it 'then raises NoMethodError' do
24
- expect { subject.log_failure }.to raise_error(NoMethodError)
25
- end
26
- end
27
-
28
- describe '#with_failures' do
29
- it 'then sets failures buffer' do
30
- buffer = [1, 2, 3]
31
- subject.with_failures(buffer)
32
-
33
- expect(subject.failures).to eq(buffer)
34
- end
35
- end
36
-
37
- describe '#invoke' do
38
- context 'when #may_invoke? respond with "false"' do
39
- before { allow(subject).to receive(:may_invoke?).and_return(false) }
40
-
41
- it 'then returns "nil"' do
42
- expect(subject.invoke).to eq(nil)
43
- end
44
- end
45
-
46
- context 'when #invoke_subject respond with "false"' do
47
- before do
48
- allow(subject).to receive(:may_invoke?).and_return(true)
49
- allow(subject).to receive(:invoke_subject).and_return(false)
50
- end
51
-
52
- it 'then calls #log_failure' do
53
- expect(subject).to receive(:log_failure)
54
-
55
- subject.invoke
56
- end
57
- end
58
-
59
- context 'when #invoke_subject succeed' do
60
- before do
61
- allow(subject).to receive(:may_invoke?).and_return(true)
62
- allow(subject).to receive(:invoke_subject).and_return(true)
63
- end
64
-
65
- it 'then returns result' do
66
- expect(subject).to receive(:result)
67
-
68
- subject.invoke
69
- end
70
- end
71
- end
72
- end