module MtkFramework::ActiveInteractionMocks::InteractionMocksHelper

Public Instance Methods

mock_interaction( klass, methods: nil, failing: false, mandatory: true, expected_params: nil, additional_params: nil, return_proc: nil, call_original: false ) { |self| ... } click to toggle source
# File lib/mtk_framework/active_interaction_mocks/interaction_mocks_helper.rb, line 6
def mock_interaction(
  klass,
  methods: nil,
  failing: false,
  mandatory: true,
  expected_params: nil,
  additional_params: nil,
  return_proc: nil,
  call_original: false
)
  stubbed_methods = methods || (mandatory ? [:run] : %i[run run!])

  spec_method = mandatory ? :expect : :allow
  const_name = failing ? 'Fail' : 'Mocked'
  mocking_klass = klass.const_get(const_name)

  if block_given? || return_proc.present?
    mocking_klass = Class.new(mocking_klass)
    test_scope = self

    mocking_klass.define_method :execute do
      return_value = yield self if block_given?
      if return_proc.present?
        return_value = test_scope.instance_exec(&return_proc)
      end

      return_value
    end

    mocking_klass.define_singleton_method :name do
      "#{klass.name}::#{const_name}"
    end
  end

  stubbed_methods.map do |stubbed_method|
    block = lambda { |*params|
      mocking_klass.send(stubbed_method, *params, &block)
    }

    rspec_sentence = receive(stubbed_method, &block)

    if expected_params
      with = expected_params.respond_to?(:call) ? instance_eval(&expected_params) : expected_params
      rspec_sentence.with(with, &block)
    end

    additional_params&.call(rspec_sentence)

    rspec_sentence.and_call_original if call_original

    send(spec_method, klass).to rspec_sentence
  end
end