trailblazer-operation 0.0.13 → 0.1.1
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 +4 -4
- data/.travis.yml +5 -3
- data/CHANGES.md +44 -0
- data/Gemfile +13 -2
- data/Rakefile +8 -6
- data/lib/trailblazer/operation.rb +86 -12
- data/lib/trailblazer/operation/deprecated_macro.rb +19 -0
- data/lib/trailblazer/operation/inject.rb +34 -0
- data/lib/trailblazer/operation/inspect.rb +80 -0
- data/lib/trailblazer/operation/public_call.rb +62 -0
- data/lib/trailblazer/operation/railway.rb +32 -0
- data/lib/trailblazer/operation/railway/fast_track.rb +13 -0
- data/lib/trailblazer/operation/railway/normalizer.rb +73 -0
- data/lib/trailblazer/operation/railway/task_builder.rb +44 -0
- data/lib/trailblazer/operation/result.rb +6 -4
- data/lib/trailblazer/operation/skill.rb +8 -24
- data/lib/trailblazer/operation/task_wrap.rb +68 -0
- data/lib/trailblazer/operation/trace.rb +49 -0
- data/lib/trailblazer/operation/variable_mapping.rb +91 -0
- data/lib/trailblazer/operation/version.rb +1 -1
- data/test/call_test.rb +27 -8
- data/test/class_dependencies_test.rb +16 -0
- data/test/docs/doormat_test.rb +189 -0
- data/test/docs/wiring_test.rb +421 -0
- data/test/dry_container_test.rb +4 -0
- data/test/fast_track_test.rb +197 -0
- data/test/gemfiles/Gemfile.ruby-2.0 +1 -2
- data/test/gemfiles/Gemfile.ruby-2.0.lock +40 -0
- data/test/inheritance_test.rb +1 -1
- data/test/inspect_test.rb +43 -0
- data/test/introspect_test.rb +50 -0
- data/test/macro_test.rb +61 -0
- data/test/operation_test.rb +94 -0
- data/test/result_test.rb +14 -8
- data/test/ruby-2.0.0/operation_test.rb +73 -0
- data/test/ruby-2.0.0/step_test.rb +136 -0
- data/test/skill_test.rb +66 -48
- data/test/step_test.rb +228 -0
- data/test/task_wrap_test.rb +91 -0
- data/test/test_helper.rb +37 -0
- data/test/trace_test.rb +62 -0
- data/test/variable_mapping_test.rb +66 -0
- data/test/wire_test.rb +113 -0
- data/test/wiring/defaults_test.rb +197 -0
- data/test/wiring/subprocess_test.rb +70 -0
- data/trailblazer-operation.gemspec +3 -5
- metadata +62 -36
- data/lib/trailblazer/operation/1.9.3/option.rb +0 -36
- data/lib/trailblazer/operation/generic.rb +0 -12
- data/lib/trailblazer/operation/option.rb +0 -54
- data/lib/trailblazer/operation/pipetree.rb +0 -142
- data/lib/trailblazer/skill.rb +0 -70
- data/test/2.0.0-pipetree_test.rb +0 -100
- data/test/2.1.0-pipetree_test.rb +0 -100
- data/test/operation_skill_test.rb +0 -89
- data/test/pipetree_test.rb +0 -185
data/test/dry_container_test.rb
CHANGED
@@ -11,6 +11,10 @@ class DryContainerTest < Minitest::Spec
|
|
11
11
|
class Create < Trailblazer::Operation
|
12
12
|
end
|
13
13
|
|
14
|
+
it "allows 2.2 call style" do
|
15
|
+
Create.({}, my_container)["user_repository"].must_equal Object
|
16
|
+
end
|
17
|
+
|
14
18
|
it { Create.({}, {}, my_container)["user_repository"].must_equal Object }
|
15
19
|
it { Create.({}, {}, my_container)["contract.create"].must_equal Array }
|
16
20
|
# also allows our own options PLUS containers.
|
@@ -0,0 +1,197 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class FastTrackTest < Minitest::Spec
|
4
|
+
# #failure fails fast.
|
5
|
+
# class Create < Trailblazer::Operation
|
6
|
+
# step ->(options, *) { options["x"] = options["dont_fail"] }
|
7
|
+
# failure ->(options, *) { options["a"] = true; options["fail_fast"] }, fail_fast: true
|
8
|
+
# failure ->(options, *) { options["b"] = true }
|
9
|
+
# step ->(options, *) { options["y"] = true }
|
10
|
+
# end
|
11
|
+
|
12
|
+
# puts Create["pipetree"].inspect
|
13
|
+
|
14
|
+
# require "trailblazer/diagram/bpmn"
|
15
|
+
# puts Trailblazer::Diagram::BPMN.to_xml(Create["pipetree"])
|
16
|
+
|
17
|
+
# it { Create.("fail_fast" => true, "dont_fail" => true ).inspect("x", "a", "b", "y").must_equal %{<Result:true [true, nil, nil, true] >} }
|
18
|
+
# it { Create.("fail_fast" => true ).inspect("x", "a", "b", "y").must_equal %{<Result:false [nil, true, nil, nil] >} }
|
19
|
+
# it { Create.("fail_fast" => false ).inspect("x", "a", "b", "y").must_equal %{<Result:false [nil, true, nil, nil] >} }
|
20
|
+
|
21
|
+
# #success passes fast.
|
22
|
+
class Retrieve < Trailblazer::Operation
|
23
|
+
pass ->(options, **) { options["x"] = options["dont_fail"] }, pass_fast: true
|
24
|
+
fail ->(options, **) { options["b"] = true }
|
25
|
+
step ->(options, **) { options["y"] = true }
|
26
|
+
end
|
27
|
+
it { Retrieve.("dont_fail" => true ).inspect("x", "b", "y").must_equal %{<Result:true [true, nil, nil] >} }
|
28
|
+
it { Retrieve.("dont_fail" => false ).inspect("x", "b", "y").must_equal %{<Result:true [false, nil, nil] >} }
|
29
|
+
|
30
|
+
# #step fails fast if option set and returns false.
|
31
|
+
class Update < Trailblazer::Operation
|
32
|
+
step ->(options, *) { options["x"] = true }
|
33
|
+
step ->(options, *) { options["a"] = options["dont_fail"] }, fail_fast: true # only on false.
|
34
|
+
failure ->(options, *) { options["b"] = true }
|
35
|
+
step ->(options, *) { options["y"] = true }
|
36
|
+
end
|
37
|
+
|
38
|
+
it { Update.("dont_fail" => true).inspect("x", "a", "b", "y").must_equal %{<Result:true [true, true, nil, true] >} }
|
39
|
+
it { Update.({} ).inspect("x", "a", "b", "y").must_equal %{<Result:false [true, nil, nil, nil] >} }
|
40
|
+
|
41
|
+
# #step passes fast if option set and returns true.
|
42
|
+
class Delete < Trailblazer::Operation
|
43
|
+
step ->(options, *) { options["x"] = true }
|
44
|
+
step ->(options, *) { options["a"] = options["dont_fail"] }, pass_fast: true # only on true.
|
45
|
+
fail ->(options, *) { options["b"] = true }
|
46
|
+
step ->(options, *) { options["y"] = true }
|
47
|
+
end
|
48
|
+
|
49
|
+
it { Delete.("dont_fail" => true).inspect("x", "a", "b", "y").must_equal %{<Result:true [true, true, nil, nil] >} }
|
50
|
+
it { Delete.({} ).inspect("x", "a", "b", "y").must_equal %{<Result:false [true, nil, true, nil] >} }
|
51
|
+
end
|
52
|
+
|
53
|
+
class FailBangTest < Minitest::Spec
|
54
|
+
class Create < Trailblazer::Operation
|
55
|
+
step ->(options, *) { options["x"] = true; Railway.fail! }
|
56
|
+
step ->(options, *) { options["y"] = true }
|
57
|
+
failure ->(options, *) { options["a"] = true }
|
58
|
+
end
|
59
|
+
|
60
|
+
it { Create.().inspect("x", "y", "a").must_equal %{<Result:false [true, nil, true] >} }
|
61
|
+
end
|
62
|
+
|
63
|
+
class PassBangTest < Minitest::Spec
|
64
|
+
class Create < Trailblazer::Operation
|
65
|
+
step ->(options, *) { options["x"] = true; Railway.pass! }
|
66
|
+
step ->(options, *) { options["y"] = true }
|
67
|
+
failure ->(options, *) { options["a"] = true }
|
68
|
+
end
|
69
|
+
|
70
|
+
it { Create.().inspect("x", "y", "a").must_equal %{<Result:true [true, true, nil] >} }
|
71
|
+
end
|
72
|
+
|
73
|
+
class FailFastBangTest < Minitest::Spec
|
74
|
+
class Create < Trailblazer::Operation
|
75
|
+
step ->(options, *) { options["x"] = true; Railway.fail_fast! }
|
76
|
+
step ->(options, *) { options["y"] = true }
|
77
|
+
failure ->(options, *) { options["a"] = true }
|
78
|
+
end
|
79
|
+
|
80
|
+
# without proper configuration, emitting a FastTrack signal is illegal.
|
81
|
+
it { assert_raises(Trailblazer::Circuit::IllegalOutputSignalError) { Create.().inspect("x", "y", "a").must_equal %{<Result:false [true, nil, nil] >} } }
|
82
|
+
|
83
|
+
class Update < Trailblazer::Operation
|
84
|
+
step ->(options, *) { options["x"] = true; Railway.fail_fast! }, fast_track: true
|
85
|
+
step ->(options, *) { options["y"] = true }
|
86
|
+
failure ->(options, *) { options["a"] = true }
|
87
|
+
end
|
88
|
+
|
89
|
+
it { Update.().inspect("x", "y", "a").must_equal %{<Result:false [true, nil, nil] >} }
|
90
|
+
end
|
91
|
+
|
92
|
+
class PassFastBangTest < Minitest::Spec
|
93
|
+
class Create < Trailblazer::Operation
|
94
|
+
step ->(options, *) { options["x"] = true; Railway.pass_fast! }, fast_track: true
|
95
|
+
step ->(options, *) { options["y"] = true }
|
96
|
+
failure ->(options, *) { options["a"] = true }
|
97
|
+
end
|
98
|
+
|
99
|
+
it { Create.().inspect("x", "y", "a").must_equal %{<Result:true [true, nil, nil] >} }
|
100
|
+
end
|
101
|
+
|
102
|
+
#-
|
103
|
+
class NestedFastTrackTest < Minitest::Spec
|
104
|
+
#- The ::step DSL method automatically connects the nested's End.fail_fast/End.pass_fast to Update's End.fail_fast/End.pass_fast.
|
105
|
+
#
|
106
|
+
# Edit has fast-tracked steps, so it has outputs :success/:failure/:pass_fast/:fail_fast.
|
107
|
+
class Edit < Trailblazer::Operation
|
108
|
+
step :a, fast_track: true # task is connected to End.pass_fast and End.fail_fast.
|
109
|
+
|
110
|
+
def a(options, edit_return:, **)
|
111
|
+
options["a"] = 1
|
112
|
+
edit_return # End.success, End.pass_fast, etc.
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
module Steps
|
117
|
+
def b(options, a:, **)
|
118
|
+
options["b"] = a+1
|
119
|
+
end
|
120
|
+
|
121
|
+
def f(options, **)
|
122
|
+
options["f"] = 3
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
describe "Nested, fast_track: true and all its outputs given" do
|
127
|
+
let(:update) do
|
128
|
+
Class.new(Trailblazer::Operation) do
|
129
|
+
step task: Trailblazer::Activity::Subprocess( Edit, call: :__call__ ), id: "Subprocess/",
|
130
|
+
plus_poles: Trailblazer::Activity::Magnetic::DSL::PlusPoles::from_outputs( Edit.outputs ),
|
131
|
+
fast_track: true
|
132
|
+
step :b
|
133
|
+
fail :f
|
134
|
+
|
135
|
+
include Steps
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
# Edit returns End.success
|
140
|
+
it { update.(edit_return: true).inspect("a", "b", "f").must_equal %{<Result:true [1, 2, nil] >} }
|
141
|
+
# Edit returns End.failure
|
142
|
+
it { update.(edit_return: false).inspect("a", "b", "f").must_equal %{<Result:false [1, nil, 3] >} }
|
143
|
+
# Edit returns End.pass_fast
|
144
|
+
it { update.(edit_return: Trailblazer::Operation::Railway.pass_fast!).inspect("a", "b", "f").must_equal %{<Result:true [1, nil, nil] >} }
|
145
|
+
# Edit returns End.fail_fast
|
146
|
+
it { update.(edit_return: Trailblazer::Operation::Railway.fail_fast!).inspect("a", "b", "f").must_equal %{<Result:false [1, nil, nil] >} }
|
147
|
+
end
|
148
|
+
|
149
|
+
describe "Nested, no :fast_track option but all its outputs given" do
|
150
|
+
let(:update) do
|
151
|
+
Class.new(Trailblazer::Operation) do
|
152
|
+
include Steps
|
153
|
+
|
154
|
+
step task: Trailblazer::Activity::Subprocess( Edit, call: :__call__ ), id: "Subprocess/",
|
155
|
+
plus_poles: Trailblazer::Activity::Magnetic::DSL::PlusPoles::from_outputs( Edit.outputs ) # all outputs given means it "works"
|
156
|
+
step :b
|
157
|
+
fail :f
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
# Edit returns End.success
|
162
|
+
it { update.(edit_return: true).inspect("a", "b", "f").must_equal %{<Result:true [1, 2, nil] >} }
|
163
|
+
# Edit returns End.failure
|
164
|
+
it { update.(edit_return: false).inspect("a", "b", "f").must_equal %{<Result:false [1, nil, 3] >} }
|
165
|
+
# Edit returns End.pass_fast
|
166
|
+
it { update.(edit_return: Trailblazer::Operation::Railway.pass_fast!).inspect("a", "b", "f").must_equal %{<Result:true [1, nil, nil] >} }
|
167
|
+
# Edit returns End.fail_fast
|
168
|
+
it { update.(edit_return: Trailblazer::Operation::Railway.fail_fast!).inspect("a", "b", "f").must_equal %{<Result:false [1, nil, nil] >} }
|
169
|
+
end
|
170
|
+
|
171
|
+
describe "2.0 behavior: no :fast_track option, all outputs given, but we rewire fast_track" do
|
172
|
+
let(:update) do
|
173
|
+
Class.new(Trailblazer::Operation) do
|
174
|
+
include Steps
|
175
|
+
|
176
|
+
step({task: Trailblazer::Activity::Subprocess( Edit, call: :__call__ ), id: "Subprocess/",
|
177
|
+
plus_poles: Trailblazer::Activity::Magnetic::DSL::PlusPoles::from_outputs( Edit.outputs )},
|
178
|
+
{Output(:pass_fast) => :success, Output(:fail_fast) => :failure} )# manually rewire the fast-track outputs to "conventional" railway ends.
|
179
|
+
|
180
|
+
step :b
|
181
|
+
fail :f
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
# it { puts Trailblazer::Activity::Introspect.Cct(update.instance_variable_get(:@process)) }
|
186
|
+
it { puts Trailblazer::Activity::Magnetic::Introspect.seq( update ) }
|
187
|
+
# Edit returns End.success
|
188
|
+
it { update.(edit_return: true).inspect("a", "b", "f").must_equal %{<Result:true [1, 2, nil] >} }
|
189
|
+
# Edit returns End.failure
|
190
|
+
it { update.(edit_return: false).inspect("a", "b", "f").must_equal %{<Result:false [1, nil, 3] >} }
|
191
|
+
# Edit returns End.pass_fast, but behaves like :success.
|
192
|
+
it { update.(edit_return: Trailblazer::Operation::Railway.pass_fast!).inspect("a", "b", "f").must_equal %{<Result:true [1, 2, nil] >} }
|
193
|
+
# Edit returns End.fail_fast, but behaves like :failure.
|
194
|
+
it { update.(edit_return: Trailblazer::Operation::Railway.fail_fast!).inspect("a", "b", "f").must_equal %{<Result:false [1, nil, 3] >} }
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
@@ -0,0 +1,40 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ../..
|
3
|
+
specs:
|
4
|
+
trailblazer-operation (0.1.0)
|
5
|
+
declarative
|
6
|
+
trailblazer-activity (>= 0.1.3, < 0.2.0)
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
concurrent-ruby (1.0.2)
|
12
|
+
declarative (0.0.9)
|
13
|
+
dry-configurable (0.4.0)
|
14
|
+
concurrent-ruby (~> 1.0)
|
15
|
+
dry-container (0.6.0)
|
16
|
+
concurrent-ruby (~> 1.0)
|
17
|
+
dry-configurable (~> 0.1, >= 0.1.3)
|
18
|
+
hirb (0.7.3)
|
19
|
+
minitest (5.10.2)
|
20
|
+
minitest-line (0.6.3)
|
21
|
+
minitest (~> 5.0)
|
22
|
+
raise (0.0.2)
|
23
|
+
rake (12.0.0)
|
24
|
+
trailblazer-activity (0.1.3)
|
25
|
+
hirb
|
26
|
+
|
27
|
+
PLATFORMS
|
28
|
+
ruby
|
29
|
+
|
30
|
+
DEPENDENCIES
|
31
|
+
bundler
|
32
|
+
dry-container
|
33
|
+
minitest
|
34
|
+
minitest-line
|
35
|
+
raise
|
36
|
+
rake
|
37
|
+
trailblazer-operation!
|
38
|
+
|
39
|
+
BUNDLED WITH
|
40
|
+
1.15.3
|
data/test/inheritance_test.rb
CHANGED
@@ -0,0 +1,43 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
|
4
|
+
class InspectTest < Minitest::Spec
|
5
|
+
# Test: #to_table
|
6
|
+
class Create < Trailblazer::Operation
|
7
|
+
step :decide!
|
8
|
+
pass :wasnt_ok!
|
9
|
+
pass :was_ok!
|
10
|
+
fail :return_true!
|
11
|
+
fail :return_false!
|
12
|
+
step :finalize!
|
13
|
+
end
|
14
|
+
|
15
|
+
#---
|
16
|
+
#- to_table
|
17
|
+
|
18
|
+
# pp Create.instance_variable_get(:@builder)
|
19
|
+
|
20
|
+
it do
|
21
|
+
Trailblazer::Operation.introspect(Create).must_equal %{[>decide!,>>wasnt_ok!,>>was_ok!,<<return_true!,<<return_false!,>finalize!]}
|
22
|
+
end
|
23
|
+
|
24
|
+
it do
|
25
|
+
Trailblazer::Operation::Inspect.call(Create, style: :rows).must_equal %{
|
26
|
+
0 ==============================>decide!
|
27
|
+
1 ===========================>>wasnt_ok!
|
28
|
+
2 =============================>>was_ok!
|
29
|
+
3 <<return_true!========================
|
30
|
+
4 <<return_false!=======================
|
31
|
+
5 ============================>finalize!}
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "step with only one plus pole (happens with Nested)" do
|
35
|
+
class Present < Trailblazer::Operation
|
36
|
+
pass :ok!, plus_poles: Trailblazer::Activity::Magnetic::DSL::PlusPoles::from_outputs( :success => Trailblazer::Activity.Output("signal", :success) )
|
37
|
+
end
|
38
|
+
|
39
|
+
it do
|
40
|
+
Trailblazer::Operation.introspect(Present).must_equal %{[>>ok!]}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class IntrospectTest < Minitest::Spec
|
4
|
+
A = ->(*args) { [ Activity::Right, *args ] }
|
5
|
+
B = ->(*args) { [ Activity::Right, *args ] }
|
6
|
+
C = ->(*args) { [ Activity::Right, *args ] }
|
7
|
+
D = ->(*args) { [ Activity::Right, *args ] }
|
8
|
+
|
9
|
+
let(:activity) do
|
10
|
+
nested = bc
|
11
|
+
|
12
|
+
Class.new(Trailblazer::Operation) do
|
13
|
+
step A
|
14
|
+
step nested, Output(nested.outputs.keys.first, :success) => :success
|
15
|
+
step D, id: "D"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
let(:bc) do
|
20
|
+
Class.new(Trailblazer::Operation) do
|
21
|
+
step B
|
22
|
+
step C
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#collect" do
|
27
|
+
it "iterates over each task element in the top activity" do
|
28
|
+
all_tasks = Activity::Introspect.collect(activity) do |task, connections|
|
29
|
+
task
|
30
|
+
end
|
31
|
+
|
32
|
+
# pp all_tasks
|
33
|
+
|
34
|
+
all_tasks.size.must_equal 8
|
35
|
+
# all_tasks[1..3].must_equal [A, bc, D]
|
36
|
+
# TODO: test start and end!
|
37
|
+
end
|
38
|
+
|
39
|
+
it "iterates over all task elements recursively" do
|
40
|
+
skip
|
41
|
+
all_tasks = Activity::Introspect.collect(activity, recursive: true) do |task, connections|
|
42
|
+
task
|
43
|
+
end
|
44
|
+
|
45
|
+
all_tasks.size.must_equal 9
|
46
|
+
all_tasks[1..2].must_equal [A, bc]
|
47
|
+
all_tasks[4..5].must_equal [B, C]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/test/macro_test.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
#- test
|
3
|
+
# macro [ task, {name} ]
|
4
|
+
# macro [ task, {name}, { alteration: } ] # see task_wrap_test.rb
|
5
|
+
# macro [ task, {name}, { alteration: }, {task_outputs} ] # for eg. nested
|
6
|
+
|
7
|
+
class MacroTest < Minitest::Spec
|
8
|
+
PlusPoles = Trailblazer::Activity::Magnetic::DSL::PlusPoles
|
9
|
+
|
10
|
+
MacroB = ->(( options, *args ), **) do
|
11
|
+
options[:B] = true # we were here!
|
12
|
+
|
13
|
+
[ options[:MacroB_return], [ options, *args ] ]
|
14
|
+
end
|
15
|
+
|
16
|
+
it "raises exception when macro doesn't provide :id" do
|
17
|
+
assert_raises do
|
18
|
+
|
19
|
+
Class.new(Trailblazer::Operation) do
|
20
|
+
step( task: "<some macro>" )
|
21
|
+
end
|
22
|
+
|
23
|
+
end.message.must_equal %{No :id given for <some macro>}
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
class Create < Trailblazer::Operation
|
28
|
+
step :a
|
29
|
+
step( task: MacroB, id: :MacroB, plus_poles: Test.plus_poles_for("Allgood" => :success, "Fail!" => :failure, "Winning" => :pass_fast) )
|
30
|
+
step :c
|
31
|
+
|
32
|
+
def a(options, **); options[:a] = true end
|
33
|
+
def c(options, **); options[:c] = true end
|
34
|
+
end
|
35
|
+
|
36
|
+
# MacroB returns Allgood and is wired to the :success edge (right track).
|
37
|
+
it { Create.( {}, MacroB_return: "Allgood" ).inspect(:a, :B, :c).must_equal %{<Result:true [true, true, true] >} }
|
38
|
+
# MacroB returns Fail! and is wired to the :failure edge (left track).
|
39
|
+
it { Create.( {}, MacroB_return: "Fail!" ).inspect(:a, :B, :c).must_equal %{<Result:false [true, true, nil] >} }
|
40
|
+
# MacroB returns Winning and is wired to the :pass_fast edge.
|
41
|
+
it { Create.( {}, MacroB_return: "Winning" ).inspect(:a, :B, :c).must_equal %{<Result:true [true, true, nil] >} }
|
42
|
+
|
43
|
+
#- user overrides :plus_poles
|
44
|
+
class Update < Trailblazer::Operation
|
45
|
+
macro = { task: MacroB, id: :MacroB, plus_poles: Test.plus_poles_for("Allgood" => :success, "Fail!" => :failure, "Winning" => :pass_fast) }
|
46
|
+
|
47
|
+
step :a
|
48
|
+
step macro, plus_poles: Test.plus_poles_for("Allgood" => :failure, "Fail!" => :success, "Winning" => :fail_fast)
|
49
|
+
step :c
|
50
|
+
|
51
|
+
def a(options, **); options[:a] = true end
|
52
|
+
def c(options, **); options[:c] = true end
|
53
|
+
end
|
54
|
+
|
55
|
+
# MacroB returns Allgood and is wired to the :failure edge.
|
56
|
+
it { Update.( {}, MacroB_return: "Allgood" ).inspect(:a, :B, :c).must_equal %{<Result:false [true, true, nil] >} }
|
57
|
+
# MacroB returns Fail! and is wired to the :success edge.
|
58
|
+
it { Update.( {}, MacroB_return: "Fail!" ).inspect(:a, :B, :c).must_equal %{<Result:true [true, true, true] >} }
|
59
|
+
# MacroB returns Winning and is wired to the :fail_fast edge.
|
60
|
+
it { Update.( {}, MacroB_return: "Winning" ).inspect(:a, :B, :c).must_equal %{<Result:false [true, true, nil] >} }
|
61
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class DeclarativeApiTest < Minitest::Spec
|
4
|
+
#---
|
5
|
+
#- step, pass, fail
|
6
|
+
|
7
|
+
# Test: step/pass/fail
|
8
|
+
# * do they deviate properly?
|
9
|
+
class Create < Trailblazer::Operation
|
10
|
+
step :decide!
|
11
|
+
pass :wasnt_ok!
|
12
|
+
pass :was_ok!
|
13
|
+
fail :return_true!
|
14
|
+
fail :return_false!
|
15
|
+
|
16
|
+
def decide!(options, decide:raise, **)
|
17
|
+
options["a"] = true
|
18
|
+
decide
|
19
|
+
end
|
20
|
+
|
21
|
+
def wasnt_ok!(options, **)
|
22
|
+
options["y"] = false
|
23
|
+
end
|
24
|
+
|
25
|
+
def was_ok!(options, **)
|
26
|
+
options["x"] = true
|
27
|
+
end
|
28
|
+
|
29
|
+
def return_true! (options, **); options["b"] = true end
|
30
|
+
def return_false!(options, **); options["c"] = false end
|
31
|
+
end
|
32
|
+
|
33
|
+
it { Create.(decide: true).inspect("a", "x", "y", "b", "c").must_equal %{<Result:true [true, true, false, nil, nil] >} }
|
34
|
+
it { Create.(decide: false).inspect("a", "x", "y", "b", "c").must_equal %{<Result:false [true, nil, nil, true, false] >} }
|
35
|
+
|
36
|
+
#---
|
37
|
+
#- trace
|
38
|
+
|
39
|
+
it do
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
#---
|
44
|
+
#- empty class
|
45
|
+
class Noop < Trailblazer::Operation
|
46
|
+
end
|
47
|
+
|
48
|
+
it { Noop.().inspect("params").must_equal %{<Result:true [nil] >} }
|
49
|
+
|
50
|
+
#---
|
51
|
+
#- pass
|
52
|
+
#- fail
|
53
|
+
class Update < Trailblazer::Operation
|
54
|
+
pass ->(options, **) { options["a"] = false }
|
55
|
+
step ->(options, params:raise, **) { options["b"] = params[:decide] }
|
56
|
+
fail ->(options, **) { options["c"] = true }
|
57
|
+
end
|
58
|
+
|
59
|
+
it { Update.("params" => {decide: true}).inspect("a", "b", "c").must_equal %{<Result:true [false, true, nil] >} }
|
60
|
+
it { Update.("params" => {decide: false}).inspect("a", "b", "c").must_equal %{<Result:false [false, false, true] >} }
|
61
|
+
|
62
|
+
#---
|
63
|
+
#- inheritance
|
64
|
+
class Upsert < Update
|
65
|
+
step ->(options, **) { options["d"] = 1 }
|
66
|
+
end
|
67
|
+
|
68
|
+
class Unset < Upsert
|
69
|
+
step ->(options, **) { options["e"] = 2 }
|
70
|
+
end
|
71
|
+
|
72
|
+
it "allows to inherit" do
|
73
|
+
Upsert.("params" => {decide: true}).inspect("a", "b", "c", "d", "e").must_equal %{<Result:true [false, true, nil, 1, nil] >}
|
74
|
+
Unset. ("params" => {decide: true}).inspect("a", "b", "c", "d", "e").must_equal %{<Result:true [false, true, nil, 1, 2] >}
|
75
|
+
end
|
76
|
+
|
77
|
+
describe "Activity::Interface" do
|
78
|
+
class Edit < Trailblazer::Operation
|
79
|
+
step :a
|
80
|
+
step :b, fast_track: true
|
81
|
+
end
|
82
|
+
|
83
|
+
it "provides #outputs" do
|
84
|
+
Activity::Introspect.Outputs(Edit.outputs).must_equal %{success=> (#<Trailblazer::Operation::Railway::End::Success:>, success)
|
85
|
+
failure=> (#<Trailblazer::Operation::Railway::End::Failure:>, failure)
|
86
|
+
pass_fast=> (#<Trailblazer::Operation::Railway::End::PassFast:>, pass_fast)
|
87
|
+
fail_fast=> (#<Trailblazer::Operation::Railway::End::FailFast:>, fail_fast)}
|
88
|
+
end
|
89
|
+
|
90
|
+
it "is an Interface" do
|
91
|
+
Edit.is_a?( Activity::Interface ).must_equal true
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|