test/pipetree_test.rb in trailblazer-operation-0.0.9 vs test/pipetree_test.rb in trailblazer-operation-0.0.10

- old
+ new

@@ -1,36 +1,30 @@ require "test_helper" class PipetreeTest < Minitest::Spec - module Validate - def self.import!(operation, pipe) - pipe.(:>, ->{ snippet }, name: "validate", before: "operation.new") - end + def self.Validate + step = ->{ snippet } + + [ step, name: "validate", before: "operation.new" ] end - #--- - # ::| # without options class Create < Trailblazer::Operation - step [Validate] + step PipetreeTest::Validate() + step PipetreeTest::Validate(), name: "VALIDATE!" end - it { Create["pipetree"].inspect.must_equal %{[>validate,>>operation.new]} } + it { Create["pipetree"].inspect.must_equal %{[>validate,>VALIDATE!,>operation.new]} } - # without any options or [] - # class New < Trailblazer::Operation - # step Validate - # end - # it { New["pipetree"].inspect.must_equal %{[>validate,>>operation.new]} } # with options class Update < Trailblazer::Operation - step [Validate], after: "operation.new" + step PipetreeTest::Validate(), after: "operation.new" end - it { Update["pipetree"].inspect.must_equal %{[>>operation.new,>validate]} } + it { Update["pipetree"].inspect.must_equal %{[>operation.new,>validate]} } #--- # ::step #- @@ -61,43 +55,131 @@ #--- # ::>, ::<, ::>>, :& # with proc, method, callable. class Right < Trailblazer::Operation MyProc = ->(*) { } - self.> ->(options) { options[">"] = options["params"][:id] }, better_api: true + success ->(options) { options[">"] = options["params"][:id] }, better_api: true - self.> :method_name! + success :method_name! def method_name!(options); self["method_name!"] = options["params"][:id] end class MyCallable include Uber::Callable def call(options); options["callable"] = options["params"][:id] end end - self.> MyCallable.new + success MyCallable.new end it { Right.( id: 1 ).slice(">", "method_name!", "callable").must_equal [1, 1, 1] } - it { Right["pipetree"].inspect.must_equal %{[>>operation.new,>PipetreeTest::Right:66,>method_name!,>PipetreeTest::Right::MyCallable]} } + it { Right["pipetree"].inspect.must_equal %{[>operation.new,>pipetree_test.rb:60,>method_name!,>PipetreeTest::Right::MyCallable]} } #--- # inheritance class Righter < Right - self.> ->(options) { options["righter"] = true } + success ->(options) { options["righter"] = true } end it { Righter.( id: 1 ).slice(">", "method_name!", "callable", "righter").must_equal [1, 1, 1, true] } end -#--- -#- kw args -class OperationKwArgsTest < Minitest::Spec - Song = Struct.new(:id) +class FailPassFastOptionTest < Minitest::Spec + # #failure fails fast. class Create < Trailblazer::Operation - self.> ->(options) { options["model"] = "Object" } - # self.> ->(model:) { snippet } + step ->(options, *) { options["x"] = options["dont_fail"] } + failure ->(options, *) { options["a"] = true; options["fail_fast"] }, fail_fast: true + failure ->(options, *) { options["b"] = true } + step ->(options, *) { options["y"] = true } end - it { - skip - Create.() } + it { Create.({}, "fail_fast" => true, "dont_fail" => true ).inspect("x", "a", "b", "y").must_equal %{<Result:true [true, nil, nil, true] >} } + it { Create.({}, "fail_fast" => true ).inspect("x", "a", "b", "y").must_equal %{<Result:false [nil, true, nil, nil] >} } + it { Create.({}, "fail_fast" => false ).inspect("x", "a", "b", "y").must_equal %{<Result:false [nil, true, nil, nil] >} } + + # #success passes fast. + class Retrieve < Trailblazer::Operation + success ->(options, *) { options["x"] = options["dont_fail"] }, pass_fast: true + failure ->(options, *) { options["b"] = true } + step ->(options, *) { options["y"] = true } + end + + it { Retrieve.({}, "dont_fail" => true ).inspect("x", "b", "y").must_equal %{<Result:true [true, nil, nil] >} } + it { Retrieve.({}, "dont_fail" => false ).inspect("x", "b", "y").must_equal %{<Result:true [false, nil, nil] >} } + + # #step fails fast if option set and returns false. + class Update < Trailblazer::Operation + step ->(options, *) { options["x"] = true } + step ->(options, *) { options["a"] = options["dont_fail"] }, fail_fast: true # only on false. + failure ->(options, *) { options["b"] = true } + step ->(options, *) { options["y"] = true } + end + + it { Update.({}, "dont_fail" => true).inspect("x", "a", "b", "y").must_equal %{<Result:true [true, true, nil, true] >} } + it { Update.({} ).inspect("x", "a", "b", "y").must_equal %{<Result:false [true, nil, nil, nil] >} } + + # #step passes fast if option set and returns true. + class Delete < Trailblazer::Operation + step ->(options, *) { options["x"] = true } + step ->(options, *) { options["a"] = options["dont_fail"] }, pass_fast: true # only on true. + failure ->(options, *) { options["b"] = true } + step ->(options, *) { options["y"] = true } + end + + it { Delete.({}, "dont_fail" => true).inspect("x", "a", "b", "y").must_equal %{<Result:true [true, true, nil, nil] >} } + it { Delete.({} ).inspect("x", "a", "b", "y").must_equal %{<Result:false [true, nil, true, nil] >} } +end + +class FailBangTest < Minitest::Spec + class Create < Trailblazer::Operation + step ->(options, *) { options["x"] = true; Railway.fail! } + step ->(options, *) { options["y"] = true } + failure ->(options, *) { options["a"] = true } + end + + it { Create.().inspect("x", "y", "a").must_equal %{<Result:false [true, nil, true] >} } +end + +class PassBangTest < Minitest::Spec + class Create < Trailblazer::Operation + step ->(options, *) { options["x"] = true; Railway.pass! } + step ->(options, *) { options["y"] = true } + failure ->(options, *) { options["a"] = true } + end + + it { Create.().inspect("x", "y", "a").must_equal %{<Result:true [true, true, nil] >} } +end + +class FailFastBangTest < Minitest::Spec + class Create < Trailblazer::Operation + step ->(options, *) { options["x"] = true; Railway.fail_fast! } + step ->(options, *) { options["y"] = true } + failure ->(options, *) { options["a"] = true } + end + + it { Create.().inspect("x", "y", "a").must_equal %{<Result:false [true, nil, nil] >} } +end + +class PassFastBangTest < Minitest::Spec + class Create < Trailblazer::Operation + step ->(options, *) { options["x"] = true; Railway.pass_fast! } + step ->(options, *) { options["y"] = true } + failure ->(options, *) { options["a"] = true } + end + + it { Create.().inspect("x", "y", "a").must_equal %{<Result:true [true, nil, nil] >} } +end + + +class OverrideTest < Minitest::Spec + class Create < Trailblazer::Operation + step :a + step :b + end + + class Update < Create + step :a, override: true + end + +# FIXME: also test Macro + it { Create["pipetree"].inspect.must_equal %{[>operation.new,>a,>b]} } + it { Update["pipetree"].inspect.must_equal %{[>operation.new,>a,>b]} } end