brentsnook/shokkenki-consumer

View on GitHub
lib/shokkenki/consumer/stubber/stub_server_middleware.rb

Summary

Maintainability
A
0 mins
Test Coverage
require_relative 'interactions'
require_relative 'interactions_middleware'
require_relative 'stubbed_response_middleware'
require_relative 'unmatched_requests_middleware'
require_relative 'unused_interactions_middleware'

# adapted from middleware in https://github.com/jnicklas/capybara/blob/master/lib/capybara/server.rb
module Shokkenki
  module Consumer
    module Stubber
      class StubServerMiddleware

        attr_accessor :error

        def initialize
          @interactions = Interactions.new
          @middlewares = {
            %r{^#{identify_path}} => lambda(&method(:identify)),
            %r{^/shokkenki/interactions/unused} => UnusedInteractionsMiddleware.new(@interactions),
            %r{^/shokkenki/interactions} => InteractionsMiddleware.new(@interactions),
            %r{^/shokkenki/requests/unmatched} => UnmatchedRequestsMiddleware.new(@interactions),
            /.*/ => StubbedResponseMiddleware.new(@interactions)
          }
        end

        def call env
          begin
            handler = @middlewares.find {|path, m| path.match(env['PATH_INFO']) }[1]
            handler.call env
          rescue StandardError => e
            @error = e unless @error
            raise e
          end
        end

        def identify env
          [200, {}, [object_id.to_s]]
        end

        def identify_path
          '/shokkenki/__identify__'
        end
      end
    end
  end
end