webmock 0.7.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.
Files changed (59) hide show
  1. data/.gitignore +21 -0
  2. data/LICENSE +281 -0
  3. data/README.md +170 -0
  4. data/Rakefile +54 -0
  5. data/VERSION +1 -0
  6. data/lib/webmock.rb +18 -0
  7. data/lib/webmock/adapters/rspec.rb +23 -0
  8. data/lib/webmock/adapters/rspec/matchers.rb +19 -0
  9. data/lib/webmock/adapters/rspec/request_profile_matcher.rb +37 -0
  10. data/lib/webmock/adapters/rspec/webmock_matcher.rb +45 -0
  11. data/lib/webmock/adapters/test_unit.rb +25 -0
  12. data/lib/webmock/config.rb +7 -0
  13. data/lib/webmock/errors.rb +5 -0
  14. data/lib/webmock/http_lib_adapters/net_http.rb +129 -0
  15. data/lib/webmock/request_execution_verifier.rb +22 -0
  16. data/lib/webmock/request_profile.rb +67 -0
  17. data/lib/webmock/request_registry.rb +47 -0
  18. data/lib/webmock/request_stub.rb +26 -0
  19. data/lib/webmock/response.rb +31 -0
  20. data/lib/webmock/url.rb +46 -0
  21. data/lib/webmock/util/hash_counter.rb +12 -0
  22. data/lib/webmock/utility.rb +65 -0
  23. data/lib/webmock/webmock.rb +58 -0
  24. data/spec/net_http_spec.rb +33 -0
  25. data/spec/other_net_http_libs_spec.rb +37 -0
  26. data/spec/request_execution_verifier_spec.rb +51 -0
  27. data/spec/request_profile_spec.rb +166 -0
  28. data/spec/request_registry_spec.rb +114 -0
  29. data/spec/request_stub_spec.rb +54 -0
  30. data/spec/response_spec.rb +59 -0
  31. data/spec/spec.opts +1 -0
  32. data/spec/spec_helper.rb +58 -0
  33. data/spec/util/hash_counter_spec.rb +24 -0
  34. data/spec/utility_spec.rb +70 -0
  35. data/spec/vendor/right_http_connection-1.2.4/History.txt +59 -0
  36. data/spec/vendor/right_http_connection-1.2.4/Manifest.txt +7 -0
  37. data/spec/vendor/right_http_connection-1.2.4/README.txt +54 -0
  38. data/spec/vendor/right_http_connection-1.2.4/Rakefile +103 -0
  39. data/spec/vendor/right_http_connection-1.2.4/lib/net_fix.rb +160 -0
  40. data/spec/vendor/right_http_connection-1.2.4/lib/right_http_connection.rb +435 -0
  41. data/spec/vendor/right_http_connection-1.2.4/setup.rb +1585 -0
  42. data/spec/vendor/samuel-0.2.1/.document +5 -0
  43. data/spec/vendor/samuel-0.2.1/.gitignore +5 -0
  44. data/spec/vendor/samuel-0.2.1/LICENSE +20 -0
  45. data/spec/vendor/samuel-0.2.1/README.rdoc +70 -0
  46. data/spec/vendor/samuel-0.2.1/Rakefile +62 -0
  47. data/spec/vendor/samuel-0.2.1/VERSION +1 -0
  48. data/spec/vendor/samuel-0.2.1/lib/samuel.rb +52 -0
  49. data/spec/vendor/samuel-0.2.1/lib/samuel/net_http.rb +10 -0
  50. data/spec/vendor/samuel-0.2.1/lib/samuel/request.rb +96 -0
  51. data/spec/vendor/samuel-0.2.1/samuel.gemspec +69 -0
  52. data/spec/vendor/samuel-0.2.1/test/request_test.rb +193 -0
  53. data/spec/vendor/samuel-0.2.1/test/samuel_test.rb +42 -0
  54. data/spec/vendor/samuel-0.2.1/test/test_helper.rb +66 -0
  55. data/spec/vendor/samuel-0.2.1/test/thread_test.rb +32 -0
  56. data/spec/webmock_spec.rb +492 -0
  57. data/test/test_helper.rb +9 -0
  58. data/test/test_webmock.rb +56 -0
  59. metadata +144 -0
@@ -0,0 +1,47 @@
1
+ module WebMock
2
+
3
+ class RequestRegistry
4
+ include Singleton
5
+
6
+ attr_accessor :request_stubs, :requested
7
+
8
+ def initialize
9
+ reset_webmock
10
+ end
11
+
12
+ def reset_webmock
13
+ self.request_stubs = []
14
+ self.requested = HashCounter.new
15
+ end
16
+
17
+ def register_request_stub(stub)
18
+ request_stubs.insert(0, stub)
19
+ stub
20
+ end
21
+
22
+ def registered_request?(request_profile)
23
+ stub_for(request_profile)
24
+ end
25
+
26
+ def response_for_request(request_profile)
27
+ stub = stub_for(request_profile)
28
+ self.requested.put(request_profile)
29
+ stub ? stub.response : nil
30
+ end
31
+
32
+ def times_executed(request_profile)
33
+ self.requested.hash.select { |executed_request_profile, times_executed|
34
+ executed_request_profile.match(request_profile)
35
+ }.inject(0) {|sum, (_, times_executed)| sum + times_executed }
36
+ end
37
+
38
+ private
39
+
40
+ def stub_for(request_profile)
41
+ request_stubs.detect { |registered_request_stub|
42
+ request_profile.match(registered_request_stub.request_profile)
43
+ }
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,26 @@
1
+ module WebMock
2
+ class RequestStub
3
+ attr_accessor :request_profile, :response
4
+
5
+ def initialize(method, url)
6
+ @request_profile = RequestProfile.new(method, url)
7
+ @response = WebMock::Response.new
8
+ self
9
+ end
10
+
11
+ def with(params)
12
+ @request_profile.body = params[:body]
13
+ @request_profile.headers = Utility.normalize_headers(params[:headers])
14
+ self
15
+ end
16
+
17
+ def to_return(response_hash)
18
+ @response = WebMock::Response.new(response_hash)
19
+ end
20
+
21
+ def to_raise(exception)
22
+ @response = WebMock::Response.new({:exception => exception})
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,31 @@
1
+ module WebMock
2
+ class Response
3
+
4
+ def initialize(options = {})
5
+ @options = options
6
+ end
7
+
8
+ def headers
9
+ Utility.normalize_headers(@options[:headers])
10
+ end
11
+
12
+ def body
13
+ return '' unless @options.has_key?(:body)
14
+
15
+ if !@options[:body].include?("\0") && File.exists?(@options[:body]) && !File.directory?(@options[:body])
16
+ File.read(@options[:body])
17
+ else
18
+ @options[:body]
19
+ end
20
+ end
21
+
22
+ def status
23
+ @options.has_key?(:status) ? @options[:status] : 200
24
+ end
25
+
26
+ def raise_error_if_any
27
+ raise @options[:exception].new('Exception from WebMock') if @options.has_key?(:exception)
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,46 @@
1
+ module WebMock
2
+
3
+ class URL
4
+
5
+ def self.normalize_uri(uri)
6
+ return uri if uri.is_a?(Regexp)
7
+ normalized_uri =
8
+ case uri
9
+ when URI then uri
10
+ when String
11
+ uri = 'http://' + uri unless uri.match('^https?://')
12
+ URI.parse(uri)
13
+ end
14
+ normalized_uri.query = sort_query_params(normalized_uri.query)
15
+ normalized_uri.normalize
16
+ end
17
+
18
+ def self.variations_of_uri_as_strings(uri_object)
19
+ normalized_uri = normalize_uri(uri_object.dup)
20
+ normalized_uri_string = normalized_uri.to_s
21
+
22
+ variations = [normalized_uri_string]
23
+
24
+ # if the port is implied in the original, add a copy with an explicit port
25
+ if normalized_uri.default_port == normalized_uri.port
26
+ variations << normalized_uri_string.sub(
27
+ /#{Regexp.escape(normalized_uri.request_uri)}$/,
28
+ ":#{normalized_uri.port}#{normalized_uri.request_uri}")
29
+ end
30
+
31
+ variations
32
+ end
33
+
34
+ private
35
+
36
+ def self.sort_query_params(query)
37
+ if query.nil? || query.empty?
38
+ nil
39
+ else
40
+ query.split('&').sort.join('&')
41
+ end
42
+ end
43
+
44
+ end
45
+
46
+ end
@@ -0,0 +1,12 @@
1
+ class HashCounter
2
+ attr_accessor :hash
3
+ def initialize
4
+ self.hash = {}
5
+ end
6
+ def put key, num=1
7
+ hash[key] = (hash[key] || 0) + num
8
+ end
9
+ def get key
10
+ hash[key] || 0
11
+ end
12
+ end
@@ -0,0 +1,65 @@
1
+ #This file is taken from FakeWeb (fakeweb.rubyforge.org/) and adopted
2
+
3
+ module WebMock
4
+ module Utility #:nodoc:
5
+
6
+ def self.decode_userinfo_from_header(header)
7
+ header.sub(/^Basic /, "").unpack("m").first
8
+ end
9
+
10
+ def self.encode_unsafe_chars_in_userinfo(userinfo)
11
+ unsafe_in_userinfo = /[^#{URI::REGEXP::PATTERN::UNRESERVED};&=+$,]|^(#{URI::REGEXP::PATTERN::ESCAPED})/
12
+ userinfo.split(":").map { |part| URI.escape(part, unsafe_in_userinfo) }.join(":")
13
+ end
14
+
15
+ def self.strip_default_port_from_uri(uri)
16
+ case uri
17
+ when %r{^http://} then uri.sub(%r{:80(/|$)}, '\1')
18
+ when %r{^https://} then uri.sub(%r{:443(/|$)}, '\1')
19
+ else uri
20
+ end
21
+ end
22
+
23
+ def self.puts_warning_for_net_http_around_advice_libs_if_needed
24
+ libs = {"Samuel" => defined?(Samuel)}
25
+ warnings = libs.select { |_, loaded| loaded }.map do |name, _|
26
+ <<-TEXT.gsub(/ {10}/, '')
27
+ \e[1mWarning: WebMock was loaded after #{name}\e[0m
28
+ * #{name}'s code is being ignored when a request is handled by WebMock,
29
+ because both libraries work by patching Net::HTTP.
30
+ * To fix this, just reorder your requires so that WebMock is before #{name}.
31
+ TEXT
32
+ end
33
+ $stderr.puts "\n" + warnings.join("\n") + "\n" if warnings.any?
34
+ end
35
+
36
+ def self.record_loaded_net_http_replacement_libs
37
+ libs = {"RightHttpConnection" => defined?(RightHttpConnection)}
38
+ @loaded_net_http_replacement_libs = libs.map { |name, loaded| name if loaded }.compact
39
+ end
40
+
41
+ def self.puts_warning_for_net_http_replacement_libs_if_needed
42
+ libs = {"RightHttpConnection" => defined?(RightHttpConnection)}
43
+ warnings = libs.select { |_, loaded| loaded }.
44
+ reject { |name, _| @loaded_net_http_replacement_libs.include?(name) }.
45
+ map do |name, _|
46
+ <<-TEXT.gsub(/ {10}/, '')
47
+ \e[1mWarning: #{name} was loaded after WebMock\e[0m
48
+ * WebMock's code is being ignored, because #{name} replaces parts of
49
+ Net::HTTP without deferring to other libraries. This will break Net::HTTP requests.
50
+ * To fix this, just reorder your requires so that #{name} is before WebMock.
51
+ TEXT
52
+ end
53
+ $stderr.puts "\n" + warnings.join("\n") + "\n" if warnings.any?
54
+ end
55
+
56
+ def self.normalize_headers(headers)
57
+ return nil unless headers
58
+ array = headers.map { |name, value|
59
+ [name.to_s.split(/_|-/).map { |segment| segment.capitalize }.join("-"), value.to_s]
60
+ }
61
+ Hash[*array.flatten]
62
+ end
63
+
64
+ end
65
+ end
@@ -0,0 +1,58 @@
1
+ WebMock::Utility.record_loaded_net_http_replacement_libs
2
+ WebMock::Utility.puts_warning_for_net_http_around_advice_libs_if_needed
3
+
4
+
5
+ module WebMock
6
+
7
+ def stub_request(method, url)
8
+ RequestRegistry.instance.register_request_stub(RequestStub.new(method, url))
9
+ end
10
+
11
+ alias_method :stub_http_request, :stub_request
12
+
13
+ def request(method, url)
14
+ RequestProfile.new(method, url)
15
+ end
16
+
17
+ def assert_requested(method, url, options = {})
18
+ expected_times_executed = options.delete(:times) || 1
19
+ request = RequestProfile.new(method, url, options[:body], options[:headers])
20
+ verifier = RequestExecutionVerifier.new(request, expected_times_executed)
21
+ assertion_failure(verifier.failure_message) unless verifier.verify
22
+ end
23
+
24
+ def assert_not_requested(method, url, options = {})
25
+ assert_requested(method, url, options.update(:times => 0))
26
+ end
27
+
28
+ def self.allow_net_connect!
29
+ Config.instance.allow_net_connect = true
30
+ end
31
+
32
+ def self.disable_net_connect!
33
+ Config.instance.allow_net_connect = false
34
+ end
35
+
36
+ def self.net_connect_allowed?
37
+ Config.instance.allow_net_connect
38
+ end
39
+
40
+ def self.registered_request?(request_profile)
41
+ RequestRegistry.instance.registered_request?(request_profile)
42
+ end
43
+
44
+ def self.response_for_request(request_profile, &block)
45
+ RequestRegistry.instance.response_for_request(request_profile, &block)
46
+ end
47
+
48
+ def reset_webmock
49
+ WebMock::RequestRegistry.instance.reset_webmock
50
+ end
51
+
52
+ private
53
+
54
+ def assertion_failure(message)
55
+ raise message
56
+ end
57
+
58
+ end
@@ -0,0 +1,33 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require 'webmock_spec'
3
+ require 'ostruct'
4
+
5
+ include WebMock
6
+
7
+ def http_request(method, url, options = {})
8
+ url = URI.parse(url)
9
+ response = nil
10
+ clazz = Net::HTTP.const_get("#{method.to_s.capitalize}")
11
+ req = clazz.new(url.path, options[:headers])
12
+ req.basic_auth url.user, url.password if url.user
13
+ http = Net::HTTP.new(url.host, url.port)
14
+ http.use_ssl = true if url.scheme == "https"
15
+ response = http.start {|http|
16
+ http.request(req, options[:body])
17
+ }
18
+ OpenStruct.new({
19
+ :body => response.body,
20
+ :headers => response,
21
+ :status => response.code })
22
+ end
23
+
24
+
25
+ describe "Webmock with Net:HTTP" do
26
+
27
+ it_should_behave_like "WebMock"
28
+
29
+ it "should work with block provided" do
30
+ stub_http_request(:get, "www.google.com").to_return(:body => "abc"*100000)
31
+ Net::HTTP.start("www.google.com") { |query| query.get("/") }.body.should == "abc"*100000
32
+ end
33
+ end
@@ -0,0 +1,37 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "loading other Net::HTTP based libraries" do
4
+
5
+ def capture_output_from_requiring(libs, additional_code = "")
6
+ requires = libs.map { |lib| "require '#{lib}'" }.join("; ")
7
+ webmock_dir = "#{File.dirname(__FILE__)}/../lib"
8
+ vendor_dirs = Dir["#{File.dirname(__FILE__)}/vendor/*/lib"]
9
+ load_path_opts = vendor_dirs.unshift(webmock_dir).map { |dir| "-I#{dir}" }.join(" ")
10
+
11
+ # TODO: use the same Ruby executable that this test was invoked with
12
+ `ruby #{load_path_opts} -e "#{requires}; #{additional_code}" 2>&1`
13
+ end
14
+
15
+ it "should requiring samuel before webmock prints warning" do
16
+ output = capture_output_from_requiring %w(samuel webmock)
17
+ output.should match(%r(Warning: WebMock was loaded after Samuel))
18
+ end
19
+
20
+ it "should requiring samuel after webmock does not print warning" do
21
+ output = capture_output_from_requiring %w(webmock samuel)
22
+ output.should be_empty
23
+ end
24
+
25
+ it "should requiring right http connection before webmock and then connecting does not print warning" do
26
+ additional_code = "Net::HTTP.start('example.com')"
27
+ output = capture_output_from_requiring %w(right_http_connection webmock), additional_code
28
+ output.should be_empty
29
+ end
30
+
31
+ it "should requiring right http connection after webmock and then connecting prints warning" do
32
+ additional_code = "Net::HTTP.start('example.com')"
33
+ output = capture_output_from_requiring %w(webmock right_http_connection), additional_code
34
+ output.should match(%r(Warning: RightHttpConnection was loaded after WebMock))
35
+ end
36
+
37
+ end
@@ -0,0 +1,51 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe RequestExecutionVerifier do
4
+ before(:each) do
5
+ @verifier = RequestExecutionVerifier.new
6
+ @request_profile = mock(RequestProfile, :to_s => "www.google.com")
7
+ @verifier.request_profile = @request_profile
8
+ end
9
+
10
+
11
+ describe "failure message" do
12
+
13
+ it "should report failure message" do
14
+ @verifier.times_executed = 0
15
+ @verifier.expected_times_executed = 2
16
+ @verifier.failure_message.should == "The request www.google.com was expected to execute 2 times but it executed 0 times"
17
+ end
18
+
19
+ it "should report failure message correctly when executed times is one" do
20
+ @verifier.times_executed = 1
21
+ @verifier.expected_times_executed = 1
22
+ @verifier.failure_message.should == "The request www.google.com was expected to execute 1 time but it executed 1 time"
23
+ end
24
+
25
+ end
26
+
27
+ describe "verify" do
28
+
29
+ it "should succeed if request was executed expected number of times" do
30
+ RequestRegistry.instance.
31
+ should_receive(:times_executed).with(@request_profile).and_return(10)
32
+ @verifier.expected_times_executed = 10
33
+ @verifier.verify.should be_true
34
+ end
35
+
36
+ it "should fail if request was not executed expected number of times" do
37
+ RequestRegistry.instance.
38
+ should_receive(:times_executed).with(@request_profile).and_return(10)
39
+ @verifier.expected_times_executed = 5
40
+ @verifier.verify.should be_false
41
+ end
42
+
43
+ end
44
+
45
+ def verify
46
+ @times_executed =
47
+ RequestRegistry.instance.times_executed(@request_profile)
48
+ @times_executed == @expected_times_executed
49
+ end
50
+
51
+ end
@@ -0,0 +1,166 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ include WebMock
4
+
5
+ describe RequestProfile do
6
+
7
+ describe "initialization" do
8
+
9
+ it "should have assigned normalized uri" do
10
+ URL.should_receive(:normalize_uri).and_return("www.google.kom")
11
+ profile = RequestProfile.new(:get, "www.google.com")
12
+ profile.uri.should == "www.google.kom"
13
+ end
14
+
15
+ it "should have assigned uri without normalization if uri is URI" do
16
+ URL.should_not_receive(:normalize_uri)
17
+ uri = URI.parse("www.google.com")
18
+ profile = RequestProfile.new(:get, uri)
19
+ profile.uri.should == uri
20
+ end
21
+
22
+ it "should have assigned normalized headers" do
23
+ Utility.should_receive(:normalize_headers).with('A' => 'a').and_return('B' => 'b')
24
+ RequestProfile.new(:get, "www.google.com", nil, 'A' => 'a').headers.should == {'B' => 'b'}
25
+ end
26
+
27
+ it "should have assigned body" do
28
+ RequestProfile.new(:get, "www.google.com", "abc").body.should == "abc"
29
+ end
30
+
31
+ end
32
+
33
+ it "should report string" do
34
+ RequestProfile.new(:get, "www.google.com", "abc", {'A' => 'a', 'B' => 'b'}).to_s.should ==
35
+ "GET http://www.google.com/ with body 'abc' with headers {'A'=>'a', 'B'=>'b'}"
36
+ end
37
+
38
+
39
+ describe "with" do
40
+ before(:each) do
41
+ @request_profile = RequestProfile.new(:get, "www.google.com")
42
+ end
43
+
44
+ it "should assign body to request profile" do
45
+ @request_profile.with(:body => "abc")
46
+ @request_profile.body.should == "abc"
47
+ end
48
+
49
+ it "should assign normalized headers to request profile" do
50
+ Utility.should_receive(:normalize_headers).with('A' => 'a').and_return('B' => 'b')
51
+ @request_profile.with(:headers => {'A' => 'a'})
52
+ @request_profile.headers.should == {'B' => 'b'}
53
+ end
54
+
55
+ end
56
+
57
+ describe "when matching" do
58
+
59
+ it "should match if url matches and method matches" do
60
+ RequestProfile.new(:get, "www.google.com").
61
+ should match(RequestProfile.new(:get, "www.google.com"))
62
+ end
63
+
64
+ it "should match if url matches and method is any" do
65
+ RequestProfile.new(:get, "www.google.com").
66
+ should match(RequestProfile.new(:any, "www.google.com"))
67
+ end
68
+
69
+ it "should not match if other request profile has different method" do
70
+ RequestProfile.new(:get, "www.google.com").
71
+ should_not match(RequestProfile.new(:post, "www.google.com"))
72
+ end
73
+
74
+ it "should match if uri matches other uri" do
75
+ RequestProfile.new(:get, "www.google.com").
76
+ should match(RequestProfile.new(:get, "www.google.com"))
77
+ end
78
+
79
+ it "should match if uri matches other regex uri" do
80
+ RequestProfile.new(:get, "www.google.com").
81
+ should match(RequestProfile.new(:get, /.*google.*/))
82
+ end
83
+
84
+ it "should match for uris with same parameters" do
85
+ RequestProfile.new(:get, "www.google.com?a=1&b=2").
86
+ should match(RequestProfile.new(:get, "www.google.com?a=1&b=2"))
87
+ end
88
+
89
+ it "should not match for uris with different parameters" do
90
+ RequestProfile.new(:get, "www.google.com?a=2&b=1").
91
+ should_not match(RequestProfile.new(:get, "www.google.com?a=1&b=2"))
92
+ end
93
+
94
+ it "should match for parameters in different order" do
95
+ RequestProfile.new(:get, "www.google.com?a=1&b=2").
96
+ should match(RequestProfile.new(:get, "www.google.com?b=2&a=1"))
97
+ end
98
+
99
+ it "should match for same bodies" do
100
+ RequestProfile.new(:get, "www.google.com", "abc").
101
+ should match(RequestProfile.new(:get, "www.google.com", "abc"))
102
+ end
103
+
104
+ it "should not match for different bodies" do
105
+ RequestProfile.new(:get, "www.google.com", "abc").
106
+ should_not match(RequestProfile.new(:get, "www.google.com", "def"))
107
+ end
108
+
109
+ it "should match is other has nil body" do
110
+ RequestProfile.new(:get, "www.google.com", "abc").
111
+ should match(RequestProfile.new(:get, "www.google.com", nil))
112
+ end
113
+
114
+ it "should not match if other has empty body" do
115
+ RequestProfile.new(:get, "www.google.com", "abc").
116
+ should_not match(RequestProfile.new(:get, "www.google.com", ""))
117
+ end
118
+
119
+ it "should match for same headers" do
120
+ RequestProfile.new(:get, "www.google.com", nil, 'Content-Type' => 'image/jpeg').
121
+ should match(RequestProfile.new(:get, "www.google.com", nil, 'Content-Type' => 'image/jpeg'))
122
+ end
123
+
124
+ it "should not match for different values of the same header" do
125
+ RequestProfile.new(:get, "www.google.com", nil, 'Content-Type' => 'image/jpeg').
126
+ should_not match(RequestProfile.new(:get, "www.google.com", nil, 'Content-Type' => 'image/png'))
127
+ end
128
+
129
+ it "should match if request has more headers than other" do
130
+ RequestProfile.new(:get, "www.google.com", nil, 'Content-Type' => 'image/jpeg', 'Content-Length' => '8888').
131
+ should match(RequestProfile.new(:get, "www.google.com", nil, 'Content-Type' => 'image/jpeg'))
132
+ end
133
+
134
+ it "should not match if request has less headers that the other and all match" do
135
+ RequestProfile.new(:get, "www.google.com", nil, 'Content-Type' => 'image/jpeg').
136
+ should_not match(RequestProfile.new(:get, "www.google.com", nil, 'Content-Type' => 'image/jpeg', 'Content-Length' => '8888'))
137
+ end
138
+
139
+ it "should match even is header keys or values are in different format" do
140
+ RequestProfile.new(:get, "www.google.com", nil, :ContentLength => 8888, 'content_type' => 'image/png').
141
+ should match(RequestProfile.new(:get, "www.google.com", nil, 'ContentLength' => '8888', 'Content-type' => 'image/png'))
142
+ end
143
+
144
+ it "should match is other has nil headers" do
145
+ RequestProfile.new(:get, "www.google.com", nil, 'A' => 'a').
146
+ should match(RequestProfile.new(:get, "www.google.com", nil, nil))
147
+ end
148
+
149
+ it "should not match if other has empty headers" do
150
+ RequestProfile.new(:get, "www.google.com", nil, 'A' => 'a').
151
+ should_not match(RequestProfile.new(:get, "www.google.com", nil, {}))
152
+ end
153
+
154
+ it "should not match if profile has no headers but other has headers" do
155
+ RequestProfile.new(:get, "www.google.com", nil, nil).
156
+ should_not match(RequestProfile.new(:get, "www.google.com", nil, {'A'=>'a'}))
157
+ end
158
+
159
+ it "should not match if profile has empty headers but other has headers" do
160
+ RequestProfile.new(:get, "www.google.com", nil, {}).
161
+ should_not match(RequestProfile.new(:get, "www.google.com", nil, {'A'=>'a'}))
162
+ end
163
+
164
+ end
165
+
166
+ end