require "test_helper" class ResolverTest < Minitest::Spec Song = Struct.new(:id) do def self.find(id); new(id) end end class Auth def initialize(*args); @user, @model = *args end def only_user?; @user == Module && @model.nil? end def user_object?; @user == Object end def user_and_model?; @user == Module && @model.class == Song end def inspect; "" end end class A < Trailblazer::Operation extend Builder::DSL builds ->(options) { return P if options["params"] == { some: "params", id:1 } return B if options["policy.default"].inspect == %{>} # both user and model:id are set! return M if options["model"].inspect == %{#} } self.| Model( Song, :update ), before: "operation.new" self.| Policy::Pundit( Auth, :user_and_model? ), before: "operation.new" require "trailblazer/operation/resolver" self.| Resolver(), before: "operation.new" self.| :process class P < self; end class B < self; end class M < self; end def process(*); self["x"] = self.class end end it { A["pipetree"].inspect.must_equal %{[&model.build,&policy.default.eval,>>builder.call,>>operation.new,&process]} } it { r=A.({ some: "params", id: 1 }, { "current_user" => Module }) puts r.inspect } it { A.({ some: "params", id: 1 }, { "current_user" => Module })["x"].must_equal A::P } it { A.({ id: 3 }, { "current_user" => Module })["x"].must_equal A::B } it { A.({ id: 9 }, { "current_user" => Module })["x"].must_equal A::M } end