Sha256: 72a1bb876091049a37a0d6041e6be0bea23f15cc6fe0869daf2b13e33fc248e0

Contents?: true

Size: 1.7 KB

Versions: 1

Compression:

Stored size: 1.7 KB

Contents

require 'rodakase/transaction'

RSpec.describe 'Rodakase Transaction' do
  subject(:transaction) { Rodakase::Transaction::Composer.new(container) }

  let(:container) do
    {
      validate_params: -> params {
        if params[:email]
          Rodakase::Transaction::Success(params)
        else
          Rodakase::Transaction::Failure(:validation, 'missing email')
        end
      },
      persist_user: -> input {
        input.fmap do |value|
          Test::DB.concat([value])
        end
      },
      render_ui: -> input {
        input.fmap do |db|
          "user #{db.last[:email]} created"
        end
      }
    }
  end

  let(:pipeline) do
    transaction.define do
      step :validate_params do
        step :persist_user, publish: true do
          step :render_ui
        end
      end
    end
  end

  before do
    module Test
      DB = []
    end
  end

  it 'works with success' do
    result = []

    pipeline.(email: 'jane@doe.org') do |m|
      m.success do |value|
        result << value
      end
    end

    expect(result).to include('user jane@doe.org created')
  end

  it 'works with failure' do
    result = []

    pipeline.(foo: 'jane@doe.org') do |m|
      m.failure do |f|
        f.on(:validation) do |err|
          result << err
        end
      end
    end

    expect(result).to include('missing email')
  end

  it 'works with publisher' do
    Test::NOTIFICATIONS = []

    module Test::Listener
      def self.persist_user_success(result)
        result.fmap { |db| Test::NOTIFICATIONS << db.last }
      end
    end

    pipeline.subscribe(persist_user: Test::Listener)

    pipeline.(email: 'jane@doe.org')

    expect(Test::NOTIFICATIONS).to include(email: 'jane@doe.org')
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rodakase-0.0.1 spec/integration/transaction_spec.rb