Sha256: e7bd056390efc0d3fc49ac822ee217ab2ce58d2f523fcafb591a9feab396c24b

Contents?: true

Size: 1.37 KB

Versions: 1

Compression:

Stored size: 1.37 KB

Contents

require "dry-matcher"
require "dry-monads"

RSpec.describe "Custom matcher" do
  let(:transaction) {
    Dry.Transaction(container: container, matcher: Test::CustomMatcher) do
      step :process
      step :validate
      step :persist
    end
  }

  let(:container) {
    {
      process: -> input { Dry::Monads.Right(name: input["name"], email: input["email"]) },
      validate: -> input { input[:email].nil? ? Dry::Monads.Left(:email_required) : Dry::Monads.Right(input) },
      persist:  -> input { Test::DB << input and Dry::Monads.Right(input) }
    }
  }

  before do
    Test::DB = []
    Test::QUEUE = []

    module Test
      CustomMatcher = Dry::Matcher.new(
        yep: Dry::Matcher::Case.new(
          match: -> result { result.right? },
          resolve: -> result { result.value }
        ),
        nup: Dry::Matcher::Case.new(
          match: -> result { result.left? },
          resolve: -> result { result.value.value }
        )
      )
    end
  end

  it "supports a custom matcher" do
    matches = -> m {
      m.yep { |v| "Yep! #{v[:email]}" }
      m.nup { |v| "Nup. #{v.to_s}" }
    }

    input = {"name" => "Jane", "email" => "jane@doe.com"}
    result = transaction.(input, &matches)
    expect(result).to eq "Yep! jane@doe.com"

    input = {"name" => "Jane"}
    result = transaction.(input, &matches)
    expect(result).to eq "Nup. email_required"
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
dry-transaction-0.8.0 spec/integration/custom_matcher_spec.rb