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