Sha256: 4747b4bce4a5e5c4f7fd5f9738a51fe555e4bdef19e0164b0c3b7d1ded4656cf

Contents?: true

Size: 1.15 KB

Versions: 4

Compression:

Stored size: 1.15 KB

Contents

module Rack::App::Test::Utils

  extend self

  def format_properties(properties)
    raise('use hash format such as params: {"key" => "value"} or headers with the same concept') unless properties.is_a?(Hash)
    properties[:params] ||= {}
    properties[:headers]||= {}

    properties
  end

  def rack_app_by(subject_class, constructors)
    app_class = subject_class.respond_to?(:call) ? subject_class : Class.new(Rack::App)
    constructors.each { |constructor| app_class.class_eval(&constructor) }
    return app_class
  end

  def env_by(properties)

    properties = format_properties(properties)
    env = properties[:headers].reduce({}) { |m, (k, v)| m.merge("HTTP_#{k.to_s.gsub('-', '_').upcase}" => v.to_s) }
    payload = properties.delete(:payload)
    env["rack.input"]= ::Rack::Lint::InputWrapper.new(string_io_for(payload))
    env[::Rack::QUERY_STRING]= Rack::App::Utils.encode_www_form(properties[:params].to_a)
    env.merge!(properties[:env] || {})

    env
  end

  def string_io_for(payload)
    case payload

      when IO
        payload

      when String
        StringIO.new(payload.to_s)

      else
        StringIO.new('')

    end
  end

end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
rack-app-5.1.0 lib/rack/app/test/utils.rb
rack-app-5.0.0 lib/rack/app/test/utils.rb
rack-app-5.0.0.rc2 lib/rack/app/test/utils.rb
rack-app-5.0.0.rc1 lib/rack/app/test/utils.rb