sandro-fakeweb 1.2.5
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.
- data/CHANGELOG +163 -0
- data/LICENSE.txt +281 -0
- data/README.rdoc +216 -0
- data/Rakefile +78 -0
- data/lib/fake_web.rb +204 -0
- data/lib/fake_web/ext/net_http.rb +76 -0
- data/lib/fake_web/fixture.rb +60 -0
- data/lib/fake_web/registry.rb +127 -0
- data/lib/fake_web/responder.rb +113 -0
- data/lib/fake_web/response.rb +10 -0
- data/lib/fake_web/stub_socket.rb +15 -0
- data/lib/fake_web/utility.rb +44 -0
- data/lib/fakeweb.rb +2 -0
- data/test/fixtures/google_response_from_curl +12 -0
- data/test/fixtures/google_response_with_transfer_encoding +17 -0
- data/test/fixtures/google_response_without_transfer_encoding +11 -0
- data/test/fixtures/test_example.txt +1 -0
- data/test/fixtures/test_txt_file +3 -0
- data/test/test_allow_net_connect.rb +85 -0
- data/test/test_deprecations.rb +54 -0
- data/test/test_fake_authentication.rb +92 -0
- data/test/test_fake_web.rb +535 -0
- data/test/test_fake_web_fixture.rb +64 -0
- data/test/test_fake_web_generate_fixtures.rb +71 -0
- data/test/test_fake_web_open_uri.rb +58 -0
- data/test/test_helper.rb +87 -0
- data/test/test_missing_open_uri.rb +25 -0
- data/test/test_precedence.rb +79 -0
- data/test/test_query_string.rb +45 -0
- data/test/test_regexes.rb +152 -0
- data/test/test_response_headers.rb +73 -0
- data/test/test_trailing_slashes.rb +53 -0
- data/test/test_utility.rb +91 -0
- metadata +127 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), "test_helper")
|
|
2
|
+
|
|
3
|
+
class TestFakeWebFixture < Test::Unit::TestCase
|
|
4
|
+
def setup
|
|
5
|
+
@response = Net::HTTPOK.new("1.1", "200", "OK")
|
|
6
|
+
@path = "."
|
|
7
|
+
@fixture = FakeWeb::Fixture.new(@path, :get, "http://www.apple.com", @response)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_register_fixtures_in_path
|
|
11
|
+
fixture = mock(:register => true)
|
|
12
|
+
YAML.expects(:load_file).with('file').returns(fixture)
|
|
13
|
+
Dir.expects(:glob).yields('file')
|
|
14
|
+
FakeWeb::Fixture.register(@path)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def test_register_fixture_with_fake_web
|
|
18
|
+
FakeWeb.expects(:register_uri).with(:get, "http://www.apple.com", :response => @response)
|
|
19
|
+
@fixture.register
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_file_name_without_path
|
|
23
|
+
assert_equal @fixture.file_name, "GET_www.apple.com.fixture"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_file_name_with_path_and_querystring
|
|
27
|
+
url = "http://www.apple.com/iphone/why-iphone/?q=iphone&other=i%20phone"
|
|
28
|
+
fixture = FakeWeb::Fixture.new(@path, :get, url, stub)
|
|
29
|
+
assert_equal fixture.file_name, "GET_www.apple.com-iphone-why-iphone.fixture"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_duplicate_file_name_increments_number_identifier
|
|
33
|
+
File.new('GET_www.apple.com.fixture', 'w')
|
|
34
|
+
assert_equal @fixture.file_name, "GET_www.apple.com_2.fixture"
|
|
35
|
+
File.unlink('GET_www.apple.com.fixture')
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def test_unique_file_name_when_integer_does_not_exist
|
|
39
|
+
File.new('original.txt', 'w')
|
|
40
|
+
|
|
41
|
+
fixture = FakeWeb::Fixture.allocate
|
|
42
|
+
assert_equal fixture.send(:next_unique_file_name, "original.txt"), "original_2.txt"
|
|
43
|
+
|
|
44
|
+
File.unlink('original.txt')
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def test_unique_file_name_when_integer_exists
|
|
48
|
+
File.new('original.txt', 'w')
|
|
49
|
+
File.new('original_2.txt', 'w')
|
|
50
|
+
|
|
51
|
+
fixture = FakeWeb::Fixture.allocate
|
|
52
|
+
assert_equal fixture.send(:next_unique_file_name, "original.txt"), "original_3.txt"
|
|
53
|
+
|
|
54
|
+
File.unlink('original.txt')
|
|
55
|
+
File.unlink('original_2.txt')
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def test_save
|
|
59
|
+
file = stub
|
|
60
|
+
File.expects(:open).with(@fixture.file_name, 'w').yields(file)
|
|
61
|
+
file.expects(:write).with(@fixture.to_yaml)
|
|
62
|
+
@fixture.save
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), "test_helper")
|
|
2
|
+
require 'fileutils'
|
|
3
|
+
|
|
4
|
+
class TestFakeWebGenerateFixture < Test::Unit::TestCase
|
|
5
|
+
def setup
|
|
6
|
+
@path = File.dirname(__FILE__) + "/fixtures/tmp"
|
|
7
|
+
Dir.mkdir(@path)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def teardown
|
|
11
|
+
FileUtils.rm_rf @path
|
|
12
|
+
FakeWeb.allow_net_connect = true
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_raise_error_when_path_invalid
|
|
16
|
+
assert_raise RuntimeError do
|
|
17
|
+
FakeWeb.generate_fixtures("invalid_path")
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def test_save_and_restore_one_fixture
|
|
22
|
+
FakeWeb.generate_fixtures(@path)
|
|
23
|
+
request = lambda { Net::HTTP.get_response URI.parse("http://www.google.com") }
|
|
24
|
+
setup_basic_response_for_request
|
|
25
|
+
real_response = request.call
|
|
26
|
+
|
|
27
|
+
FakeWeb.register_fixtures(@path)
|
|
28
|
+
FakeWeb.allow_net_connect = false
|
|
29
|
+
assert_nothing_raised do
|
|
30
|
+
assert_equal real_response.body, request.call.body
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def test_save_and_restore_multiple_fixtures
|
|
35
|
+
FakeWeb.generate_fixtures(@path)
|
|
36
|
+
setup_basic_response_for_request
|
|
37
|
+
setup_basic_response_for_request :path => "/news/ipod.rss", :response_body => "iPod news"
|
|
38
|
+
setup_basic_response_for_request :path => "/news/iphone.rss", :response_body => "iPhone news"
|
|
39
|
+
requests = lambda do
|
|
40
|
+
Net::HTTP.get_response URI.parse("http://www.google.com")
|
|
41
|
+
Net::HTTP.get_response URI.parse("http://www.google.com/news/ipod.rss")
|
|
42
|
+
Net::HTTP.get_response URI.parse("http://www.google.com/news/iphone.rss")
|
|
43
|
+
end
|
|
44
|
+
requests.call
|
|
45
|
+
|
|
46
|
+
FakeWeb.register_fixtures(@path)
|
|
47
|
+
FakeWeb.allow_net_connect = false
|
|
48
|
+
assert_nothing_raised do
|
|
49
|
+
requests.call
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def test_restoring_fixtures_stops_generating_fixtures
|
|
54
|
+
FakeWeb.register_fixtures(@path)
|
|
55
|
+
assert ! FakeWeb.generate_fixtures?
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def test_generating_fixtures_allows_net_connections
|
|
59
|
+
FakeWeb.allow_net_connect = false
|
|
60
|
+
FakeWeb.generate_fixtures(@path)
|
|
61
|
+
assert FakeWeb.allow_net_connect?
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def test_compatibility_with_open_uri
|
|
65
|
+
FakeWeb.generate_fixtures(@path)
|
|
66
|
+
setup_basic_response_for_request
|
|
67
|
+
assert_nothing_raised TypeError, "no marshal_dump is defined for class Proc" do
|
|
68
|
+
open("http://www.google.com")
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), "test_helper")
|
|
2
|
+
|
|
3
|
+
class TestFakeWebOpenURI < Test::Unit::TestCase
|
|
4
|
+
|
|
5
|
+
def test_content_for_registered_uri
|
|
6
|
+
FakeWeb.register_uri(:get, 'http://mock/test_example.txt', :body => File.dirname(__FILE__) + '/fixtures/test_example.txt')
|
|
7
|
+
assert_equal 'test example content', FakeWeb.response_for(:get, 'http://mock/test_example.txt').body
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_mock_open
|
|
11
|
+
FakeWeb.register_uri(:get, 'http://mock/test_example.txt', :body => File.dirname(__FILE__) + '/fixtures/test_example.txt')
|
|
12
|
+
assert_equal 'test example content', open('http://mock/test_example.txt').read
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_mock_open_with_string_as_registered_uri
|
|
16
|
+
FakeWeb.register_uri(:get, 'http://mock/test_string.txt', :body => 'foo')
|
|
17
|
+
assert_equal 'foo', open('http://mock/test_string.txt').string
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_real_open
|
|
21
|
+
FakeWeb.allow_net_connect = true
|
|
22
|
+
setup_expectations_for_real_apple_hot_news_request
|
|
23
|
+
resp = open('http://images.apple.com/main/rss/hotnews/hotnews.rss')
|
|
24
|
+
assert_equal "200", resp.status.first
|
|
25
|
+
body = resp.read
|
|
26
|
+
assert body.include?('Apple')
|
|
27
|
+
assert body.include?('News')
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_mock_open_that_raises_exception
|
|
31
|
+
FakeWeb.register_uri(:get, 'http://mock/raising_exception.txt', :exception => StandardError)
|
|
32
|
+
assert_raises(StandardError) do
|
|
33
|
+
open('http://mock/raising_exception.txt')
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def test_mock_open_that_raises_an_http_error
|
|
38
|
+
FakeWeb.register_uri(:get, 'http://mock/raising_exception.txt', :exception => OpenURI::HTTPError)
|
|
39
|
+
assert_raises(OpenURI::HTTPError) do
|
|
40
|
+
open('http://mock/raising_exception.txt')
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def test_mock_open_that_raises_an_http_error_with_a_specific_status
|
|
45
|
+
FakeWeb.register_uri(:get, 'http://mock/raising_exception.txt', :exception => OpenURI::HTTPError, :status => ['123', 'jodel'])
|
|
46
|
+
exception = assert_raises(OpenURI::HTTPError) do
|
|
47
|
+
open('http://mock/raising_exception.txt')
|
|
48
|
+
end
|
|
49
|
+
assert_equal '123', exception.io.code
|
|
50
|
+
assert_equal 'jodel', exception.io.message
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def test_mock_open_with_block
|
|
54
|
+
FakeWeb.register_uri(:get, 'http://mock/test_example.txt', :body => File.dirname(__FILE__) + '/fixtures/test_example.txt')
|
|
55
|
+
body = open('http://mock/test_example.txt') { |f| f.readlines }
|
|
56
|
+
assert_equal 'test example content', body.first
|
|
57
|
+
end
|
|
58
|
+
end
|
data/test/test_helper.rb
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
$:.unshift "#{File.dirname(__FILE__)}/../lib"
|
|
2
|
+
|
|
3
|
+
require 'test/unit'
|
|
4
|
+
require 'open-uri'
|
|
5
|
+
require 'fake_web'
|
|
6
|
+
require 'rubygems'
|
|
7
|
+
require 'mocha'
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# Give all tests a common setup and teardown that prevents shared state
|
|
11
|
+
class Test::Unit::TestCase
|
|
12
|
+
alias setup_without_fakeweb setup
|
|
13
|
+
def setup
|
|
14
|
+
FakeWeb.clean_registry
|
|
15
|
+
@original_allow_net_connect = FakeWeb.allow_net_connect?
|
|
16
|
+
FakeWeb.allow_net_connect = false
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
alias teardown_without_fakeweb teardown
|
|
20
|
+
def teardown
|
|
21
|
+
FakeWeb.allow_net_connect = @original_allow_net_connect
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
module FakeWebTestHelper
|
|
27
|
+
|
|
28
|
+
def capture_stderr
|
|
29
|
+
$stderr = StringIO.new
|
|
30
|
+
yield
|
|
31
|
+
$stderr.rewind && $stderr.read
|
|
32
|
+
ensure
|
|
33
|
+
$stderr = STDERR
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Sets several expectations (using Mocha) that a real HTTP request makes it
|
|
37
|
+
# past FakeWeb to the socket layer. You can use this when you need to check
|
|
38
|
+
# that a request isn't handled by FakeWeb.
|
|
39
|
+
def setup_expectations_for_real_request(options = {})
|
|
40
|
+
# Socket handling
|
|
41
|
+
if options[:port] == 443
|
|
42
|
+
socket = mock("SSLSocket")
|
|
43
|
+
OpenSSL::SSL::SSLSocket.expects(:===).with(socket).returns(true).at_least_once
|
|
44
|
+
OpenSSL::SSL::SSLSocket.expects(:new).with(socket, instance_of(OpenSSL::SSL::SSLContext)).returns(socket).at_least_once
|
|
45
|
+
socket.stubs(:sync_close=).returns(true)
|
|
46
|
+
socket.expects(:connect).with().at_least_once
|
|
47
|
+
else
|
|
48
|
+
socket = mock("TCPSocket")
|
|
49
|
+
Socket.expects(:===).with(socket).returns(true)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
TCPSocket.expects(:open).with(options[:host], options[:port]).returns(socket).at_least_once
|
|
53
|
+
socket.stubs(:closed?).returns(false)
|
|
54
|
+
socket.stubs(:close).returns(true)
|
|
55
|
+
|
|
56
|
+
# Request/response handling
|
|
57
|
+
request_parts = ["#{options[:method]} #{options[:path]} HTTP/1.1", "Host: #{options[:host]}"]
|
|
58
|
+
socket.expects(:write).with(all_of(includes(request_parts[0]), includes(request_parts[1]))).returns(100)
|
|
59
|
+
|
|
60
|
+
socket.expects(:sysread).at_least_once.returns("HTTP/1.1 #{options[:response_code]} #{options[:response_message]}\nContent-Length: #{options[:response_body].length}\n\n#{options[:response_body]}").then.raises(EOFError)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
# A helper that calls #setup_expectations_for_real_request for you, using
|
|
65
|
+
# defaults for our commonly used test request to images.apple.com.
|
|
66
|
+
def setup_expectations_for_real_apple_hot_news_request(options = {})
|
|
67
|
+
defaults = { :host => "images.apple.com", :port => 80, :method => "GET",
|
|
68
|
+
:path => "/main/rss/hotnews/hotnews.rss",
|
|
69
|
+
:response_code => 200, :response_message => "OK",
|
|
70
|
+
:response_body => "<title>Apple Hot News</title>" }
|
|
71
|
+
setup_expectations_for_real_request(defaults.merge(options))
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def setup_basic_response_for_request(options = {})
|
|
75
|
+
defaults = { :host => "www.google.com", :port => 80, :method => "GET",
|
|
76
|
+
:path => "", :response_code => 200, :response_message => "OK",
|
|
77
|
+
:response_body => "Google" }
|
|
78
|
+
options = defaults.merge(options)
|
|
79
|
+
|
|
80
|
+
socket = stub("TCPSocket", :closed? => false, :close => true, :write => 100)
|
|
81
|
+
Socket.stubs(:===).returns(true)
|
|
82
|
+
TCPSocket.stubs(:open).returns(socket)
|
|
83
|
+
socket.stubs(:sysread).returns("HTTP/1.1 #{options[:response_code]} #{options[:response_message]}\nContent-Length: #{options[:response_body].length}\n\n#{options[:response_body]}")
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
Test::Unit::TestCase.send(:include, FakeWebTestHelper)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), "test_helper")
|
|
2
|
+
|
|
3
|
+
class TestMissingOpenURI < Test::Unit::TestCase
|
|
4
|
+
|
|
5
|
+
def setup
|
|
6
|
+
super
|
|
7
|
+
@saved_open_uri = OpenURI
|
|
8
|
+
Object.send(:remove_const, :OpenURI)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def teardown
|
|
12
|
+
super
|
|
13
|
+
Object.const_set(:OpenURI, @saved_open_uri)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def test_register_using_exception_without_open_uri
|
|
18
|
+
# regression test for Responder needing OpenURI::HTTPError to be defined
|
|
19
|
+
FakeWeb.register_uri(:get, "http://example.com/", :exception => StandardError)
|
|
20
|
+
assert_raises(StandardError) do
|
|
21
|
+
Net::HTTP.start("example.com") { |http| http.get("/") }
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), "test_helper")
|
|
2
|
+
|
|
3
|
+
class TestPrecedence < Test::Unit::TestCase
|
|
4
|
+
|
|
5
|
+
def test_matching_get_strings_have_precedence_over_matching_get_regexes
|
|
6
|
+
FakeWeb.register_uri(:get, "http://example.com/test", :body => "string")
|
|
7
|
+
FakeWeb.register_uri(:get, %r|http://example\.com/test|, :body => "regex")
|
|
8
|
+
response = Net::HTTP.start("example.com") { |query| query.get('/test') }
|
|
9
|
+
assert_equal "string", response.body
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def test_matching_any_strings_have_precedence_over_matching_any_regexes
|
|
13
|
+
FakeWeb.register_uri(:any, "http://example.com/test", :body => "string")
|
|
14
|
+
FakeWeb.register_uri(:any, %r|http://example\.com/test|, :body => "regex")
|
|
15
|
+
response = Net::HTTP.start("example.com") { |query| query.get('/test') }
|
|
16
|
+
assert_equal "string", response.body
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def test_matching_get_strings_have_precedence_over_matching_any_strings
|
|
20
|
+
FakeWeb.register_uri(:get, "http://example.com/test", :body => "get method")
|
|
21
|
+
FakeWeb.register_uri(:any, "http://example.com/test", :body => "any method")
|
|
22
|
+
response = Net::HTTP.start("example.com") { |query| query.get('/test') }
|
|
23
|
+
assert_equal "get method", response.body
|
|
24
|
+
|
|
25
|
+
# registration order should not matter
|
|
26
|
+
FakeWeb.register_uri(:any, "http://example.com/test2", :body => "any method")
|
|
27
|
+
FakeWeb.register_uri(:get, "http://example.com/test2", :body => "get method")
|
|
28
|
+
response = Net::HTTP.start("example.com") { |query| query.get('/test2') }
|
|
29
|
+
assert_equal "get method", response.body
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_matching_any_strings_have_precedence_over_matching_get_regexes
|
|
33
|
+
FakeWeb.register_uri(:any, "http://example.com/test", :body => "any string")
|
|
34
|
+
FakeWeb.register_uri(:get, %r|http://example\.com/test|, :body => "get regex")
|
|
35
|
+
response = Net::HTTP.start("example.com") { |query| query.get('/test') }
|
|
36
|
+
assert_equal "any string", response.body
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def test_registered_strings_and_uris_are_equivalent_so_second_takes_precedence
|
|
40
|
+
FakeWeb.register_uri(:get, "http://example.com/test", :body => "string")
|
|
41
|
+
FakeWeb.register_uri(:get, URI.parse("http://example.com/test"), :body => "uri")
|
|
42
|
+
response = Net::HTTP.start("example.com") { |query| query.get('/test') }
|
|
43
|
+
assert_equal "uri", response.body
|
|
44
|
+
|
|
45
|
+
FakeWeb.register_uri(:get, URI.parse("http://example.com/test2"), :body => "uri")
|
|
46
|
+
FakeWeb.register_uri(:get, "http://example.com/test2", :body => "string")
|
|
47
|
+
response = Net::HTTP.start("example.com") { |query| query.get('/test2') }
|
|
48
|
+
assert_equal "string", response.body
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def test_identical_registration_replaces_previous_registration
|
|
52
|
+
FakeWeb.register_uri(:get, "http://example.com/test", :body => "first")
|
|
53
|
+
FakeWeb.register_uri(:get, "http://example.com/test", :body => "second")
|
|
54
|
+
response = Net::HTTP.start("example.com") { |query| query.get('/test') }
|
|
55
|
+
assert_equal "second", response.body
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def test_identical_registration_replaces_previous_registration_accounting_for_normalization
|
|
59
|
+
FakeWeb.register_uri(:get, "http://example.com/test?", :body => "first")
|
|
60
|
+
FakeWeb.register_uri(:get, "http://example.com:80/test", :body => "second")
|
|
61
|
+
response = Net::HTTP.start("example.com") { |query| query.get('/test') }
|
|
62
|
+
assert_equal "second", response.body
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def test_identical_registration_replaces_previous_registration_accounting_for_query_params
|
|
66
|
+
FakeWeb.register_uri(:get, "http://example.com/test?a=1&b=2", :body => "first")
|
|
67
|
+
FakeWeb.register_uri(:get, "http://example.com/test?b=2&a=1", :body => "second")
|
|
68
|
+
response = Net::HTTP.start("example.com") { |query| query.get('/test?a=1&b=2') }
|
|
69
|
+
assert_equal "second", response.body
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def test_identical_registration_replaces_previous_registration_with_regexes
|
|
73
|
+
FakeWeb.register_uri(:get, /test/, :body => "first")
|
|
74
|
+
FakeWeb.register_uri(:get, /test/, :body => "second")
|
|
75
|
+
response = Net::HTTP.start("example.com") { |query| query.get('/test') }
|
|
76
|
+
assert_equal "second", response.body
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), "test_helper")
|
|
2
|
+
|
|
3
|
+
class TestFakeWebQueryString < Test::Unit::TestCase
|
|
4
|
+
|
|
5
|
+
def test_register_uri_string_with_query_params
|
|
6
|
+
FakeWeb.register_uri(:get, 'http://example.com/?a=1&b=1', :body => 'foo')
|
|
7
|
+
assert FakeWeb.registered_uri?(:get, 'http://example.com/?a=1&b=1')
|
|
8
|
+
|
|
9
|
+
FakeWeb.register_uri(:post, URI.parse("http://example.org/?a=1&b=1"), :body => "foo")
|
|
10
|
+
assert FakeWeb.registered_uri?(:post, "http://example.org/?a=1&b=1")
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def test_register_uri_with_query_params_and_check_in_different_order
|
|
14
|
+
FakeWeb.register_uri(:get, 'http://example.com/?a=1&b=1', :body => 'foo')
|
|
15
|
+
assert FakeWeb.registered_uri?(:get, 'http://example.com/?b=1&a=1')
|
|
16
|
+
|
|
17
|
+
FakeWeb.register_uri(:post, URI.parse('http://example.org/?a=1&b=1'), :body => 'foo')
|
|
18
|
+
assert FakeWeb.registered_uri?(:post, 'http://example.org/?b=1&a=1')
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def test_registered_uri_gets_recognized_with_empty_query_params
|
|
22
|
+
FakeWeb.register_uri(:get, 'http://example.com/', :body => 'foo')
|
|
23
|
+
assert FakeWeb.registered_uri?(:get, 'http://example.com/?')
|
|
24
|
+
|
|
25
|
+
FakeWeb.register_uri(:post, URI.parse('http://example.org/'), :body => 'foo')
|
|
26
|
+
assert FakeWeb.registered_uri?(:post, 'http://example.org/?')
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def test_register_uri_with_empty_query_params_and_check_with_none
|
|
30
|
+
FakeWeb.register_uri(:get, 'http://example.com/?', :body => 'foo')
|
|
31
|
+
assert FakeWeb.registered_uri?(:get, 'http://example.com/')
|
|
32
|
+
|
|
33
|
+
FakeWeb.register_uri(:post, URI.parse('http://example.org/?'), :body => 'foo')
|
|
34
|
+
assert FakeWeb.registered_uri?(:post, 'http://example.org/')
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def test_registry_sort_query_params
|
|
38
|
+
assert_equal "a=1&b=2", FakeWeb::Registry.instance.send(:sort_query_params, "b=2&a=1")
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_registry_sort_query_params_sorts_by_value_if_keys_collide
|
|
42
|
+
assert_equal "a=1&a=2&b=2", FakeWeb::Registry.instance.send(:sort_query_params, "a=2&b=2&a=1")
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), "test_helper")
|
|
2
|
+
|
|
3
|
+
class TestRegexes < Test::Unit::TestCase
|
|
4
|
+
|
|
5
|
+
def test_registered_uri_with_pattern
|
|
6
|
+
FakeWeb.register_uri(:get, %r|http://example.com/test_example/\d+|, :body => "example")
|
|
7
|
+
assert FakeWeb.registered_uri?(:get, "http://example.com/test_example/25")
|
|
8
|
+
assert !FakeWeb.registered_uri?(:get, "http://example.com/test_example/abc")
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def test_response_for_with_matching_registered_uri
|
|
12
|
+
FakeWeb.register_uri(:get, %r|http://www.google.com|, :body => "Welcome to Google!")
|
|
13
|
+
assert_equal "Welcome to Google!", FakeWeb.response_for(:get, "http://www.google.com").body
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_response_for_with_matching_registered_uri_and_get_method_matching_to_any_method
|
|
17
|
+
FakeWeb.register_uri(:any, %r|http://www.example.com|, :body => "example")
|
|
18
|
+
assert_equal "example", FakeWeb.response_for(:get, "http://www.example.com").body
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def test_registered_uri_with_authentication_and_pattern
|
|
22
|
+
FakeWeb.register_uri(:get, %r|http://user:pass@mock/example\.\w+|i, :body => "example")
|
|
23
|
+
assert FakeWeb.registered_uri?(:get, 'http://user:pass@mock/example.txt')
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_registered_uri_with_authentication_and_pattern_handles_case_insensitivity
|
|
27
|
+
FakeWeb.register_uri(:get, %r|http://user:pass@mock/example\.\w+|i, :body => "example")
|
|
28
|
+
assert FakeWeb.registered_uri?(:get, 'http://uSeR:PAss@mock/example.txt')
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def test_request_with_authentication_and_pattern_handles_case_insensitivity
|
|
32
|
+
FakeWeb.register_uri(:get, %r|http://user:pass@mock/example\.\w+|i, :body => "example")
|
|
33
|
+
http = Net::HTTP.new('mock', 80)
|
|
34
|
+
req = Net::HTTP::Get.new('/example.txt')
|
|
35
|
+
req.basic_auth 'uSeR', 'PAss'
|
|
36
|
+
assert_equal "example", http.request(req).body
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def test_requesting_a_uri_that_matches_two_registered_regexes_raises_an_error
|
|
40
|
+
FakeWeb.register_uri(:get, %r|http://example\.com/|, :body => "first")
|
|
41
|
+
FakeWeb.register_uri(:get, %r|http://example\.com/a|, :body => "second")
|
|
42
|
+
assert_raise FakeWeb::MultipleMatchingURIsError do
|
|
43
|
+
Net::HTTP.start("example.com") { |query| query.get('/a') }
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def test_requesting_a_uri_that_matches_two_registered_regexes_with_differently_ordered_query_params_raises_an_error
|
|
48
|
+
FakeWeb.register_uri(:get, %r[example.com/list\?b=2&a=1], :body => "first")
|
|
49
|
+
FakeWeb.register_uri(:get, %r[example.com/list\?a=1&b=2], :body => "second")
|
|
50
|
+
assert_raise FakeWeb::MultipleMatchingURIsError do
|
|
51
|
+
Net::HTTP.start("example.com") { |query| query.get('/list?a=1&b=2') }
|
|
52
|
+
end
|
|
53
|
+
assert_raise FakeWeb::MultipleMatchingURIsError do
|
|
54
|
+
Net::HTTP.start("example.com") { |query| query.get('/list?b=2&a=1') }
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def test_requesting_a_uri_that_matches_two_registered_regexes_raises_an_error_including_request_info
|
|
59
|
+
FakeWeb.register_uri(:get, %r|http://example\.com/|, :body => "first")
|
|
60
|
+
FakeWeb.register_uri(:get, %r|http://example\.com/a|, :body => "second")
|
|
61
|
+
begin
|
|
62
|
+
Net::HTTP.start("example.com") { |query| query.get('/a') }
|
|
63
|
+
rescue FakeWeb::MultipleMatchingURIsError => exception
|
|
64
|
+
end
|
|
65
|
+
assert exception.message.include?("GET http://example.com/a")
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def test_registry_does_not_find_using_mismatched_protocols_or_ports_when_registered_with_both
|
|
69
|
+
FakeWeb.register_uri(:get, %r|http://www.example.com:80|, :body => "example")
|
|
70
|
+
assert !FakeWeb.registered_uri?(:get, "https://www.example.com:80")
|
|
71
|
+
assert !FakeWeb.registered_uri?(:get, "http://www.example.com:443")
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def test_registry_finds_using_non_default_port
|
|
75
|
+
FakeWeb.register_uri(:get, %r|example\.com:8080|, :body => "example")
|
|
76
|
+
assert FakeWeb.registered_uri?(:get, "http://www.example.com:8080/path")
|
|
77
|
+
assert FakeWeb.registered_uri?(:get, "https://www.example.com:8080/path")
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def test_registry_finds_using_default_port_and_http_when_registered_with_explicit_port_80
|
|
81
|
+
FakeWeb.register_uri(:get, %r|example\.com:80|, :body => "example")
|
|
82
|
+
assert FakeWeb.registered_uri?(:get, "http://www.example.com/path")
|
|
83
|
+
|
|
84
|
+
# check other permutations, too
|
|
85
|
+
assert FakeWeb.registered_uri?(:get, "http://www.example.com:80/path")
|
|
86
|
+
assert FakeWeb.registered_uri?(:get, "http://www.example.com:8080/path")
|
|
87
|
+
assert FakeWeb.registered_uri?(:get, "https://www.example.com:80/path")
|
|
88
|
+
assert FakeWeb.registered_uri?(:get, "https://www.example.com:8080/path")
|
|
89
|
+
assert !FakeWeb.registered_uri?(:get, "https://www.example.com/path")
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def test_registry_finds_using_default_port_and_https_when_registered_with_explicit_port_443
|
|
93
|
+
FakeWeb.register_uri(:get, %r|example\.com:443|, :body => "example")
|
|
94
|
+
assert FakeWeb.registered_uri?(:get, "https://www.example.com/path")
|
|
95
|
+
|
|
96
|
+
# check other permutations, too
|
|
97
|
+
assert FakeWeb.registered_uri?(:get, "https://www.example.com:443/path")
|
|
98
|
+
assert FakeWeb.registered_uri?(:get, "https://www.example.com:44321/path")
|
|
99
|
+
assert FakeWeb.registered_uri?(:get, "http://www.example.com:443/path")
|
|
100
|
+
assert FakeWeb.registered_uri?(:get, "http://www.example.com:44321/path")
|
|
101
|
+
assert !FakeWeb.registered_uri?(:get, "http://www.example.com/path")
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def test_registry_only_finds_using_default_port_when_registered_without_if_protocol_matches
|
|
105
|
+
FakeWeb.register_uri(:get, %r|http://www.example.com/test|, :body => "example")
|
|
106
|
+
assert FakeWeb.registered_uri?(:get, "http://www.example.com:80/test")
|
|
107
|
+
assert !FakeWeb.registered_uri?(:get, "http://www.example.com:443/test")
|
|
108
|
+
assert !FakeWeb.registered_uri?(:get, "https://www.example.com:443/test")
|
|
109
|
+
FakeWeb.register_uri(:get, %r|https://www.example.org/test|, :body => "example")
|
|
110
|
+
assert FakeWeb.registered_uri?(:get, "https://www.example.org:443/test")
|
|
111
|
+
assert !FakeWeb.registered_uri?(:get, "https://www.example.org:80/test")
|
|
112
|
+
assert !FakeWeb.registered_uri?(:get, "http://www.example.org:80/test")
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def test_registry_matches_using_mismatched_port_when_registered_without
|
|
116
|
+
FakeWeb.register_uri(:get, %r|http://www.example.com|, :body => "example")
|
|
117
|
+
assert FakeWeb.registered_uri?(:get, "http://www.example.com:80")
|
|
118
|
+
assert FakeWeb.registered_uri?(:get, "http://www.example.com:443")
|
|
119
|
+
assert FakeWeb.registered_uri?(:get, "http://www.example.com:12345")
|
|
120
|
+
assert !FakeWeb.registered_uri?(:get, "https://www.example.com:443")
|
|
121
|
+
assert !FakeWeb.registered_uri?(:get, "https://www.example.com")
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def test_registry_matches_using_default_port_for_protocol_when_registered_without_protocol_or_port
|
|
125
|
+
FakeWeb.register_uri(:get, %r|www.example.com/home|, :body => "example")
|
|
126
|
+
assert FakeWeb.registered_uri?(:get, "http://www.example.com/home")
|
|
127
|
+
assert FakeWeb.registered_uri?(:get, "https://www.example.com/home")
|
|
128
|
+
assert FakeWeb.registered_uri?(:get, "http://www.example.com:80/home")
|
|
129
|
+
assert FakeWeb.registered_uri?(:get, "https://www.example.com:443/home")
|
|
130
|
+
assert !FakeWeb.registered_uri?(:get, "https://www.example.com:80/home")
|
|
131
|
+
assert !FakeWeb.registered_uri?(:get, "http://www.example.com:443/home")
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def test_registry_matches_with_query_params
|
|
135
|
+
FakeWeb.register_uri(:get, %r[example.com/list\?(.*&|)important=1], :body => "example")
|
|
136
|
+
assert FakeWeb.registered_uri?(:get, "http://example.com/list?hash=123&important=1&unimportant=2")
|
|
137
|
+
assert FakeWeb.registered_uri?(:get, "http://example.com/list?hash=123&important=12&unimportant=2")
|
|
138
|
+
assert FakeWeb.registered_uri?(:get, "http://example.com/list?important=1&unimportant=2")
|
|
139
|
+
assert !FakeWeb.registered_uri?(:get, "http://example.com/list?important=2")
|
|
140
|
+
assert !FakeWeb.registered_uri?(:get, "http://example.com/list?important=2&unimportant=1")
|
|
141
|
+
assert !FakeWeb.registered_uri?(:get, "http://example.com/list?hash=123&important=2&unimportant=1")
|
|
142
|
+
assert !FakeWeb.registered_uri?(:get, "http://example.com/list?notimportant=1&unimportant=1")
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def test_registry_matches_with_unsorted_query_params
|
|
146
|
+
FakeWeb.register_uri(:get, %r[example\.com/list\?b=2&a=1], :body => "example")
|
|
147
|
+
assert FakeWeb.registered_uri?(:get, "http://example.com/list?b=2&a=1")
|
|
148
|
+
assert FakeWeb.registered_uri?(:get, "http://example.com/list?a=1&b=2")
|
|
149
|
+
assert FakeWeb.registered_uri?(:get, "https://example.com:443/list?b=2&a=1")
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
end
|