module Futest::Helpers

Constants

CMD

Public Instance Methods

err(*args) click to toggle source

Print error message

# File lib/futest/helpers.rb, line 149
def err(*args)
  x = args[0]

  # Pass :v or :vv to print more information about the error
  puts x.backtrace.join("\n") if args.include?(:vv)
  puts x.message if args.include?(:v)

  # Normally just print the first line in the message
  x.backtrace.first.match(/(\/.+\/.*.rb):(\d{1,9}):/)
  stop(%{#{x.message}\n=> ~/#{$1.split('/')[3..-1].join('/')}}, nil, $2) if $1 and $2

  # Print more if the backtrace doesn't match
  stop(%{#{x.message}\n=> #{x.backtrace[0..60].join("\n")}})
end
green(s) click to toggle source

Colorize input green

# File lib/futest/helpers.rb, line 143
def green(s); out(s); end
is(v1, v2 = :udef, n = line(caller)) click to toggle source

Equality tester

# File lib/futest/helpers.rb, line 38
def is(v1, v2 = :udef, n = line(caller))

  # Use :a? if v2 is not a string and looks like a class
  v2 = {:a? => v2} if !v2.is_a?(String) and v2.to_s[0] =~ /[A-Z]/

  # Use :eq if v2 is defined and it's not a Hash
  v2 = {:eq => v2} if v2 != :udef and !v2.is_a?(Hash)

  # Symbolize keys
  k, v = (v2.is_a?(Hash) ? v2 : {}).inject({}){|q,(k,v)|q[k.to_sym] = v; q}.to_a.flatten

  # Extract values
  s = ["#{v1.class} #{v1} #{CMD[k]} #{v.class} #{v}", nil, n]

  # Set @debug = true to print info
  puts s.join('-') if @debug

  # Stop unless true
  stop(*s) unless
  case k
  when nil then !!v1
  when :eq  then v1 == v
  when :ne  then v1 != v
  when :gt  then v1 > v
  when :gte then v1 >= v
  when :lt  then v1 < v
  when :lte then v1 <= v
  when :in  then v2[:in].include?(v1)
  when :nin then !v2[:nin].include?(v1)
  when :has then v1.has_key?(v2[:has])
  when :a?, :a then v1.is_a?(v)
  else false end
end
line(q) click to toggle source

Get the line number

# File lib/futest/helpers.rb, line 165
def line(q)
  q.first.split(':')[1]
end
out(s, c = :green) click to toggle source

Colorize output, 33 is :green (default), 31 is :red

# File lib/futest/helpers.rb, line 138
def out(s, c = :green)
  z = {:green => 33, :red => 31}; %{\e[#{z[c] || c}m#{s}\e[0m}
end
pull(*args) click to toggle source

Pulls any data source and returns the response

# File lib/futest/helpers.rb, line 78
def pull(*args)
  # Define $host in your test helper
  # or @host before you call pull
  # set @base to add paths to @host
  @host ||= $host
  @base ||= ($base || '')
  stop('@host not defined') unless @host

  @method = args[0].is_a?(Symbol) ? args.delete_at(0) : :get
  @path = (args[0] || '/')
  @params = (args[1] || {})
  @headers = (args[2] || {})
  @headers.merge!(:cookies => @cookies) if @cookies

  args.each do |a|
    @params.merge!(a) if a.is_a?(Hash)
    @method = a if a.is_a?(Symbol)
    @path = a if a.is_a?(String)
  end

  # Add host and base to url
  @url = @host + (@base || '') + @path

  o = {
    :method => @method,
    :url => @url,
    :timeout => 2,
    :payload => @params,
    :headers => @headers
  }
  RestClient::Request.execute(o){|z| @page = z}
  # Make result available in instance variables
  [:code, :cookies, :headers, :history].each{|i| instance_variable_set("@#{i}", @page.send(i))}
  @raw = @page.raw_headers
  @body = @page.body
end
red(s) click to toggle source

Colorize input red

# File lib/futest/helpers.rb, line 146
def red(s); out(s, :red); end
show() click to toggle source

Show the last @body in the browser

# File lib/futest/helpers.rb, line 116
def show
  stop('@body is not defined') unless @body

  # Add @host and @base to all links in HTML to fetch CSS and images
  @body.scan(/(<.*(src|href)=["'](\/?.+)["'].*>)/).each do |m|
    @body.gsub!(m[0], m[0].gsub(m[2], "#{@host}#{@base}#{m[2][0] == '/' ? m[2] : "/#{m[2]}"}")) unless %w[ht //].include?(m[2][0..1])
  end

  # Write body to tmp file
  name = "/tmp/#{Time.now.to_i}_fushow.html"
  File.open(name, 'w'){|f| f.write(@body)}

  # Open with default browser, set Futest.show to change this
  `#{Futest.show} #{name}`
end
stop(str, model = nil, n = line(caller)) click to toggle source

Prints error message and stops execution

# File lib/futest/helpers.rb, line 18
def stop(str, model = nil, n = line(caller))
  m = "#{n}: #{str}"

  # Support for errors when using Object DB ORM
  if model and model.errors and model.errors.any?
    q = model.errors.messages rescue model.errors
    m += ":\n=> " + q.each{|k, v| q[k] = v.join(', ')}.to_json[1..-2].gsub('","', '", "')
  end

  puts red(%{#{m}\n}); exit(0)
end
test(*args) click to toggle source

Prints the test and runs setup methods

# File lib/futest/helpers.rb, line 31
def test(*args)
  n = args[-1].is_a?(Integer) ? args[-1] : line(caller)
  args.select{|r| r.is_a?(Symbol)}.each{|k| send(k)}
  puts green("#{n}: #{args[0]}")
end