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,189 @@
1
+ require 'spec_helper'
2
+
3
+ describe AASM::Core::Invoker do
4
+ let(:target) { nil }
5
+ let(:record) { double }
6
+ let(:args) { [] }
7
+
8
+ subject { described_class.new(target, record, args) }
9
+
10
+ describe '#with_options' do
11
+ context 'when passing array as a subject' do
12
+ context 'and "guard" option is set to true' do
13
+ let(:target) { [subject_1, subject_2] }
14
+
15
+ before { subject.with_options(guard: true) }
16
+
17
+ context 'and all the subjects are truthy' do
18
+ let(:subject_1) { Proc.new { true } }
19
+ let(:subject_2) { Proc.new { true } }
20
+
21
+ it 'then returns "true" while invoking' do
22
+ expect(subject.invoke).to eq(true)
23
+ end
24
+ end
25
+
26
+ context 'and any subject is falsely' do
27
+ let(:subject_1) { Proc.new { false } }
28
+ let(:subject_2) { Proc.new { true } }
29
+
30
+ it 'then returns "false" while invoking' do
31
+ expect(subject.invoke).to eq(false)
32
+ end
33
+ end
34
+ end
35
+
36
+ context 'and "unless" option is set to true' do
37
+ let(:target) { [subject_1, subject_2] }
38
+
39
+ before { subject.with_options(unless: true) }
40
+
41
+ context 'and all the subjects are falsely' do
42
+ let(:subject_1) { Proc.new { false } }
43
+ let(:subject_2) { Proc.new { false } }
44
+
45
+ it 'then returns "true" while invoking' do
46
+ expect(subject.invoke).to eq(true)
47
+ end
48
+ end
49
+
50
+ context 'and any subject is truthy' do
51
+ let(:subject_1) { Proc.new { false } }
52
+ let(:subject_2) { Proc.new { true } }
53
+
54
+ it 'then returns "false" while invoking' do
55
+ expect(subject.invoke).to eq(false)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+ describe '#with_failures' do
63
+ let(:concrete_invoker) { AASM::Core::Invokers::ProcInvoker }
64
+ let(:target) { Proc.new {} }
65
+
66
+ it 'then sets failures buffer for concrete invokers' do
67
+ expect_any_instance_of(concrete_invoker)
68
+ .to receive(:with_failures)
69
+ .and_call_original
70
+
71
+ subject.invoke
72
+ end
73
+ end
74
+
75
+ describe '#with_default_return_value' do
76
+ context 'when return value is "true"' do
77
+ before { subject.with_default_return_value(true) }
78
+
79
+ it 'then returns "true" when was not picked up by any invoker' do
80
+ expect(subject.invoke).to eq(true)
81
+ end
82
+ end
83
+
84
+ context 'when return value is "false"' do
85
+ before { subject.with_default_return_value(false) }
86
+
87
+ it 'then returns "false" when was not picked up by any invoker' do
88
+ expect(subject.invoke).to eq(false)
89
+ end
90
+ end
91
+ end
92
+
93
+ describe '#invoke' do
94
+ context 'when subject is a proc' do
95
+ let(:concrete_invoker) { AASM::Core::Invokers::ProcInvoker }
96
+ let(:target) { Proc.new {} }
97
+
98
+ it 'then calls proc invoker' do
99
+ expect_any_instance_of(concrete_invoker)
100
+ .to receive(:invoke)
101
+ .and_call_original
102
+
103
+ expect(record).to receive(:instance_exec)
104
+
105
+ subject.invoke
106
+ end
107
+ end
108
+
109
+ context 'when subject is a class' do
110
+ let(:concrete_invoker) { AASM::Core::Invokers::ClassInvoker }
111
+ let(:target) { Class.new { def call; end } }
112
+
113
+ it 'then calls proc invoker' do
114
+ expect_any_instance_of(concrete_invoker)
115
+ .to receive(:invoke)
116
+ .and_call_original
117
+
118
+ expect_any_instance_of(target).to receive(:call)
119
+
120
+ subject.invoke
121
+ end
122
+ end
123
+
124
+ context 'when subject is a literal' do
125
+ let(:concrete_invoker) { AASM::Core::Invokers::LiteralInvoker }
126
+ let(:record) { double(invoke_me: nil) }
127
+ let(:target) { :invoke_me }
128
+
129
+ it 'then calls literal invoker' do
130
+ expect_any_instance_of(concrete_invoker)
131
+ .to receive(:invoke)
132
+ .and_call_original
133
+
134
+ expect(record).to receive(:invoke_me)
135
+
136
+ subject.invoke
137
+ end
138
+ end
139
+
140
+ context 'when subject is an array of procs' do
141
+ let(:subject_1) { Proc.new {} }
142
+ let(:subject_2) { Proc.new {} }
143
+ let(:target) { [subject_1, subject_2] }
144
+
145
+ it 'then calls each proc' do
146
+ expect(record).to receive(:instance_exec).twice
147
+
148
+ subject.invoke
149
+ end
150
+ end
151
+
152
+ context 'when subject is an array of classes' do
153
+ let(:subject_1) { Class.new { def call; end } }
154
+ let(:subject_2) { Class.new { def call; end } }
155
+ let(:target) { [subject_1, subject_2] }
156
+
157
+ it 'then calls each class' do
158
+ expect_any_instance_of(subject_1).to receive(:call)
159
+
160
+ expect_any_instance_of(subject_2).to receive(:call)
161
+
162
+ subject.invoke
163
+ end
164
+ end
165
+
166
+ context 'when subject is an array of literals' do
167
+ let(:subject_1) { :method_one }
168
+ let(:subject_2) { :method_two }
169
+ let(:record) { double(method_one: nil, method_two: nil) }
170
+ let(:target) { [subject_1, subject_2] }
171
+
172
+ it 'then calls each class' do
173
+ expect(record).to receive(:method_one)
174
+
175
+ expect(record).to receive(:method_two)
176
+
177
+ subject.invoke
178
+ end
179
+ end
180
+
181
+ context 'when subject is not supported' do
182
+ let(:target) { nil }
183
+
184
+ it 'then just returns default value' do
185
+ expect(subject.invoke).to eq(described_class::DEFAULT_RETURN_VALUE)
186
+ end
187
+ end
188
+ end
189
+ end
@@ -0,0 +1,72 @@
1
+ require 'spec_helper'
2
+
3
+ describe AASM::Core::Invokers::BaseInvoker do
4
+ let(:target) { double }
5
+ let(:record) { double }
6
+ let(:args) { [] }
7
+
8
+ subject { described_class.new(target, record, args) }
9
+
10
+ describe '#may_invoke?' do
11
+ it 'then raises NoMethodError' do
12
+ expect { subject.may_invoke? }.to raise_error(NoMethodError)
13
+ end
14
+ end
15
+
16
+ describe '#log_failure' do
17
+ it 'then raises NoMethodError' do
18
+ expect { subject.log_failure }.to raise_error(NoMethodError)
19
+ end
20
+ end
21
+
22
+ describe '#invoke_subject' do
23
+ it 'then raises NoMethodError' do
24
+ expect { subject.log_failure }.to raise_error(NoMethodError)
25
+ end
26
+ end
27
+
28
+ describe '#with_failures' do
29
+ it 'then sets failures buffer' do
30
+ buffer = [1, 2, 3]
31
+ subject.with_failures(buffer)
32
+
33
+ expect(subject.failures).to eq(buffer)
34
+ end
35
+ end
36
+
37
+ describe '#invoke' do
38
+ context 'when #may_invoke? respond with "false"' do
39
+ before { allow(subject).to receive(:may_invoke?).and_return(false) }
40
+
41
+ it 'then returns "nil"' do
42
+ expect(subject.invoke).to eq(nil)
43
+ end
44
+ end
45
+
46
+ context 'when #invoke_subject respond with "false"' do
47
+ before do
48
+ allow(subject).to receive(:may_invoke?).and_return(true)
49
+ allow(subject).to receive(:invoke_subject).and_return(false)
50
+ end
51
+
52
+ it 'then calls #log_failure' do
53
+ expect(subject).to receive(:log_failure)
54
+
55
+ subject.invoke
56
+ end
57
+ end
58
+
59
+ context 'when #invoke_subject succeed' do
60
+ before do
61
+ allow(subject).to receive(:may_invoke?).and_return(true)
62
+ allow(subject).to receive(:invoke_subject).and_return(true)
63
+ end
64
+
65
+ it 'then returns result' do
66
+ expect(subject).to receive(:result)
67
+
68
+ subject.invoke
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,95 @@
1
+ require 'spec_helper'
2
+
3
+ describe AASM::Core::Invokers::ClassInvoker do
4
+ let(:target) { Class.new { def call; end } }
5
+ let(:record) { double }
6
+ let(:args) { [] }
7
+
8
+ subject { described_class.new(target, record, args) }
9
+
10
+ describe '#may_invoke?' do
11
+ context 'when subject is a Class and responds to #call' do
12
+ it 'then returns "true"' do
13
+ expect(subject.may_invoke?).to eq(true)
14
+ end
15
+ end
16
+
17
+ context 'when subject is not a class or not respond to #call' do
18
+ let(:target) { Class.new {} }
19
+
20
+ it 'then returns "false"' do
21
+ expect(subject.may_invoke?).to eq(false)
22
+ end
23
+ end
24
+ end
25
+
26
+ describe '#log_failure' do
27
+ context 'when subject respond to #source_location' do
28
+ it 'then adds "source_location" to a failures buffer' do
29
+ subject.log_failure
30
+
31
+ expect(subject.failures)
32
+ .to eq([target.instance_method(:call).source_location.join('#')])
33
+ end
34
+ end
35
+
36
+ context 'when subject does not respond to #source_location' do
37
+ before do
38
+ Method.__send__(:alias_method, :original_source_location, :source_location)
39
+ Method.__send__(:undef_method, :source_location)
40
+ end
41
+
42
+ after do
43
+ Method.__send__(
44
+ :define_method,
45
+ :source_location,
46
+ Method.instance_method(:original_source_location)
47
+ )
48
+ end
49
+
50
+ it 'then adds the subject to a failures buffer' do
51
+ subject.log_failure
52
+
53
+ expect(subject.failures.first).to be_a(Method)
54
+ end
55
+ end
56
+ end
57
+
58
+ describe '#invoke_subject' do
59
+ context 'when passing no arguments' do
60
+ let(:args) { [1, 2 ,3] }
61
+ let(:target) { Class.new { def call; end } }
62
+
63
+ it 'then correctly uses passed arguments' do
64
+ expect { subject.invoke_subject }.not_to raise_error
65
+ end
66
+ end
67
+
68
+ context 'when passing single argument' do
69
+ let(:args) { [1, 2 ,3, 4, 5, 6] }
70
+ let(:target) { Class.new { def initialize(_a); end; def call; end } }
71
+
72
+ it 'then correctly uses passed arguments' do
73
+ expect { subject.invoke_subject }.not_to raise_error
74
+ end
75
+ end
76
+
77
+ context 'when passing variable number arguments' do
78
+ let(:args) { [1, 2 ,3, 4, 5, 6] }
79
+ let(:target) { Class.new { def initialize(_a, _b, *_c); end; def call; end } }
80
+
81
+ it 'then correctly uses passed arguments' do
82
+ expect { subject.invoke_subject }.not_to raise_error
83
+ end
84
+ end
85
+
86
+ context 'when passing one or more arguments' do
87
+ let(:args) { [1, 2 ,3, 4, 5, 6] }
88
+ let(:target) { Class.new { def initialize(_a, _b, _c); end; def call; end } }
89
+
90
+ it 'then correctly uses passed arguments' do
91
+ expect { subject.invoke_subject }.not_to raise_error
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,86 @@
1
+ require 'spec_helper'
2
+
3
+ describe AASM::Core::Invokers::LiteralInvoker do
4
+ let(:target) { nil }
5
+ let(:record) { double }
6
+ let(:args) { [] }
7
+
8
+ subject { described_class.new(target, record, args) }
9
+
10
+ describe '#may_invoke?' do
11
+ context 'when subject is a Symbol' do
12
+ let(:target) { :i_am_symbol }
13
+
14
+ it 'then returns "true"' do
15
+ expect(subject.may_invoke?).to eq(true)
16
+ end
17
+ end
18
+
19
+ context 'when subject is a String' do
20
+ let(:target) { 'i_am_string' }
21
+
22
+ it 'then returns "true"' do
23
+ expect(subject.may_invoke?).to eq(true)
24
+ end
25
+ end
26
+
27
+ context 'when subject is neither a String nor Symbol' do
28
+ let(:target) { double }
29
+
30
+ it 'then returns "false"' do
31
+ expect(subject.may_invoke?).to eq(false)
32
+ end
33
+ end
34
+ end
35
+
36
+ describe '#log_failure' do
37
+ let(:target) { Proc.new { false } }
38
+
39
+ it 'then adds the subject to a failures buffer' do
40
+ subject.log_failure
41
+
42
+ expect(subject.failures).to eq([target])
43
+ end
44
+ end
45
+
46
+ describe '#invoke_subject' do
47
+ context 'when passing no arguments' do
48
+ let(:record) { Class.new { def my_method; end }.new }
49
+ let(:args) { [1, 2 ,3] }
50
+ let(:target) { :my_method }
51
+
52
+ it 'then correctly uses passed arguments' do
53
+ expect { subject.invoke_subject }.not_to raise_error
54
+ end
55
+ end
56
+
57
+ context 'when passing variable number arguments' do
58
+ let(:record) { Class.new { def my_method(_a, _b, *_c); end }.new }
59
+ let(:args) { [1, 2 ,3, 4, 5, 6] }
60
+ let(:target) { :my_method }
61
+
62
+ it 'then correctly uses passed arguments' do
63
+ expect { subject.invoke_subject }.not_to raise_error
64
+ end
65
+ end
66
+
67
+ context 'when passing one or more arguments' do
68
+ let(:record) { Class.new { def my_method(_a, _b, _c); end }.new }
69
+ let(:args) { [1, 2 ,3, 4, 5, 6] }
70
+ let(:target) { :my_method }
71
+
72
+ it 'then correctly uses passed arguments' do
73
+ expect { subject.invoke_subject }.not_to raise_error
74
+ end
75
+ end
76
+
77
+ context 'when record does not respond to subject' do
78
+ let(:record) { Class.new { }.new }
79
+ let(:target) { :my_method }
80
+
81
+ it 'then raises uses passed arguments' do
82
+ expect { subject.invoke_subject }.to raise_error(NoMethodError)
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,86 @@
1
+ require 'spec_helper'
2
+
3
+ describe AASM::Core::Invokers::ProcInvoker do
4
+ let(:target) { Proc.new {} }
5
+ let(:record) { double }
6
+ let(:args) { [] }
7
+
8
+ subject { described_class.new(target, record, args) }
9
+
10
+ describe '#may_invoke?' do
11
+ context 'when subject is a Proc' do
12
+ it 'then returns "true"' do
13
+ expect(subject.may_invoke?).to eq(true)
14
+ end
15
+ end
16
+
17
+ context 'when subject is not a Proc' do
18
+ let(:target) { nil }
19
+
20
+ it 'then returns "false"' do
21
+ expect(subject.may_invoke?).to eq(false)
22
+ end
23
+ end
24
+ end
25
+
26
+ describe '#log_failure' do
27
+ context 'when subject respond to #source_location' do
28
+ it 'then adds "source_location" to a failures buffer' do
29
+ subject.log_failure
30
+
31
+ expect(subject.failures)
32
+ .to eq([target.source_location.join('#')])
33
+ end
34
+ end
35
+
36
+ context 'when subject does not respond to #source_location' do
37
+ before do
38
+ Method.__send__(:alias_method, :original_source_location, :source_location)
39
+ Method.__send__(:undef_method, :source_location)
40
+ end
41
+
42
+ after do
43
+ Method.__send__(
44
+ :define_method,
45
+ :source_location,
46
+ Method.instance_method(:original_source_location)
47
+ )
48
+ end
49
+
50
+ it 'then adds the subject to a failures buffer' do
51
+ subject.log_failure
52
+
53
+ expect(subject.failures).to eq([target])
54
+ end
55
+ end
56
+ end
57
+
58
+ describe '#invoke_subject' do
59
+ context 'when passing no arguments' do
60
+ let(:args) { [1, 2 ,3] }
61
+ let(:target) { ->() {} }
62
+
63
+ it 'then correctly uses passed arguments' do
64
+ expect { subject.invoke_subject }.not_to raise_error
65
+ end
66
+ end
67
+
68
+ context 'when passing variable number arguments' do
69
+ let(:args) { [1, 2 ,3, 4, 5, 6] }
70
+ let(:target) { ->(_a, _b, *_c) {} }
71
+
72
+ it 'then correctly uses passed arguments' do
73
+ expect { subject.invoke_subject }.not_to raise_error
74
+ end
75
+ end
76
+
77
+ context 'when passing one or more arguments' do
78
+ let(:args) { [1, 2 ,3, 4, 5, 6] }
79
+ let(:target) { ->(_a, _b, _c) {} }
80
+
81
+ it 'then correctly uses passed arguments' do
82
+ expect { subject.invoke_subject }.not_to raise_error
83
+ end
84
+ end
85
+ end
86
+ end