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,135 @@
1
+ require 'spec_helper'
2
+
3
+ if defined?(Dynamoid)
4
+ describe 'dynamoid' do
5
+
6
+ Dir[File.dirname(__FILE__) + "/../../models/dynamoid/*.rb"].sort.each do |f|
7
+ require File.expand_path(f)
8
+ end
9
+
10
+ before(:all) do
11
+ @model = DynamoidMultiple
12
+ end
13
+
14
+ describe "instance methods" do
15
+ let(:model) {@model.new}
16
+
17
+ it "should respond to aasm persistence methods" do
18
+ expect(model).to respond_to(:aasm_read_state)
19
+ expect(model).to respond_to(:aasm_write_state)
20
+ expect(model).to respond_to(:aasm_write_state_without_persistence)
21
+ end
22
+
23
+ it "should return the initial state when new and the aasm field is nil" do
24
+ expect(model.aasm(:left).current_state).to eq(:alpha)
25
+ end
26
+
27
+ it "should save the initial state" do
28
+ model.save
29
+ expect(model.status).to eq("alpha")
30
+ end
31
+
32
+ it "should return the aasm column when new and the aasm field is not nil" do
33
+ model.status = "beta"
34
+ expect(model.aasm(:left).current_state).to eq(:beta)
35
+ end
36
+
37
+ it "should return the aasm column when not new and the aasm_column is not nil" do
38
+ model.save
39
+ model.status = "gamma"
40
+ expect(model.aasm(:left).current_state).to eq(:gamma)
41
+ end
42
+
43
+ it "should allow a nil state" do
44
+ model.save
45
+ model.status = nil
46
+ expect(model.aasm(:left).current_state).to be_nil
47
+ end
48
+
49
+ it "should not change the state if state is not loaded" do
50
+ model.release
51
+ model.save
52
+ model.reload
53
+ expect(model.aasm(:left).current_state).to eq(:beta)
54
+ end
55
+ end
56
+
57
+ describe 'subclasses' do
58
+ it "should have the same states as its parent class" do
59
+ expect(Class.new(@model).aasm(:left).states).to eq(@model.aasm(:left).states)
60
+ end
61
+
62
+ it "should have the same events as its parent class" do
63
+ expect(Class.new(@model).aasm(:left).events).to eq(@model.aasm(:left).events)
64
+ end
65
+
66
+ it "should have the same column as its parent even for the new dsl" do
67
+ expect(@model.aasm(:left).attribute_name).to eq(:status)
68
+ expect(Class.new(@model).aasm(:left).attribute_name).to eq(:status)
69
+ end
70
+ end
71
+
72
+ describe 'initial states' do
73
+ it 'should support conditions' do
74
+ @model.aasm(:left) do
75
+ initial_state lambda{ |m| m.default }
76
+ end
77
+
78
+ expect(@model.new(:default => :beta).aasm(:left).current_state).to eq(:beta)
79
+ expect(@model.new(:default => :gamma).aasm(:left).current_state).to eq(:gamma)
80
+ end
81
+ end
82
+
83
+ describe "complex example" do
84
+ it "works" do
85
+ record = ComplexDynamoidExample.new
86
+ expect(record.aasm(:left).current_state).to eql :one
87
+ expect(record.aasm(:right).current_state).to eql :alpha
88
+
89
+ record.save
90
+ expect_aasm_states record, :one, :alpha
91
+ record.reload
92
+ expect_aasm_states record, :one, :alpha
93
+
94
+ record.increment!
95
+ expect_aasm_states record, :two, :alpha
96
+ record.reload
97
+ expect_aasm_states record, :two, :alpha
98
+
99
+ record.level_up!
100
+ expect_aasm_states record, :two, :beta
101
+ record.reload
102
+ expect_aasm_states record, :two, :beta
103
+
104
+ record.increment!
105
+ expect { record.increment! }.to raise_error(AASM::InvalidTransition)
106
+ expect_aasm_states record, :three, :beta
107
+ record.reload
108
+ expect_aasm_states record, :three, :beta
109
+
110
+ record.level_up!
111
+ expect_aasm_states record, :three, :gamma
112
+ record.reload
113
+ expect_aasm_states record, :three, :gamma
114
+
115
+ record.level_down # without saving
116
+ expect_aasm_states record, :three, :beta
117
+ record.reload
118
+ expect_aasm_states record, :three, :gamma
119
+
120
+ record.level_down # without saving
121
+ expect_aasm_states record, :three, :beta
122
+ record.reset!
123
+ expect_aasm_states record, :one, :beta
124
+ end
125
+
126
+ def expect_aasm_states(record, left_state, right_state)
127
+ expect(record.aasm(:left).current_state).to eql left_state.to_sym
128
+ expect(record.left).to eql left_state.to_s
129
+ expect(record.aasm(:right).current_state).to eql right_state.to_sym
130
+ expect(record.right).to eql right_state.to_s
131
+ end
132
+ end
133
+
134
+ end
135
+ end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+
3
+ if defined?(Dynamoid)
4
+ describe 'dynamoid' do
5
+
6
+ Dir[File.dirname(__FILE__) + "/../../models/dynamoid/*.rb"].sort.each do |f|
7
+ require File.expand_path(f)
8
+ end
9
+
10
+ before(:all) do
11
+ @model = DynamoidSimple
12
+ end
13
+
14
+ describe "instance methods" do
15
+ let(:model) {@model.new}
16
+
17
+ it "should respond to aasm persistence methods" do
18
+ expect(model).to respond_to(:aasm_read_state)
19
+ expect(model).to respond_to(:aasm_write_state)
20
+ expect(model).to respond_to(:aasm_write_state_without_persistence)
21
+ end
22
+
23
+ it "should return the initial state when new and the aasm field is nil" do
24
+ expect(model.aasm.current_state).to eq(:alpha)
25
+ end
26
+
27
+ it "should save the initial state" do
28
+ model.save
29
+ expect(model.status).to eq("alpha")
30
+ end
31
+
32
+ it "should return the aasm column when new and the aasm field is not nil" do
33
+ model.status = "beta"
34
+ expect(model.aasm.current_state).to eq(:beta)
35
+ end
36
+
37
+ it "should return the aasm column when not new and the aasm_column is not nil" do
38
+ model.save
39
+ model.status = "gamma"
40
+ expect(model.aasm.current_state).to eq(:gamma)
41
+ end
42
+
43
+ it "should allow a nil state" do
44
+ model.save
45
+ model.status = nil
46
+ expect(model.aasm.current_state).to be_nil
47
+ end
48
+
49
+ it "should not change the state if state is not loaded" do
50
+ model.release
51
+ model.save
52
+ model.reload
53
+ expect(model.aasm.current_state).to eq(:beta)
54
+ end
55
+ end
56
+
57
+ describe 'subclasses' do
58
+ it "should have the same states as its parent class" do
59
+ expect(Class.new(@model).aasm.states).to eq(@model.aasm.states)
60
+ end
61
+
62
+ it "should have the same events as its parent class" do
63
+ expect(Class.new(@model).aasm.events).to eq(@model.aasm.events)
64
+ end
65
+
66
+ it "should have the same column as its parent even for the new dsl" do
67
+ expect(@model.aasm.attribute_name).to eq(:status)
68
+ expect(Class.new(@model).aasm.attribute_name).to eq(:status)
69
+ end
70
+ end
71
+
72
+ describe 'initial states' do
73
+ it 'should support conditions' do
74
+ @model.aasm do
75
+ initial_state lambda{ |m| m.default }
76
+ end
77
+
78
+ expect(@model.new(:default => :beta).aasm.current_state).to eq(:beta)
79
+ expect(@model.new(:default => :gamma).aasm.current_state).to eq(:gamma)
80
+ end
81
+ end
82
+
83
+ end
84
+ end
@@ -0,0 +1,200 @@
1
+ require 'spec_helper'
2
+
3
+ if defined?(Mongoid::Document)
4
+ describe 'mongoid' do
5
+
6
+ Dir[File.dirname(__FILE__) + "/../../models/mongoid/*.rb"].sort.each do |f|
7
+ require File.expand_path(f)
8
+ end
9
+
10
+ before(:all) do
11
+ # if you want to see the statements while running the spec enable the following line
12
+ # Mongoid.logger = Logger.new(STDERR)
13
+ end
14
+
15
+ after do
16
+ Mongoid.purge!
17
+ end
18
+
19
+ describe "named scopes with the old DSL" do
20
+
21
+ context "Does not already respond_to? the scope name" do
22
+ it "should add a scope for each state" do
23
+ expect(SimpleMongoidMultiple).to respond_to(:unknown_scope)
24
+ expect(SimpleMongoidMultiple).to respond_to(:another_unknown_scope)
25
+
26
+ expect(SimpleMongoidMultiple.unknown_scope.class).to eq(Mongoid::Criteria)
27
+ expect(SimpleMongoidMultiple.another_unknown_scope.class).to eq(Mongoid::Criteria)
28
+ end
29
+ end
30
+
31
+ context "Already respond_to? the scope name" do
32
+ it "should not add a scope" do
33
+ expect(SimpleMongoidMultiple).to respond_to(:new)
34
+ expect(SimpleMongoidMultiple.new.class).to eq(SimpleMongoidMultiple)
35
+ end
36
+ end
37
+
38
+ end
39
+
40
+ describe "named scopes with the new DSL" do
41
+ context "Does not already respond_to? the scope name" do
42
+ it "should add a scope" do
43
+ expect(SimpleNewDslMongoidMultiple).to respond_to(:unknown_scope)
44
+ expect(SimpleNewDslMongoidMultiple.unknown_scope.class).to eq(Mongoid::Criteria)
45
+ end
46
+ end
47
+
48
+ context "Already respond_to? the scope name" do
49
+ it "should not add a scope" do
50
+ expect(SimpleNewDslMongoidMultiple).to respond_to(:new)
51
+ expect(SimpleNewDslMongoidMultiple.new.class).to eq(SimpleNewDslMongoidMultiple)
52
+ end
53
+ end
54
+
55
+ it "does not create scopes if requested" do
56
+ expect(NoScopeMongoidMultiple).not_to respond_to(:ignored_scope)
57
+ end
58
+ end
59
+
60
+ describe "instance methods" do
61
+ let(:simple) {SimpleNewDslMongoidMultiple.new}
62
+
63
+ it "should initialize the aasm state on instantiation" do
64
+ expect(SimpleNewDslMongoidMultiple.new.status).to eql 'unknown_scope'
65
+ expect(SimpleNewDslMongoidMultiple.new.aasm(:left).current_state).to eql :unknown_scope
66
+ end
67
+
68
+ end
69
+
70
+ describe 'transitions with persistence' do
71
+
72
+ it "should work for valid models" do
73
+ valid_object = MultipleValidatorMongoid.create(:name => 'name')
74
+ expect(valid_object).to be_sleeping
75
+ valid_object.status = :running
76
+ expect(valid_object).to be_running
77
+ end
78
+
79
+ it 'should not store states for invalid models' do
80
+ validator = MultipleValidatorMongoid.create(:name => 'name')
81
+ expect(validator).to be_valid
82
+ expect(validator).to be_sleeping
83
+
84
+ validator.name = nil
85
+ expect(validator).not_to be_valid
86
+ expect { validator.run! }.to raise_error(Mongoid::Errors::Validations)
87
+ expect(validator).to be_sleeping
88
+
89
+ validator.reload
90
+ expect(validator).not_to be_running
91
+ expect(validator).to be_sleeping
92
+
93
+ validator.name = 'another name'
94
+ expect(validator).to be_valid
95
+ expect(validator.run!).to be_truthy
96
+ expect(validator).to be_running
97
+
98
+ validator.reload
99
+ expect(validator).to be_running
100
+ expect(validator).not_to be_sleeping
101
+ end
102
+
103
+ it 'should not store states for invalid models silently if configured' do
104
+ validator = MultipleSilentPersistorMongoid.create(:name => 'name')
105
+ expect(validator).to be_valid
106
+ expect(validator).to be_sleeping
107
+
108
+ validator.name = nil
109
+ expect(validator).not_to be_valid
110
+ expect(validator.run!).to be_falsey
111
+ expect(validator).to be_sleeping
112
+
113
+ validator.reload
114
+ expect(validator).not_to be_running
115
+ expect(validator).to be_sleeping
116
+
117
+ validator.name = 'another name'
118
+ expect(validator).to be_valid
119
+ expect(validator.run!).to be_truthy
120
+ expect(validator).to be_running
121
+
122
+ validator.reload
123
+ expect(validator).to be_running
124
+ expect(validator).not_to be_sleeping
125
+ end
126
+
127
+ it 'should store states for invalid models if configured' do
128
+ persistor = MultipleInvalidPersistorMongoid.create(:name => 'name')
129
+ expect(persistor).to be_valid
130
+ expect(persistor).to be_sleeping
131
+
132
+ persistor.name = nil
133
+ expect(persistor).not_to be_valid
134
+ expect(persistor.run!).to be_truthy
135
+ expect(persistor).to be_running
136
+
137
+ persistor = MultipleInvalidPersistorMongoid.find(persistor.id)
138
+ persistor.valid?
139
+ expect(persistor).to be_valid
140
+ expect(persistor).to be_running
141
+ expect(persistor).not_to be_sleeping
142
+
143
+ persistor.reload
144
+ expect(persistor).to be_running
145
+ expect(persistor).not_to be_sleeping
146
+ end
147
+ end
148
+
149
+ describe "complex example" do
150
+ it "works" do
151
+ record = ComplexMongoidExample.new
152
+ expect_aasm_states record, :one, :alpha
153
+
154
+ record.save!
155
+ expect_aasm_states record, :one, :alpha
156
+ record.reload
157
+ expect_aasm_states record, :one, :alpha
158
+
159
+ record.increment!
160
+ expect_aasm_states record, :two, :alpha
161
+ record.reload
162
+ expect_aasm_states record, :two, :alpha
163
+
164
+ record.level_up!
165
+ expect_aasm_states record, :two, :beta
166
+ record.reload
167
+ expect_aasm_states record, :two, :beta
168
+
169
+ record.increment!
170
+ expect { record.increment! }.to raise_error(AASM::InvalidTransition)
171
+ expect_aasm_states record, :three, :beta
172
+ record.reload
173
+ expect_aasm_states record, :three, :beta
174
+
175
+ record.level_up!
176
+ expect_aasm_states record, :three, :gamma
177
+ record.reload
178
+ expect_aasm_states record, :three, :gamma
179
+
180
+ record.level_down # without saving
181
+ expect_aasm_states record, :three, :beta
182
+ record.reload
183
+ expect_aasm_states record, :three, :gamma
184
+
185
+ record.level_down # without saving
186
+ expect_aasm_states record, :three, :beta
187
+ record.reset!
188
+ expect_aasm_states record, :one, :beta
189
+ end
190
+
191
+ def expect_aasm_states(record, left_state, right_state)
192
+ expect(record.aasm(:left).current_state).to eql left_state.to_sym
193
+ expect(record.left).to eql left_state.to_s
194
+ expect(record.aasm(:right).current_state).to eql right_state.to_sym
195
+ expect(record.right).to eql right_state.to_s
196
+ end
197
+ end
198
+
199
+ end
200
+ end
@@ -0,0 +1,165 @@
1
+ require 'spec_helper'
2
+
3
+ if defined?(Mongoid::Document)
4
+ describe 'mongoid' do
5
+
6
+ Dir[File.dirname(__FILE__) + "/../../models/mongoid/*.rb"].sort.each do |f|
7
+ require File.expand_path(f)
8
+ end
9
+
10
+ before(:all) do
11
+ # if you want to see the statements while running the spec enable the following line
12
+ # Mongoid.logger = Logger.new(STDERR)
13
+ end
14
+
15
+ after do
16
+ Mongoid.purge!
17
+ end
18
+
19
+ describe "named scopes with the old DSL" do
20
+
21
+ context "Does not already respond_to? the scope name" do
22
+ it "should add a scope for each state" do
23
+ expect(SimpleMongoid).to respond_to(:unknown_scope)
24
+ expect(SimpleMongoid).to respond_to(:another_unknown_scope)
25
+
26
+ expect(SimpleMongoid.unknown_scope.class).to eq(Mongoid::Criteria)
27
+ expect(SimpleMongoid.another_unknown_scope.class).to eq(Mongoid::Criteria)
28
+ end
29
+ end
30
+
31
+ context "Already respond_to? the scope name" do
32
+ it "should not add a scope" do
33
+ expect(SimpleMongoid).to respond_to(:new)
34
+ expect(SimpleMongoid.new.class).to eq(SimpleMongoid)
35
+ end
36
+ end
37
+
38
+ end
39
+
40
+ describe "named scopes with the new DSL" do
41
+
42
+ context "Does not already respond_to? the scope name" do
43
+ it "should add a scope" do
44
+ expect(SimpleNewDslMongoid).to respond_to(:unknown_scope)
45
+ expect(SimpleNewDslMongoid.unknown_scope.class).to eq(Mongoid::Criteria)
46
+ end
47
+ end
48
+
49
+ context "Already respond_to? the scope name" do
50
+ it "should not add a scope" do
51
+ expect(SimpleNewDslMongoid).to respond_to(:new)
52
+ expect(SimpleNewDslMongoid.new.class).to eq(SimpleNewDslMongoid)
53
+ end
54
+ end
55
+
56
+ it "does not create scopes if requested" do
57
+ expect(NoScopeMongoid).not_to respond_to(:ignored_scope)
58
+ end
59
+
60
+ end
61
+
62
+ describe "instance methods" do
63
+ let(:simple) {SimpleNewDslMongoid.new}
64
+
65
+ it "should initialize the aasm state on instantiation" do
66
+ expect(SimpleNewDslMongoid.new.status).to eql 'unknown_scope'
67
+ expect(SimpleNewDslMongoid.new.aasm.current_state).to eql :unknown_scope
68
+ end
69
+
70
+ end
71
+
72
+ describe "relations object" do
73
+
74
+ it "should load relations object ids" do
75
+ parent = Parent.create
76
+ child_1 = Child.create(parent_id: parent.id)
77
+ child_2 = Child.create(parent_id: parent.id)
78
+ expect(parent.child_ids).to eql [child_1.id, child_2.id]
79
+ end
80
+
81
+ end
82
+
83
+ describe 'transitions with persistence' do
84
+
85
+ it 'should work for valid models' do
86
+ valid_object = ValidatorMongoid.create(:name => 'name')
87
+ expect(valid_object).to be_sleeping
88
+ valid_object.status = :running
89
+ expect(valid_object).to be_running
90
+ end
91
+
92
+ it 'should not store states for invalid models' do
93
+ validator = ValidatorMongoid.create(:name => 'name')
94
+ expect(validator).to be_valid
95
+ expect(validator).to be_sleeping
96
+
97
+ validator.name = nil
98
+ expect(validator).not_to be_valid
99
+ expect { validator.run! }.to raise_error(Mongoid::Errors::Validations)
100
+ expect(validator).to be_sleeping
101
+
102
+ validator.reload
103
+ expect(validator).not_to be_running
104
+ expect(validator).to be_sleeping
105
+
106
+ validator.name = 'another name'
107
+ expect(validator).to be_valid
108
+ expect(validator.run!).to be_truthy
109
+ expect(validator).to be_running
110
+
111
+ validator.reload
112
+ expect(validator).to be_running
113
+ expect(validator).not_to be_sleeping
114
+ end
115
+
116
+ it 'should not store states for invalid models silently if configured' do
117
+ validator = SilentPersistorMongoid.create(:name => 'name')
118
+ expect(validator).to be_valid
119
+ expect(validator).to be_sleeping
120
+
121
+ validator.name = nil
122
+ expect(validator).not_to be_valid
123
+ expect(validator.run!).to be_falsey
124
+ expect(validator).to be_sleeping
125
+
126
+ validator.reload
127
+ expect(validator).not_to be_running
128
+ expect(validator).to be_sleeping
129
+
130
+ validator.name = 'another name'
131
+ expect(validator).to be_valid
132
+ expect(validator.run!).to be_truthy
133
+ expect(validator).to be_running
134
+
135
+ validator.reload
136
+ expect(validator).to be_running
137
+ expect(validator).not_to be_sleeping
138
+ end
139
+
140
+ it 'should store states for invalid models if configured' do
141
+ persistor = InvalidPersistorMongoid.create(:name => 'name')
142
+ expect(persistor).to be_valid
143
+ expect(persistor).to be_sleeping
144
+
145
+ persistor.name = nil
146
+
147
+ expect(persistor).not_to be_valid
148
+ expect(persistor.run!).to be_truthy
149
+ expect(persistor).to be_running
150
+
151
+ persistor = InvalidPersistorMongoid.find(persistor.id)
152
+
153
+ persistor.valid?
154
+ expect(persistor).to be_valid
155
+ expect(persistor).to be_running
156
+ expect(persistor).not_to be_sleeping
157
+
158
+ persistor.reload
159
+ expect(persistor).to be_running
160
+ expect(persistor).not_to be_sleeping
161
+ end
162
+ end
163
+
164
+ end
165
+ end