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,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'testing the README examples' do
4
+
5
+ it 'Usage' do
6
+ class Job
7
+ include AASM
8
+
9
+ aasm do
10
+ state :sleeping, :initial => true
11
+ state :running, :cleaning
12
+
13
+ event :run do
14
+ transitions :from => :sleeping, :to => :running
15
+ end
16
+
17
+ event :clean do
18
+ transitions :from => :running, :to => :cleaning
19
+ end
20
+
21
+ event :sleep do
22
+ transitions :from => [:running, :cleaning], :to => :sleeping
23
+ end
24
+ end
25
+ end
26
+
27
+ job = Job.new
28
+
29
+ expect(job.sleeping?).to eql true
30
+ expect(job.may_run?).to eql true
31
+
32
+ job.run
33
+
34
+ expect(job.running?).to eql true
35
+ expect(job.sleeping?).to eql false
36
+ expect(job.may_run?).to eql false
37
+
38
+ expect { job.run }.to raise_error(AASM::InvalidTransition)
39
+ end
40
+
41
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'when redefining states' do
4
+ let(:definer) { DoubleDefiner.new }
5
+
6
+ it "allows extending states" do
7
+ expect(definer).to receive(:do_enter)
8
+ definer.finish
9
+ end
10
+
11
+ it "allows extending events" do
12
+ expect(definer).to receive(:do_on_transition)
13
+ definer.finish
14
+ end
15
+ end
@@ -0,0 +1,88 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'state machine' do
4
+ let(:simple) { SimpleExample.new }
5
+ let(:multiple) { SimpleMultipleExample.new }
6
+
7
+ describe 'transition_from' do
8
+ it "works for simple state machines" do
9
+ expect(simple).to transition_from(:initialised).to(:filled_out).on_event(:fill_out)
10
+ expect(simple).to_not transition_from(:initialised).to(:authorised).on_event(:fill_out)
11
+ expect(simple).to_not transition_from(:authorised).to(:filled_out).on_event(:fill_out)
12
+ end
13
+
14
+ it "works for multiple state machines" do
15
+ expect(multiple).to transition_from(:standing).to(:walking).on_event(:walk).on(:move)
16
+ expect(multiple).to_not transition_from(:standing).to(:running).on_event(:walk).on(:move)
17
+ expect(multiple).to_not transition_from(:running).to(:walking).on_event(:walk).on(:move)
18
+
19
+ expect(multiple).to transition_from(:sleeping).to(:processing).on_event(:start).on(:work)
20
+ expect(multiple).to_not transition_from(:sleeping).to(:sleeping).on_event(:start).on(:work)
21
+ expect(multiple).to_not transition_from(:processing).to(:sleeping).on_event(:start).on(:work)
22
+ end
23
+ end
24
+
25
+ describe 'allow_transition_to' do
26
+ it "works for simple state machines" do
27
+ expect(simple).to allow_transition_to(:filled_out)
28
+ expect(simple).to_not allow_transition_to(:authorised)
29
+ end
30
+
31
+ it "works for multiple state machines" do
32
+ expect(multiple).to allow_transition_to(:walking).on(:move)
33
+ expect(multiple).to_not allow_transition_to(:standing).on(:move)
34
+
35
+ expect(multiple).to allow_transition_to(:processing).on(:work)
36
+ expect(multiple).to_not allow_transition_to(:sleeping).on(:work)
37
+ end
38
+ end
39
+
40
+ describe "have_state" do
41
+ it "works for simple state machines" do
42
+ expect(simple).to have_state :initialised
43
+ expect(simple).to_not have_state :filled_out
44
+ simple.fill_out
45
+ expect(simple).to have_state :filled_out
46
+ end
47
+
48
+ it "works for multiple state machines" do
49
+ expect(multiple).to have_state(:standing).on(:move)
50
+ expect(multiple).to_not have_state(:walking).on(:move)
51
+ multiple.walk
52
+ expect(multiple).to have_state(:walking).on(:move)
53
+
54
+ expect(multiple).to have_state(:sleeping).on(:work)
55
+ expect(multiple).to_not have_state(:processing).on(:work)
56
+ multiple.start
57
+ expect(multiple).to have_state(:processing).on(:work)
58
+ end
59
+ end
60
+
61
+ describe "allow_event" do
62
+ it "works for simple state machines" do
63
+ expect(simple).to allow_event :fill_out
64
+ expect(simple).to_not allow_event :authorise
65
+ simple.fill_out
66
+ expect(simple).to allow_event :authorise
67
+ end
68
+
69
+ it "works with custom arguments" do
70
+ example = SimpleExampleWithGuardArgs.new
71
+ expect(example).to allow_event(:fill_out_with_args).with(true)
72
+ expect(example).to_not allow_event(:fill_out_with_args).with(false)
73
+ end
74
+
75
+ it "works for multiple state machines" do
76
+ expect(multiple).to allow_event(:walk).on(:move)
77
+ expect(multiple).to_not allow_event(:hold).on(:move)
78
+ multiple.walk
79
+ expect(multiple).to allow_event(:hold).on(:move)
80
+
81
+ expect(multiple).to allow_event(:start).on(:work)
82
+ expect(multiple).to_not allow_event(:stop).on(:work)
83
+ multiple.start
84
+ expect(multiple).to allow_event(:stop).on(:work)
85
+ end
86
+ end
87
+
88
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Custom AASM::Base' do
4
+ context 'when aasm_with invoked with SimpleCustomExample' do
5
+ let(:simple_custom) { SimpleCustomExample.new }
6
+
7
+ subject do
8
+ simple_custom.fill_out!
9
+ simple_custom.authorise
10
+ end
11
+
12
+ it 'has invoked authorizable?' do
13
+ expect { subject }.to change { simple_custom.authorizable_called }.from(nil).to(true)
14
+ end
15
+
16
+ it 'has invoked fillable?' do
17
+ expect { subject }.to change { simple_custom.fillable_called }.from(nil).to(true)
18
+ end
19
+
20
+ it 'has two transition counts' do
21
+ expect { subject }.to change { simple_custom.transition_count }.from(nil).to(2)
22
+ end
23
+ end
24
+
25
+ context 'when aasm_with invoked with non AASM::Base' do
26
+ subject do
27
+ Class.new do
28
+ include AASM
29
+
30
+ aasm :with_klass => String do
31
+ end
32
+ end
33
+ end
34
+
35
+ it 'should raise an ArgumentError' do
36
+ expect { subject }.to raise_error(ArgumentError, 'The class String must inherit from AASM::Base!')
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'state machine' do
4
+ let(:simple) { SimpleExample.new }
5
+
6
+ it 'starts with an initial state' do
7
+ expect(simple.aasm.current_state).to eq(:initialised)
8
+ expect(simple).to respond_to(:initialised?)
9
+ expect(simple).to be_initialised
10
+ end
11
+
12
+ it 'allows transitions to other states' do
13
+ expect(simple).to respond_to(:fill_out)
14
+ expect(simple).to respond_to(:fill_out!)
15
+ simple.fill_out!
16
+ expect(simple).to respond_to(:filled_out?)
17
+ expect(simple).to be_filled_out
18
+
19
+ expect(simple).to respond_to(:authorise)
20
+ expect(simple).to respond_to(:authorise!)
21
+ simple.authorise
22
+ expect(simple).to respond_to(:authorised?)
23
+ expect(simple).to be_authorised
24
+ end
25
+
26
+ it 'shows the permitted transitions' do
27
+ expect(simple.aasm.permitted_transitions).to eq(
28
+ [
29
+ { event: :fill_out, state: :filled_out },
30
+ { event: :deny, state: :denied }
31
+ ]
32
+ )
33
+
34
+ simple.fill_out!
35
+ expect(simple.aasm.permitted_transitions).to eq([{ event: :authorise, state: :authorised }])
36
+
37
+ simple.authorise
38
+ expect(simple.aasm.permitted_transitions).to eq([])
39
+ end
40
+
41
+ it 'denies transitions to other states' do
42
+ expect {simple.authorise}.to raise_error(AASM::InvalidTransition)
43
+ expect {simple.authorise!}.to raise_error(AASM::InvalidTransition)
44
+ simple.fill_out
45
+ expect {simple.fill_out}.to raise_error(AASM::InvalidTransition)
46
+ expect {simple.fill_out!}.to raise_error(AASM::InvalidTransition)
47
+ simple.authorise
48
+ expect {simple.fill_out}.to raise_error(AASM::InvalidTransition)
49
+ expect {simple.fill_out!}.to raise_error(AASM::InvalidTransition)
50
+ end
51
+
52
+ it 'defines constants for each state name' do
53
+ expect(SimpleExample::STATE_INITIALISED).to eq(:initialised)
54
+ expect(SimpleExample::STATE_FILLED_OUT).to eq(:filled_out)
55
+ expect(SimpleExample::STATE_AUTHORISED).to eq(:authorised)
56
+ end
57
+ end
@@ -0,0 +1,91 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'state machine' do
4
+ let(:simple) { SimpleMultipleExample.new }
5
+
6
+ it 'starts with an initial state' do
7
+ expect(simple.aasm(:move).current_state).to eq(:standing)
8
+ expect(simple).to respond_to(:standing?)
9
+ expect(simple).to be_standing
10
+
11
+ expect(simple.aasm(:work).current_state).to eq(:sleeping)
12
+ expect(simple).to respond_to(:sleeping?)
13
+ expect(simple).to be_sleeping
14
+ end
15
+
16
+ it 'allows transitions to other states' do
17
+ expect(simple).to respond_to(:walk)
18
+ expect(simple).to respond_to(:walk!)
19
+ simple.walk!
20
+ expect(simple).to respond_to(:walking?)
21
+ expect(simple).to be_walking
22
+
23
+ expect(simple).to respond_to(:run)
24
+ expect(simple).to respond_to(:run!)
25
+ simple.run
26
+ expect(simple).to respond_to(:running?)
27
+ expect(simple).to be_running
28
+
29
+ expect(simple).to respond_to(:start)
30
+ expect(simple).to respond_to(:start!)
31
+ simple.start
32
+ expect(simple).to respond_to(:processing?)
33
+ expect(simple).to be_processing
34
+ end
35
+
36
+ it 'denies transitions to other states' do
37
+ expect {simple.hold}.to raise_error(AASM::InvalidTransition)
38
+ expect {simple.hold!}.to raise_error(AASM::InvalidTransition)
39
+ simple.walk
40
+ expect {simple.walk}.to raise_error(AASM::InvalidTransition)
41
+ expect {simple.walk!}.to raise_error(AASM::InvalidTransition)
42
+ simple.run
43
+ expect {simple.walk}.to raise_error(AASM::InvalidTransition)
44
+ expect {simple.walk!}.to raise_error(AASM::InvalidTransition)
45
+
46
+ expect {simple.stop}.to raise_error(AASM::InvalidTransition)
47
+ expect {simple.stop!}.to raise_error(AASM::InvalidTransition)
48
+ simple.start
49
+ expect {simple.start}.to raise_error(AASM::InvalidTransition)
50
+ expect {simple.start!}.to raise_error(AASM::InvalidTransition)
51
+ simple.stop
52
+ end
53
+
54
+ it 'defines constants for each state name' do
55
+ expect(SimpleMultipleExample::STATE_STANDING).to eq(:standing)
56
+ expect(SimpleMultipleExample::STATE_WALKING).to eq(:walking)
57
+ expect(SimpleMultipleExample::STATE_RUNNING).to eq(:running)
58
+
59
+ expect(SimpleMultipleExample::STATE_SLEEPING).to eq(:sleeping)
60
+ expect(SimpleMultipleExample::STATE_PROCESSING).to eq(:processing)
61
+ expect(SimpleMultipleExample::STATE_RUNNING).to eq(:running)
62
+ end
63
+
64
+ context 'triggers binding_events in bindind_state_machine' do
65
+ it 'does persist' do
66
+ expect(simple).to be_sleeping
67
+ expect(simple).to be_answered
68
+ expect(simple).to receive(:start!).and_call_original
69
+ simple.ask!
70
+ expect(simple).to be_asked
71
+ expect(simple).to be_processing
72
+ expect(simple).to receive(:stop!).and_call_original
73
+ simple.answer!
74
+ expect(simple).to be_sleeping
75
+ expect(simple).to be_answered
76
+ end
77
+
78
+ it 'does not persist' do
79
+ expect(simple).to be_sleeping
80
+ expect(simple).to be_answered
81
+ expect(simple).to receive(:start).and_call_original
82
+ simple.ask
83
+ expect(simple).to be_asked
84
+ expect(simple).to be_processing
85
+ expect(simple).to receive(:stop).and_call_original
86
+ simple.answer
87
+ expect(simple).to be_sleeping
88
+ expect(simple).to be_answered
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,89 @@
1
+ require 'spec_helper'
2
+
3
+ describe AASM::Core::State do
4
+ let(:state_machine) { AASM::StateMachine.new(:name) }
5
+
6
+ before(:each) do
7
+ @name = :astate
8
+ @options = { :crazy_custom_key => 'key' }
9
+ end
10
+
11
+ def new_state(options={})
12
+ AASM::Core::State.new(@name, Conversation, state_machine, @options.merge(options))
13
+ end
14
+
15
+ it 'should set the name' do
16
+ state = new_state
17
+ expect(state.name).to eq(:astate)
18
+ end
19
+
20
+ it 'should set the display_name from name' do
21
+ expect(new_state.display_name).to eq('Astate')
22
+ end
23
+
24
+ it 'should set the display_name from options' do
25
+ expect(new_state(:display => "A State").display_name).to eq('A State')
26
+ end
27
+
28
+ it 'should set the options and expose them as options' do
29
+ expect(new_state.options).to eq(@options)
30
+ end
31
+
32
+ it 'should be equal to a symbol of the same name' do
33
+ expect(new_state).to eq(:astate)
34
+ end
35
+
36
+ it 'should be equal to a State of the same name' do
37
+ expect(new_state).to eq(new_state)
38
+ end
39
+
40
+ it 'should send a message to the record for an action if the action is present as a symbol' do
41
+ state = new_state(:entering => :foo)
42
+
43
+ record = double('record')
44
+ expect(record).to receive(:foo)
45
+
46
+ state.fire_callbacks(:entering, record)
47
+ end
48
+
49
+ it 'should send a message to the record for an action if the action is present as a string' do
50
+ state = new_state(:entering => 'foo')
51
+
52
+ record = double('record')
53
+ expect(record).to receive(:foo)
54
+
55
+ state.fire_callbacks(:entering, record)
56
+ end
57
+
58
+ it 'should send a message to the record for each action' do
59
+ state = new_state(:entering => [:a, :b, "c", lambda {|r| r.foobar }])
60
+
61
+ record = double('record')
62
+ expect(record).to receive(:a)
63
+ expect(record).to receive(:b)
64
+ expect(record).to receive(:c)
65
+ expect(record).to receive(:foobar)
66
+
67
+ state.fire_callbacks(:entering, record, record)
68
+ end
69
+
70
+ it "should stop calling actions if one of them raises :halt_aasm_chain" do
71
+ state = new_state(:entering => [:a, :b, :c])
72
+
73
+ record = double('record')
74
+ expect(record).to receive(:a)
75
+ expect(record).to receive(:b).and_throw(:halt_aasm_chain)
76
+ expect(record).not_to receive(:c)
77
+
78
+ state.fire_callbacks(:entering, record)
79
+ end
80
+
81
+ it 'should call a proc, passing in the record for an action if the action is present' do
82
+ state = new_state(:entering => Proc.new {|r| r.foobar})
83
+
84
+ record = double('record')
85
+ expect(record).to receive(:foobar)
86
+
87
+ state.fire_callbacks(:entering, record, record)
88
+ end
89
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe StatesOnOneLineExample do
4
+ let(:example) { StatesOnOneLineExample.new }
5
+ describe 'on initialize' do
6
+ it 'should be in the initial state' do
7
+ expect(example.aasm(:one_line).current_state).to eql :initial
8
+ end
9
+ end
10
+
11
+ describe 'states' do
12
+ it 'should have all 3 states defined' do
13
+ expect(example.aasm(:one_line).states.map(&:name)).to eq [:initial, :first, :second]
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,74 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'subclassing with multiple state machines' do
4
+
5
+ it 'should have the parent states' do
6
+ SuperClassMultiple.aasm(:left).states.each do |state|
7
+ expect(SubClassWithMoreStatesMultiple.aasm(:left).states).to include(state)
8
+ end
9
+ expect(SubClassMultiple.aasm(:left).states).to eq(SuperClassMultiple.aasm(:left).states)
10
+
11
+ SuperClassMultiple.aasm(:right).states.each do |state|
12
+ expect(SubClassWithMoreStatesMultiple.aasm(:right).states).to include(state)
13
+ end
14
+ expect(SubClassMultiple.aasm(:right).states).to eq(SuperClassMultiple.aasm(:right).states)
15
+ end
16
+
17
+ it 'should not add the child states to the parent machine' do
18
+ expect(SuperClassMultiple.aasm(:left).states).not_to include(:foo)
19
+ expect(SuperClassMultiple.aasm(:right).states).not_to include(:archived)
20
+ end
21
+
22
+ it 'should have the same events as its parent' do
23
+ expect(SubClassMultiple.aasm(:left).events).to eq(SuperClassMultiple.aasm(:left).events)
24
+ expect(SubClassMultiple.aasm(:right).events).to eq(SuperClassMultiple.aasm(:right).events)
25
+ end
26
+
27
+ it 'should know how to respond to question methods' do
28
+ expect(SubClassMultiple.new.may_foo?).to be_truthy
29
+ expect(SubClassMultiple.new.may_close?).to be_truthy
30
+ end
31
+
32
+ it 'should not break if I call methods from super class' do
33
+ son = SubClassMultiple.new
34
+ son.update_state
35
+ expect(son.aasm(:left).current_state).to eq(:ended)
36
+ end
37
+
38
+ it 'should allow the child to modify its left state machine' do
39
+ son = SubClassMultiple.new
40
+ expect(son.left_called_after).to eq(nil)
41
+ expect(son.right_called_after).to eq(nil)
42
+ son.foo
43
+ expect(son.left_called_after).to eq(true)
44
+ expect(son.right_called_after).to eq(nil)
45
+ global_callbacks = SubClassMultiple.aasm(:left).state_machine.global_callbacks
46
+ expect(global_callbacks).to_not be_empty
47
+ expect(global_callbacks[:after_all_transitions]).to eq :left_after_all_event
48
+ end
49
+
50
+ it 'should allow the child to modify its right state machine' do
51
+ son = SubClassMultiple.new
52
+ expect(son.right_called_after).to eq(nil)
53
+ expect(son.left_called_after).to eq(nil)
54
+ son.close
55
+ expect(son.right_called_after).to eq(true)
56
+ expect(son.left_called_after).to eq(nil)
57
+ global_callbacks = SubClassMultiple.aasm(:right).state_machine.global_callbacks
58
+ expect(global_callbacks).to_not be_empty
59
+ expect(global_callbacks[:after_all_transitions]).to eq :right_after_all_event
60
+ end
61
+
62
+ it 'should not modify the parent left state machine' do
63
+ super_class_event = SuperClassMultiple.aasm(:left).events.select { |event| event.name == :foo }.first
64
+ expect(super_class_event.options).to be_empty
65
+ expect(SuperClassMultiple.aasm(:left).state_machine.global_callbacks).to be_empty
66
+ end
67
+
68
+ it 'should not modify the parent right state machine' do
69
+ super_class_event = SuperClassMultiple.aasm(:right).events.select { |event| event.name == :close }.first
70
+ expect(super_class_event.options).to be_empty
71
+ expect(SuperClassMultiple.aasm(:right).state_machine.global_callbacks).to be_empty
72
+ end
73
+
74
+ end