http_redirect_test 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), "http_redirect_test", "http_redirect_test")
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), "redirect_check")
|
|
2
|
+
require File.join(File.dirname(__FILE__), "resource_path")
|
|
3
|
+
require 'test/unit'
|
|
4
|
+
|
|
5
|
+
class HTTPRedirectTest < Test::Unit::TestCase
|
|
6
|
+
|
|
7
|
+
def default_test; end # placeholder to stop Test::Unit from complaining
|
|
8
|
+
|
|
9
|
+
def self.domain=(domain)
|
|
10
|
+
RedirectCheck.domain = domain
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.should_not_redirect(path)
|
|
14
|
+
class_eval <<-CODE
|
|
15
|
+
def test_#{name_for(path)}_should_not_redirect
|
|
16
|
+
check = RedirectCheck.new('#{path}')
|
|
17
|
+
assert_equal false, check.redirected?, "#{path} is redirecting"
|
|
18
|
+
assert_equal true, check.success?, "#{path} is not a success response"
|
|
19
|
+
end
|
|
20
|
+
CODE
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.name_for(path)
|
|
24
|
+
name = path.gsub(/\W+/, '_')
|
|
25
|
+
name.gsub!(/^_+/, '')
|
|
26
|
+
name.gsub!(/_+$/, '')
|
|
27
|
+
|
|
28
|
+
name = 'root' if name == ''
|
|
29
|
+
|
|
30
|
+
name
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def self.should_redirect(source, options)
|
|
34
|
+
source_path = ResourcePath.new(source, :param => 'subdir').to_s
|
|
35
|
+
destination_path = ResourcePath.new(options[:to], :param => 'subdir').to_s
|
|
36
|
+
|
|
37
|
+
permanent = options.fetch(:permanent, true)
|
|
38
|
+
|
|
39
|
+
class_eval <<-CODE
|
|
40
|
+
def test_#{name_for(source_path)}_should_redirect_to_#{name_for(destination_path)}
|
|
41
|
+
redirection = RedirectCheck.new('#{source_path}', '#{destination_path}')
|
|
42
|
+
assert_equal true, redirection.redirected?, "'#{source_path}' is not redirecting"
|
|
43
|
+
assert_equal '#{destination_path}', redirection.redirected_path,
|
|
44
|
+
"'#{source_path}' is not redirecting to '#{destination_path}'"
|
|
45
|
+
if #{permanent}
|
|
46
|
+
assert_equal true, redirection.permanent_redirect?,
|
|
47
|
+
"The redirection from '#{source_path}' to '#{destination_path}' doesn't appear to be a permanent redirect"
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
CODE
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
require 'uri'
|
|
2
|
+
require 'net/http'
|
|
3
|
+
|
|
4
|
+
class RedirectCheck
|
|
5
|
+
|
|
6
|
+
def self.domain=(domain)
|
|
7
|
+
@domain = domain
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.domain
|
|
11
|
+
@domain
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
attr_reader :source_path, :destination_path
|
|
15
|
+
|
|
16
|
+
def initialize(source_path, destination_path = nil)
|
|
17
|
+
@source_path = source_path.to_s
|
|
18
|
+
@destination_path = destination_path.to_s
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def uri
|
|
22
|
+
URI.parse("http://#{self.class.domain}#{source_path}")
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def response
|
|
26
|
+
@response ||= Net::HTTP.start(uri.host, uri.port) {|http| http.head(uri.path) }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def success?
|
|
30
|
+
response.is_a?(Net::HTTPOK)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def redirected?
|
|
34
|
+
response.is_a?(Net::HTTPRedirection)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def permanent_redirect?
|
|
38
|
+
redirected? && response.is_a?(Net::HTTPMovedPermanently)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def redirected_path
|
|
42
|
+
response['location'].sub(/#{Regexp.escape("#{uri.scheme}://#{uri.host}")}/, '') if redirected?
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
class ResourcePath
|
|
2
|
+
|
|
3
|
+
attr_writer :param
|
|
4
|
+
|
|
5
|
+
def initialize(path, options = {})
|
|
6
|
+
@path = path
|
|
7
|
+
@param = options[:param]
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def param
|
|
11
|
+
@param ||= (0...8).map{65.+(rand(25)).chr}.join
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def to_s
|
|
15
|
+
@path.gsub('*', param)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: http_redirect_test
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Matt House
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
|
|
12
|
+
date: 2009-04-08 00:00:00 +01:00
|
|
13
|
+
default_executable:
|
|
14
|
+
dependencies: []
|
|
15
|
+
|
|
16
|
+
description:
|
|
17
|
+
email: matt@theshadowaspect.com
|
|
18
|
+
executables: []
|
|
19
|
+
|
|
20
|
+
extensions: []
|
|
21
|
+
|
|
22
|
+
extra_rdoc_files: []
|
|
23
|
+
|
|
24
|
+
files:
|
|
25
|
+
- lib/http_redirect_test/http_redirect_test.rb
|
|
26
|
+
- lib/http_redirect_test/redirect_check.rb
|
|
27
|
+
- lib/http_redirect_test/resource_path.rb
|
|
28
|
+
- lib/http_redirect_test.rb
|
|
29
|
+
has_rdoc: false
|
|
30
|
+
homepage: http://github.com/shadowaspect
|
|
31
|
+
post_install_message:
|
|
32
|
+
rdoc_options: []
|
|
33
|
+
|
|
34
|
+
require_paths:
|
|
35
|
+
- lib
|
|
36
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ">="
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: "0"
|
|
41
|
+
version:
|
|
42
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - ">="
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: "0"
|
|
47
|
+
version:
|
|
48
|
+
requirements: []
|
|
49
|
+
|
|
50
|
+
rubyforge_project:
|
|
51
|
+
rubygems_version: 1.3.1
|
|
52
|
+
signing_key:
|
|
53
|
+
specification_version: 2
|
|
54
|
+
summary: A subclass of Test::Unit::TestCase to allow for http redirect testing, packaged from a gist by Patrick Reagan of Viget Labs
|
|
55
|
+
test_files: []
|
|
56
|
+
|