lib/rack/app/test.rb in rack-app-0.9.0 vs lib/rack/app/test.rb in rack-app-0.9.1
- old
+ new
@@ -2,27 +2,33 @@
require 'rack/app'
module Rack::App::Test
# magic ;)
def self.included(klass)
+ class << klass
- klass.define_singleton_method :rack_app do |rack_app_class=nil, &constructor|
+ define_method(:rack_app) do |*args, &constructor|
- subject_app = rack_app_class.is_a?(Class) ? rack_app_class : Class.new(Rack::App)
- subject_app.class_eval(&constructor) unless constructor.nil?
+ rack_app_class = args.shift
+ subject_app = rack_app_class.is_a?(Class) ? rack_app_class : Class.new(Rack::App)
+ subject_app.class_eval(&constructor) unless constructor.nil?
- klass.__send__ :define_method, :rack_app do
- @rack_app = subject_app
+ define_method(:rack_app) do
+ subject_app
+ end
+
end
end
-
end
[:get, :post, :put, :delete, :options].each do |request_method|
- define_method(request_method) do |url, properties={}|
- rack_app.call(request_env_by(request_method, url, properties)).last
+ define_method(request_method) do |properties|
+ properties ||= Hash.new
+ url = properties.delete(:url)
+ request_env = request_env_by(request_method, url, properties)
+ rack_app.call(request_env).last
end
end
def format_properties(properties)
raise('use hash format such as params: {"key" => "value"} or headers with the same concept') unless properties.is_a?(Hash)
@@ -33,31 +39,76 @@
end
def request_env_by(request_method, url, raw_properties)
properties = format_properties(raw_properties)
- URI.encode_www_form(properties[:params].to_a)
+ additional_headers = properties[:headers].reduce({}) { |m, (k, v)| m.merge("HTTP_#{k.to_s.gsub('-', '_').upcase}" => v.to_s) }
- additional_headers = properties[:headers].reduce({}) { |m,(k, v)| m.merge("HTTP_#{k.to_s.gsub('-', '_').upcase}" => v.to_s) }
-
{
"REMOTE_ADDR" => "192.168.56.1",
"REQUEST_METHOD" => request_method.to_s.upcase,
"REQUEST_PATH" => url,
"REQUEST_URI" => url,
"SERVER_PROTOCOL" => "HTTP/1.1",
"CONTENT_LENGTH" => "0",
"CONTENT_TYPE" => "application/x-www-form-urlencoded",
"SERVER_NAME" => "hds-dev.ett.local",
"SERVER_PORT" => "80",
- "QUERY_STRING" => URI.encode_www_form(properties[:params].to_a),
+ "QUERY_STRING" => encode_www_form(properties[:params].to_a),
"HTTP_VERSION" => "HTTP/1.1",
"HTTP_USER_AGENT" => "spec",
"HTTP_HOST" => "spec.local",
"HTTP_ACCEPT_ENCODING" => "gzip;q=1.0,deflate;q=0.6,identity;q=0.3",
"HTTP_ACCEPT" => "*/*",
"HTTP_CONNECTION" => "close"
}.merge(additional_headers)
+ end
+
+ def encode_www_form(enum)
+ enum.map do |k, v|
+ if v.nil?
+ encode_www_form_component(k)
+ elsif v.respond_to?(:to_ary)
+ v.to_ary.map do |w|
+ str = encode_www_form_component(k)
+ unless w.nil?
+ str << '='
+ str << encode_www_form_component(w)
+ end
+ end.join('&')
+ else
+ str = encode_www_form_component(k)
+ str << '='
+ str << encode_www_form_component(v)
+ end
+ end.join('&')
+ end
+
+ TBLENCWWWCOMP_ = {} # :nodoc:
+ 256.times do |i|
+ TBLENCWWWCOMP_['%%%02X' % i] = i.chr
+ end
+ TBLENCWWWCOMP_[' '] = '+'
+ TBLENCWWWCOMP_.freeze
+ TBLDECWWWCOMP = {} # :nodoc:
+ 256.times do |i|
+ h, l = i>>4, i&15
+ TBLDECWWWCOMP[i.chr]= '%%%X%X' % [h, l]
+ TBLDECWWWCOMP[i.chr]= '%%%X%X' % [h, l]
+ TBLDECWWWCOMP[i.chr]= '%%%x%X' % [h, l]
+ TBLDECWWWCOMP[i.chr]= '%%%X%x' % [h, l]
+ TBLDECWWWCOMP[i.chr]= '%%%x%x' % [h, l]
+ end
+ TBLDECWWWCOMP['+'] = ' '
+ TBLDECWWWCOMP.freeze
+
+ def encode_www_form_component(str)
+ str = str.to_s.dup
+
+ TBLENCWWWCOMP_.each do |from,to|
+ str.gsub!(from,to)
+ end
+ str
end
end
\ No newline at end of file