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.
- checksums.yaml +7 -0
- data/.document +6 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +27 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- data/.gitignore +20 -0
- data/.travis.yml +100 -0
- data/API +34 -0
- data/Appraisals +71 -0
- data/CHANGELOG.md +431 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/CONTRIBUTING.md +24 -0
- data/Dockerfile +44 -0
- data/Gemfile +6 -0
- data/Gemfile.lock_old +151 -0
- data/HOWTO +12 -0
- data/LICENSE +20 -0
- data/PLANNED_CHANGES.md +11 -0
- data/README.md +1439 -0
- data/README_FROM_VERSION_3_TO_4.md +240 -0
- data/Rakefile +31 -0
- data/TESTING.md +25 -0
- data/aasm.gemspec +37 -0
- data/callbacks.txt +51 -0
- data/docker-compose.yml +40 -0
- data/gemfiles/norails.gemfile +10 -0
- data/gemfiles/rails_3.2.gemfile +14 -0
- data/gemfiles/rails_4.2.gemfile +16 -0
- data/gemfiles/rails_4.2_mongoid_5.gemfile +11 -0
- data/gemfiles/rails_4.2_nobrainer.gemfile +9 -0
- data/gemfiles/rails_5.0.gemfile +13 -0
- data/gemfiles/rails_5.0_nobrainer.gemfile +9 -0
- data/gemfiles/rails_5.1.gemfile +13 -0
- data/gemfiles/rails_5.2.gemfile +13 -0
- data/lib/aasm.rb +23 -0
- data/lib/aasm/aasm.rb +208 -0
- data/lib/aasm/base.rb +271 -0
- data/lib/aasm/configuration.rb +45 -0
- data/lib/aasm/core/event.rb +172 -0
- data/lib/aasm/core/invoker.rb +129 -0
- data/lib/aasm/core/invokers/base_invoker.rb +75 -0
- data/lib/aasm/core/invokers/class_invoker.rb +52 -0
- data/lib/aasm/core/invokers/literal_invoker.rb +47 -0
- data/lib/aasm/core/invokers/proc_invoker.rb +59 -0
- data/lib/aasm/core/state.rb +90 -0
- data/lib/aasm/core/transition.rb +83 -0
- data/lib/aasm/dsl_helper.rb +30 -0
- data/lib/aasm/errors.rb +21 -0
- data/lib/aasm/instance_base.rb +133 -0
- data/lib/aasm/localizer.rb +54 -0
- data/lib/aasm/minitest.rb +5 -0
- data/lib/aasm/minitest/allow_event.rb +13 -0
- data/lib/aasm/minitest/allow_transition_to.rb +13 -0
- data/lib/aasm/minitest/have_state.rb +13 -0
- data/lib/aasm/minitest/transition_from.rb +21 -0
- data/lib/aasm/minitest_spec.rb +15 -0
- data/lib/aasm/persistence.rb +54 -0
- data/lib/aasm/persistence/active_record_persistence.rb +165 -0
- data/lib/aasm/persistence/base.rb +78 -0
- data/lib/aasm/persistence/core_data_query_persistence.rb +94 -0
- data/lib/aasm/persistence/dynamoid_persistence.rb +92 -0
- data/lib/aasm/persistence/mongoid_persistence.rb +126 -0
- data/lib/aasm/persistence/no_brainer_persistence.rb +105 -0
- data/lib/aasm/persistence/orm.rb +150 -0
- data/lib/aasm/persistence/plain_persistence.rb +26 -0
- data/lib/aasm/persistence/redis_persistence.rb +112 -0
- data/lib/aasm/persistence/sequel_persistence.rb +83 -0
- data/lib/aasm/rspec.rb +5 -0
- data/lib/aasm/rspec/allow_event.rb +26 -0
- data/lib/aasm/rspec/allow_transition_to.rb +26 -0
- data/lib/aasm/rspec/have_state.rb +22 -0
- data/lib/aasm/rspec/transition_from.rb +36 -0
- data/lib/aasm/state_machine.rb +53 -0
- data/lib/aasm/state_machine_store.rb +76 -0
- data/lib/aasm/version.rb +3 -0
- data/lib/generators/aasm/aasm_generator.rb +16 -0
- data/lib/generators/aasm/orm_helpers.rb +41 -0
- data/lib/generators/active_record/aasm_generator.rb +40 -0
- data/lib/generators/active_record/templates/migration.rb +8 -0
- data/lib/generators/active_record/templates/migration_existing.rb +5 -0
- data/lib/generators/mongoid/aasm_generator.rb +28 -0
- data/lib/generators/nobrainer/aasm_generator.rb +28 -0
- data/lib/motion-aasm.rb +37 -0
- data/spec/database.rb +59 -0
- data/spec/database.yml +3 -0
- data/spec/en.yml +12 -0
- data/spec/en_deprecated_style.yml +10 -0
- data/spec/generators/active_record_generator_spec.rb +53 -0
- data/spec/generators/mongoid_generator_spec.rb +31 -0
- data/spec/generators/no_brainer_generator_spec.rb +29 -0
- data/spec/models/active_record/basic_active_record_two_state_machines_example.rb +25 -0
- data/spec/models/active_record/complex_active_record_example.rb +37 -0
- data/spec/models/active_record/derivate_new_dsl.rb +7 -0
- data/spec/models/active_record/false_state.rb +35 -0
- data/spec/models/active_record/gate.rb +39 -0
- data/spec/models/active_record/instance_level_skip_validation_example.rb +19 -0
- data/spec/models/active_record/invalid_persistor.rb +29 -0
- data/spec/models/active_record/localizer_test_model.rb +34 -0
- data/spec/models/active_record/no_direct_assignment.rb +21 -0
- data/spec/models/active_record/no_scope.rb +21 -0
- data/spec/models/active_record/persisted_state.rb +12 -0
- data/spec/models/active_record/person.rb +23 -0
- data/spec/models/active_record/provided_and_persisted_state.rb +24 -0
- data/spec/models/active_record/reader.rb +7 -0
- data/spec/models/active_record/readme_job.rb +21 -0
- data/spec/models/active_record/silent_persistor.rb +29 -0
- data/spec/models/active_record/simple_new_dsl.rb +32 -0
- data/spec/models/active_record/thief.rb +29 -0
- data/spec/models/active_record/transactor.rb +124 -0
- data/spec/models/active_record/transient.rb +6 -0
- data/spec/models/active_record/validator.rb +118 -0
- data/spec/models/active_record/with_enum.rb +39 -0
- data/spec/models/active_record/with_enum_without_column.rb +38 -0
- data/spec/models/active_record/with_false_enum.rb +31 -0
- data/spec/models/active_record/with_true_enum.rb +39 -0
- data/spec/models/active_record/work.rb +3 -0
- data/spec/models/active_record/worker.rb +2 -0
- data/spec/models/active_record/writer.rb +6 -0
- data/spec/models/basic_two_state_machines_example.rb +25 -0
- data/spec/models/callbacks/basic.rb +98 -0
- data/spec/models/callbacks/basic_multiple.rb +75 -0
- data/spec/models/callbacks/guard_within_block.rb +67 -0
- data/spec/models/callbacks/guard_within_block_multiple.rb +66 -0
- data/spec/models/callbacks/multiple_transitions_transition_guard.rb +66 -0
- data/spec/models/callbacks/multiple_transitions_transition_guard_multiple.rb +65 -0
- data/spec/models/callbacks/private_method.rb +44 -0
- data/spec/models/callbacks/private_method_multiple.rb +44 -0
- data/spec/models/callbacks/with_args.rb +62 -0
- data/spec/models/callbacks/with_args_multiple.rb +61 -0
- data/spec/models/callbacks/with_state_arg.rb +34 -0
- data/spec/models/callbacks/with_state_arg_multiple.rb +29 -0
- data/spec/models/complex_example.rb +222 -0
- data/spec/models/conversation.rb +93 -0
- data/spec/models/default_state.rb +12 -0
- data/spec/models/double_definer.rb +21 -0
- data/spec/models/dynamoid/complex_dynamoid_example.rb +37 -0
- data/spec/models/dynamoid/dynamoid_multiple.rb +18 -0
- data/spec/models/dynamoid/dynamoid_simple.rb +18 -0
- data/spec/models/foo.rb +106 -0
- data/spec/models/foo_callback_multiple.rb +45 -0
- data/spec/models/guard_arguments_check.rb +17 -0
- data/spec/models/guard_with_params.rb +24 -0
- data/spec/models/guard_with_params_multiple.rb +18 -0
- data/spec/models/guardian.rb +58 -0
- data/spec/models/guardian_multiple.rb +48 -0
- data/spec/models/guardian_without_from_specified.rb +18 -0
- data/spec/models/initial_state_proc.rb +31 -0
- data/spec/models/mongoid/complex_mongoid_example.rb +37 -0
- data/spec/models/mongoid/invalid_persistor_mongoid.rb +39 -0
- data/spec/models/mongoid/mongoid_relationships.rb +26 -0
- data/spec/models/mongoid/no_scope_mongoid.rb +21 -0
- data/spec/models/mongoid/silent_persistor_mongoid.rb +39 -0
- data/spec/models/mongoid/simple_mongoid.rb +23 -0
- data/spec/models/mongoid/simple_new_dsl_mongoid.rb +25 -0
- data/spec/models/mongoid/validator_mongoid.rb +100 -0
- data/spec/models/multi_transitioner.rb +34 -0
- data/spec/models/multiple_transitions_that_differ_only_by_guard.rb +31 -0
- data/spec/models/namespaced_multiple_example.rb +42 -0
- data/spec/models/no_initial_state.rb +25 -0
- data/spec/models/nobrainer/complex_no_brainer_example.rb +36 -0
- data/spec/models/nobrainer/invalid_persistor_no_brainer.rb +39 -0
- data/spec/models/nobrainer/no_scope_no_brainer.rb +21 -0
- data/spec/models/nobrainer/nobrainer_relationships.rb +25 -0
- data/spec/models/nobrainer/silent_persistor_no_brainer.rb +39 -0
- data/spec/models/nobrainer/simple_new_dsl_nobrainer.rb +25 -0
- data/spec/models/nobrainer/simple_no_brainer.rb +23 -0
- data/spec/models/nobrainer/validator_no_brainer.rb +98 -0
- data/spec/models/not_auto_loaded/process.rb +21 -0
- data/spec/models/parametrised_event.rb +42 -0
- data/spec/models/parametrised_event_multiple.rb +29 -0
- data/spec/models/process_with_new_dsl.rb +31 -0
- data/spec/models/provided_state.rb +24 -0
- data/spec/models/redis/complex_redis_example.rb +40 -0
- data/spec/models/redis/redis_multiple.rb +20 -0
- data/spec/models/redis/redis_simple.rb +20 -0
- data/spec/models/sequel/complex_sequel_example.rb +46 -0
- data/spec/models/sequel/invalid_persistor.rb +52 -0
- data/spec/models/sequel/sequel_multiple.rb +25 -0
- data/spec/models/sequel/sequel_simple.rb +26 -0
- data/spec/models/sequel/silent_persistor.rb +50 -0
- data/spec/models/sequel/transactor.rb +112 -0
- data/spec/models/sequel/validator.rb +93 -0
- data/spec/models/sequel/worker.rb +12 -0
- data/spec/models/silencer.rb +27 -0
- data/spec/models/simple_custom_example.rb +53 -0
- data/spec/models/simple_example.rb +23 -0
- data/spec/models/simple_example_with_guard_args.rb +17 -0
- data/spec/models/simple_multiple_example.rb +42 -0
- data/spec/models/state_machine_with_failed_event.rb +20 -0
- data/spec/models/states_on_one_line_example.rb +8 -0
- data/spec/models/sub_class.rb +41 -0
- data/spec/models/sub_class_with_more_states.rb +18 -0
- data/spec/models/sub_classing.rb +3 -0
- data/spec/models/super_class.rb +46 -0
- data/spec/models/this_name_better_not_be_in_use.rb +11 -0
- data/spec/models/valid_state_name.rb +23 -0
- data/spec/spec_helper.rb +36 -0
- data/spec/spec_helpers/active_record.rb +8 -0
- data/spec/spec_helpers/dynamoid.rb +35 -0
- data/spec/spec_helpers/mongoid.rb +26 -0
- data/spec/spec_helpers/nobrainer.rb +15 -0
- data/spec/spec_helpers/redis.rb +18 -0
- data/spec/spec_helpers/remove_warnings.rb +1 -0
- data/spec/spec_helpers/sequel.rb +7 -0
- data/spec/unit/abstract_class_spec.rb +27 -0
- data/spec/unit/api_spec.rb +100 -0
- data/spec/unit/basic_two_state_machines_example_spec.rb +10 -0
- data/spec/unit/callback_multiple_spec.rb +304 -0
- data/spec/unit/callbacks_spec.rb +521 -0
- data/spec/unit/complex_example_spec.rb +93 -0
- data/spec/unit/complex_multiple_example_spec.rb +115 -0
- data/spec/unit/edge_cases_spec.rb +16 -0
- data/spec/unit/event_multiple_spec.rb +73 -0
- data/spec/unit/event_naming_spec.rb +16 -0
- data/spec/unit/event_spec.rb +394 -0
- data/spec/unit/exception_spec.rb +11 -0
- data/spec/unit/guard_arguments_check_spec.rb +9 -0
- data/spec/unit/guard_multiple_spec.rb +60 -0
- data/spec/unit/guard_spec.rb +89 -0
- data/spec/unit/guard_with_params_multiple_spec.rb +10 -0
- data/spec/unit/guard_with_params_spec.rb +14 -0
- data/spec/unit/guard_without_from_specified_spec.rb +10 -0
- data/spec/unit/initial_state_multiple_spec.rb +15 -0
- data/spec/unit/initial_state_spec.rb +12 -0
- data/spec/unit/inspection_multiple_spec.rb +201 -0
- data/spec/unit/inspection_spec.rb +149 -0
- data/spec/unit/invoker_spec.rb +189 -0
- data/spec/unit/invokers/base_invoker_spec.rb +72 -0
- data/spec/unit/invokers/class_invoker_spec.rb +95 -0
- data/spec/unit/invokers/literal_invoker_spec.rb +86 -0
- data/spec/unit/invokers/proc_invoker_spec.rb +86 -0
- data/spec/unit/localizer_spec.rb +78 -0
- data/spec/unit/memory_leak_spec.rb +38 -0
- data/spec/unit/multiple_transitions_that_differ_only_by_guard_spec.rb +14 -0
- data/spec/unit/namespaced_multiple_example_spec.rb +75 -0
- data/spec/unit/new_dsl_spec.rb +12 -0
- data/spec/unit/override_warning_spec.rb +94 -0
- data/spec/unit/persistence/active_record_persistence_multiple_spec.rb +618 -0
- data/spec/unit/persistence/active_record_persistence_spec.rb +773 -0
- data/spec/unit/persistence/dynamoid_persistence_multiple_spec.rb +135 -0
- data/spec/unit/persistence/dynamoid_persistence_spec.rb +84 -0
- data/spec/unit/persistence/mongoid_persistence_multiple_spec.rb +200 -0
- data/spec/unit/persistence/mongoid_persistence_spec.rb +165 -0
- data/spec/unit/persistence/no_brainer_persistence_multiple_spec.rb +198 -0
- data/spec/unit/persistence/no_brainer_persistence_spec.rb +158 -0
- data/spec/unit/persistence/redis_persistence_multiple_spec.rb +88 -0
- data/spec/unit/persistence/redis_persistence_spec.rb +53 -0
- data/spec/unit/persistence/sequel_persistence_multiple_spec.rb +148 -0
- data/spec/unit/persistence/sequel_persistence_spec.rb +368 -0
- data/spec/unit/readme_spec.rb +41 -0
- data/spec/unit/reloading_spec.rb +15 -0
- data/spec/unit/rspec_matcher_spec.rb +88 -0
- data/spec/unit/simple_custom_example_spec.rb +39 -0
- data/spec/unit/simple_example_spec.rb +57 -0
- data/spec/unit/simple_multiple_example_spec.rb +91 -0
- data/spec/unit/state_spec.rb +89 -0
- data/spec/unit/states_on_one_line_example_spec.rb +16 -0
- data/spec/unit/subclassing_multiple_spec.rb +74 -0
- data/spec/unit/subclassing_spec.rb +46 -0
- data/spec/unit/transition_spec.rb +436 -0
- data/test/minitest_helper.rb +57 -0
- data/test/unit/minitest_matcher_test.rb +80 -0
- 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
|