123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- require './resource_path'
- require './response_check'
- require 'test/unit'
- require 'digest'
- class HTTPResponseTest < Test::Unit::TestCase
- def default_test; end # placeholder to stop Test::Unit from complaining
- def self.useragent=(useragent)
- ResponseCheck.useragent = useragent
- end
- def self.reset_useragent
- ResponseCheck.useragent = nil
- end
- def self.ssl_no_verify=(verify)
- ResponseCheck.ssl_no_verify = verify
- end
- # no accessors needed, as every class that is derived from this one can be adjusted featurewise by just setting:
- # @useragent
- # @ssl_no_verify
- def self.uri_be_code(options)
- @get_uri = options[:uri].to_s
- @http_code = options[:code].to_s
- @last_uri = @get_uri
- @last_code = @http_code
- id = Digest::SHA1.hexdigest "#{@get_uri}#{@http_code}#{@ssl_no_verify}#{@useragent}"
- id = id[0..7]
- #puts "uri to be code ssl_no_verify: " + @ssl_no_verify.to_s
- class_eval <<-CODE
- def test_#{name_for(@get_uri)}_response_code_should_be_#{@http_code}_#{id}
- check = ResponseCheck.new(:get_uri => '#{@get_uri}')
- if #{@ssl_no_verify}
- check.ssl_no_verify = #{@ssl_no_verify}
- end
- if '#{@useragent}'.size > 0
- check.useragent = '#{@useragent}'
- end
- assert_equal('#{@http_code}', check.response.code,
- "'" + check.get_uri + "' says '" + check.response.code + "' instead of '#{@http_code}'.")
- end
- CODE
- end
- def self.uri_be_success(options)
- @get_uri = options.fetch(:uri)
- @last_uri = @get_uri
- id = Digest::SHA1.hexdigest "#{@get_uri}#{@ssl_no_verify}"
- id = id[0..7]
- class_eval (
- <<-CODE
- def test_#{name_for(@get_uri)}_response_should_be_success_#{id}
- check = ResponseCheck.new(:get_uri => '#{@get_uri}')
- if #{@ssl_no_verify}
- check.ssl_no_verify = #{@ssl_no_verify}
- end
- if '#{@useragent}'.size > 0
- check.useragent = '#{@useragent}'
- end
- assert_equal(true, check.success?,
- "'" + check.get_uri + "' says '" + check.response.code + "' instead of '2xx'-something.")
- end
- CODE
- )
- end
- def self.uri_body_contains(options)
- @get_uri = options.fetch(:uri, @last_to)
- contains = nil
- contains_trueness = false
- if (options[:strings] != nil) and (options[:strings].is_a?(Array))
- contains = options[:strings]
- contains_trueness = true
- else
- abort "'uri_body_contains :strings => ['abc']' is missing. Remember, must be array."
- end
- @last_uri = @get_uri
- contains.each do |string|
- id = Digest::SHA1.hexdigest "#{@get_uri}#{string}#{@ssl_no_verify}"
- id = id[0..7]
- #puts string
- class_eval <<-CODE
- def test_#{name_for(@get_uri)}_response_contains_a_string_#{id}
- check = ResponseCheck.new(:get_uri => '#{@get_uri}')
- if #{@ssl_no_verify}
- check.ssl_no_verify = #{@ssl_no_verify}
- end
- if '#{@useragent}'.size > 0
- check.useragent = '#{@useragent}'
- end
- to_match = '#{string}'
- matched = check.body_contains?(to_match)
- assert_equal(true, matched,
- "'" + check.get_uri + "' does not contain '" + to_match + "' inside response body.")
- end
- CODE
- end
- end
- def self.uri_should_redirect(options = {})
- begin
- @get_uri = options.fetch(:from, @last_to)
- wanted_dst_uri = options.fetch(:to)
- rescue
- abort "Usage: uri_should_redirect [:from => '',] :to => ''\n :from defaults to @last_to"
- end
- if @get_uri == wanted_dst_uri
- abort "uri_should_redirect: :to must be different than :from. Both were '#{wanted_dst_uri}'."
- end
- by_code = nil
- by_code_trueness = false
- if options[:by] != nil
- if options[:by].to_i >= 300 and options[:by].to_i < 400
- by_code = options[:by].to_i
- @last_code = by_code
- by_code_trueness = true
- else
- abort "uri_should_redirect: :by must be in 300 to 399 range. Not '#{options[:by]}'."
- end
- end
- @last_to = wanted_dst_uri
- @last_from = @get_uri
- id = Digest::SHA1.hexdigest "#{@get_uri}#{wanted_dst_uri}#{by_code}#{@ssl_no_verify}#{@useragent}"
- id = id[0..7]
- class_eval <<-CODE
- def test_#{name_for(@get_uri)}_should_redirect_to_#{name_for(wanted_dst_uri)}_#{id}
- check = ResponseCheck.new(:get_uri => '#{@get_uri}')
- check.wanted_dst_uri = '#{wanted_dst_uri}'
- if #{@ssl_no_verify}
- check.ssl_no_verify = #{@ssl_no_verify}
- end
- if '#{@useragent}'.size > 0
- check.useragent = '#{@useragent}'
- end
- assert_equal(true, check.redirect?,
- "'" + check.get_uri + "' is not redirecting at all (" + check.response.code + "), but we expected a redirection to '" + check.wanted_dst_uri + "'.")
- assert_equal(check.wanted_dst_uri, check.redirected_uri,
- "'" + check.get_uri + "' is not redirecting to '" + check.wanted_dst_uri + "'.")
- @response = check.response
-
- if #{by_code_trueness}
- assert_equal('#{by_code}', check.response.code,
- "The redirection is not the wanted '#{by_code}' redirect. It's a '" + check.response.code + "'." +
- "From '" + check.get_uri + "' to '" + check.wanted_dst_uri + "'")
- end
- end
- CODE
- end
- def self.path_should_redirect(source, options)
- source_path = ResourcePath.new(source, :param => 'subdir').to_s
- destination_path = ResourcePath.new(options[:to], :param => 'subdir').to_s
-
- permanent = options.fetch(:permanent, true)
-
- class_eval <<-CODE
- def test_#{name_for(source_path)}_should_redirect_to_#{name_for(destination_path)}
- check = ResponseCheck.new(:src_path => '#{source_path}', :dst_path => '#{destination_path}')
- if #{@ssl_no_verify}
- check.ssl_no_verify = #{@ssl_no_verify}
- end
- if '#{@useragent}'.size > 0
- check.useragent = '#{@useragent}'
- end
-
- assert_equal true, check.redirect?, "'#{source_path}' is not redirecting"
- assert_equal '#{destination_path}', check.redirected_path,
- "'#{source_path}' is not redirecting to '#{destination_path}'"
-
- if #{permanent}
- assert_equal true, check.permanent_redirect?,
- "The redirection from '#{source_path}' to '#{destination_path}' doesn't appear to be a permanent redirect"
- end
- end
- CODE
- end
- def self.path_should_not_redirect(path)
- class_eval <<-CODE
- def test_#{name_for(path)}_should_not_redirect
- check = ResponseCheck.new(:src_path => '#{path}')
- if #{@ssl_no_verify}
- check.ssl_no_verify = #{@ssl_no_verify}
- end
- if '#{@useragent}'.size > 0
- check.useragent = '#{@useragent}'
- end
-
- assert_equal false, check.redirect?, "#{path} is redirecting"
- assert_equal true, check.success?, "#{path} is not a success response"
- end
- CODE
- end
- private
- def self.name_for(path)
- name = path.gsub(/\W+/, '_')
- name.gsub!(/^_+/, '')
- name.gsub!(/_+$/, '')
- name = 'root' if name == ''
- name
- end
- end
|