aasm 5.0.8

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