chrisk-fakeweb 1.1.2.5 → 1.1.2.6
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +10 -0
- data/README.rdoc +55 -33
- data/Rakefile +3 -1
- data/lib/fake_net_http.rb +26 -26
- data/lib/fake_web.rb +16 -8
- data/test/test_allow_net_connect.rb +10 -13
- metadata +3 -3
data/CHANGELOG
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
fakeweb (development)
|
2
2
|
|
3
|
+
* start work on Ruby 1.9 compatibility [Chris Kampmeier]
|
4
|
+
|
5
|
+
* add FakeWeb.allow_net_connect= to enable/disable the pass-through to
|
6
|
+
Net::HTTP for unregistered URIs [Mislav Marohnić, Chris Kampmeier]
|
7
|
+
|
8
|
+
* remove setup.rb, since most people use RubyGems [Mislav Marohnić]
|
9
|
+
|
10
|
+
* fix that 'http://example.com/?' (empty query) matches a registered
|
11
|
+
'http://example.com/', and vice-versa [Mislav Marohnić]
|
12
|
+
|
3
13
|
* improve the test suite to not rely on an internet connection [Chris Kampmeier]
|
4
14
|
|
5
15
|
* use `rake test` instead of `rake tests` [Josh Nichols]
|
data/README.rdoc
CHANGED
@@ -1,11 +1,24 @@
|
|
1
1
|
= FakeWeb
|
2
2
|
|
3
|
-
FakeWeb is a helper for faking web requests. It works at a global
|
4
|
-
modifying code or writing extensive stubs.
|
3
|
+
FakeWeb is a helper for faking web requests in Ruby. It works at a global
|
4
|
+
level, without modifying code or writing extensive stubs.
|
5
|
+
|
6
|
+
= Installation
|
7
|
+
|
8
|
+
This fork of Blaine Cook's original code has lots of fixes, stability
|
9
|
+
improvements, and a few new features. To get it, install the latest gem
|
10
|
+
directly from GitHub (currently 1.1.2.6):
|
11
|
+
|
12
|
+
sudo gem install chrisk-fakeweb --source http://gems.github.com
|
5
13
|
|
6
14
|
= Examples
|
7
15
|
|
8
|
-
|
16
|
+
Start by requiring FakeWeb:
|
17
|
+
|
18
|
+
require 'rubygems'
|
19
|
+
require 'fake_web'
|
20
|
+
|
21
|
+
== Registering basic string responses
|
9
22
|
|
10
23
|
FakeWeb.register_uri("http://example.com/test1", :string => "Hello World!")
|
11
24
|
|
@@ -53,53 +66,62 @@ option for that response.)
|
|
53
66
|
req.delete('/posts/1').body # => "Post not found"
|
54
67
|
end
|
55
68
|
|
56
|
-
== Requesting with OpenURI
|
57
|
-
|
58
|
-
FakeWeb.register_uri('http://example.com/', :string => "Hello, World!")
|
59
|
-
|
60
|
-
open('http://example.com/').string
|
61
|
-
=> "Hello, World!"
|
62
|
-
|
63
69
|
== Clearing registered URIs
|
64
70
|
|
65
71
|
The FakeWeb registry is a singleton that lasts for the duration of your
|
66
|
-
program, maintaining every fake
|
72
|
+
program, maintaining every fake response you register. If needed, you
|
67
73
|
can clean out the registry and remove all registered URIs:
|
68
74
|
|
69
75
|
FakeWeb.clean_registry
|
70
76
|
|
77
|
+
== Blocking all real requests
|
71
78
|
|
72
|
-
|
79
|
+
When you're using FakeWeb to replace _all_ of your requests, it's useful to
|
80
|
+
catch when requests are made for unregistered URIs (unlike the default
|
81
|
+
behavior, which is to pass those requests through to Net::HTTP as usual).
|
73
82
|
|
74
|
-
FakeWeb
|
75
|
-
|
76
|
-
|
77
|
-
stubbing of HTTP responses to re-playing complete recorded responses.
|
83
|
+
FakeWeb.allow_net_connect = false
|
84
|
+
Net::HTTP.get(URI.parse('http://example.com/'))
|
85
|
+
=> raises FakeWeb::NetConnectNotAllowedError
|
78
86
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
87
|
+
FakeWeb.allow_net_connect = true
|
88
|
+
Net::HTTP.get(URI.parse('http://example.com/'))
|
89
|
+
=> FakeWeb is bypassed and the response from a real request is returned
|
90
|
+
|
91
|
+
This is handy when you want to make sure your tests are self-contained, or you
|
92
|
+
want to catch the scenario when a URI is changed in implementation code
|
93
|
+
without a corresponding test change.
|
94
|
+
|
95
|
+
= More info
|
96
|
+
|
97
|
+
FakeWeb lets you decouple your test environment from live services without
|
98
|
+
modifying code or writing extensive stubs.
|
99
|
+
|
100
|
+
In addition to the conceptual advantage of having idempotent request
|
101
|
+
behaviour, FakeWeb makes tests run faster than if they were made to remote (or
|
102
|
+
even local) web servers. It also makes it possible to run tests without a
|
103
|
+
network connection or in situations where the server is behind a firewall or
|
104
|
+
has host-based access controls.
|
105
|
+
|
106
|
+
FakeWeb works with anything based on Net::HTTP--both higher-level wrappers,
|
107
|
+
like OpenURI, as well as a ton of libraries for popular web services.
|
84
108
|
|
85
|
-
FakeWeb is tested with
|
86
|
-
Net::HTTP[http://www.ruby-doc.org/stdlib/libdoc/net/http/rdoc/index.html] and
|
87
|
-
OpenURI[http://www.ruby-doc.org/stdlib/libdoc/open-uri/rdoc/]. It should work
|
88
|
-
with any web client library that uses Net::HTTP for its underlying requests
|
89
|
-
(e.g., Flickr.rb[http://redgreenblu.com/flickr/],
|
90
|
-
Ruby/Amazon[http://www.caliban.org/ruby/ruby-amazon.shtml],
|
91
|
-
soap4r[http://dev.ctor.org/soap4r/], etc.)
|
92
109
|
|
93
110
|
= Known Issues
|
94
111
|
|
95
|
-
*
|
96
|
-
|
97
|
-
|
112
|
+
* Requests are only stubbed at the URI level, with no respect to HTTP method.
|
113
|
+
|
114
|
+
* Similarly, request bodies are ignored, including PUT and POST parameters. If
|
115
|
+
you need different responses for different request bodies, you need to
|
116
|
+
request different URLs, and register different responses for each. (Query
|
117
|
+
strings are fully supported, though.)
|
118
|
+
|
98
119
|
|
99
120
|
= Copyright
|
100
121
|
|
101
|
-
|
102
|
-
|
122
|
+
Copyright 2006-2007 Blaine Cook
|
123
|
+
|
124
|
+
Copyright 2008 various contributors
|
103
125
|
|
104
126
|
FakeWeb is free software; you can redistribute it and/or modify
|
105
127
|
it under the terms of the GNU General Public License as published by
|
data/Rakefile
CHANGED
@@ -33,7 +33,9 @@ Rake::RDocTask.new do |rdoc|
|
|
33
33
|
rdoc.main = "README.rdoc"
|
34
34
|
rdoc.rdoc_dir = "doc"
|
35
35
|
rdoc.rdoc_files.include("README.rdoc", "COPYING", "CHANGELOG", "lib/*.rb")
|
36
|
-
rdoc.title = "FakeWeb"
|
36
|
+
rdoc.title = "FakeWeb API Documentation"
|
37
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
38
|
+
rdoc.options << '--charset' << 'utf-8'
|
37
39
|
end
|
38
40
|
|
39
41
|
Rcov::RcovTask.new do |t|
|
data/lib/fake_net_http.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
# FakeWeb - Ruby Helper for Faking Web Requests
|
2
2
|
# Copyright 2006 Blaine Cook <romeda@gmail.com>.
|
3
|
-
#
|
3
|
+
#
|
4
4
|
# FakeWeb is free software; you can redistribute it and/or modify
|
5
5
|
# it under the terms of the GNU General Public License as published by
|
6
6
|
# the Free Software Foundation; either version 2 of the License, or
|
7
7
|
# (at your option) any later version.
|
8
|
-
#
|
8
|
+
#
|
9
9
|
# FakeWeb is distributed in the hope that it will be useful,
|
10
10
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
11
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
12
|
# GNU General Public License for more details.
|
13
|
-
#
|
13
|
+
#
|
14
14
|
# You should have received a copy of the GNU General Public License
|
15
15
|
# along with FakeWeb; if not, write to the Free Software
|
16
16
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
@@ -19,55 +19,55 @@ require 'net/http'
|
|
19
19
|
require 'net/https'
|
20
20
|
require 'stringio'
|
21
21
|
|
22
|
-
module Net
|
22
|
+
module Net #:nodoc: all
|
23
23
|
|
24
|
-
class BufferedIO
|
25
|
-
def initialize(
|
24
|
+
class BufferedIO
|
25
|
+
def initialize(io, debug_output = nil)
|
26
26
|
@read_timeout = 60
|
27
27
|
@rbuf = ''
|
28
28
|
@debug_output = debug_output
|
29
|
+
|
29
30
|
@io = case io
|
30
|
-
when Socket, OpenSSL::SSL::SSLSocket, IO
|
31
|
+
when Socket, OpenSSL::SSL::SSLSocket, IO
|
32
|
+
io
|
31
33
|
when String
|
32
|
-
File.exists?(io) ?
|
34
|
+
File.exists?(io) ? File.open(io, "r") : StringIO.new(io)
|
33
35
|
end
|
34
36
|
raise "Unable to create local socket" unless @io
|
35
37
|
end
|
36
|
-
|
37
38
|
end
|
38
|
-
|
39
|
-
class HTTP #:nodoc:
|
40
39
|
|
41
|
-
|
40
|
+
|
41
|
+
class HTTP
|
42
|
+
def self.socket_type
|
42
43
|
FakeWeb::SocketDelegator
|
43
44
|
end
|
44
45
|
|
45
46
|
alias :original_net_http_request :request
|
46
47
|
alias :original_net_http_connect :connect
|
47
|
-
|
48
|
-
def request(req, body = nil, &block)
|
49
|
-
prot = use_ssl ? "https" : "http"
|
50
48
|
|
51
|
-
|
52
|
-
|
49
|
+
def request(request, body = nil, &block)
|
50
|
+
protocol = use_ssl ? "https" : "http"
|
53
51
|
|
54
|
-
|
52
|
+
path = request.path
|
53
|
+
path = URI.parse(request.path).request_uri if request.path =~ /^http/
|
54
|
+
|
55
|
+
uri = "#{protocol}://#{self.address}:#{self.port}#{path}"
|
55
56
|
|
56
57
|
if FakeWeb.registered_uri?(uri)
|
57
58
|
@socket = Net::HTTP.socket_type.new
|
58
|
-
|
59
|
+
FakeWeb.response_for(uri, &block)
|
60
|
+
elsif FakeWeb.allow_net_connect?
|
61
|
+
original_net_http_connect
|
62
|
+
original_net_http_request(request, body, &block)
|
59
63
|
else
|
60
|
-
|
61
|
-
|
62
|
-
return original_net_http_request(req, body, &block)
|
63
|
-
else
|
64
|
-
expected = FakeWeb::Registry.instance.uri_map.keys
|
65
|
-
raise "unexpected HTTP #{req.method} to #{uri}\n-- expected one of #{expected.inspect}"
|
66
|
-
end
|
64
|
+
raise FakeWeb::NetConnectNotAllowedError,
|
65
|
+
"Real HTTP connections are disabled. Unregistered URI: #{uri}"
|
67
66
|
end
|
68
67
|
end
|
69
68
|
|
70
69
|
def connect
|
71
70
|
end
|
72
71
|
end
|
72
|
+
|
73
73
|
end
|
data/lib/fake_web.rb
CHANGED
@@ -34,13 +34,14 @@ module FakeWeb
|
|
34
34
|
# registered URIs.
|
35
35
|
#
|
36
36
|
# If you set <tt>FakeWeb.allow_net_connect = false</tt> and subsequently try
|
37
|
-
# to make a request to a URI you haven't registered with #register_uri,
|
38
|
-
#
|
39
|
-
# tests are self-contained, or want to catch the scenario
|
40
|
-
# changed in implementation code without a corresponding test
|
37
|
+
# to make a request to a URI you haven't registered with #register_uri, a
|
38
|
+
# NetConnectNotAllowedError will be raised. This is handy when you want to
|
39
|
+
# make sure your tests are self-contained, or want to catch the scenario
|
40
|
+
# when a URI is changed in implementation code without a corresponding test
|
41
|
+
# change.
|
41
42
|
#
|
42
43
|
# When <tt>FakeWeb.allow_net_connect = true</tt> (the default), requests to
|
43
|
-
# URIs not
|
44
|
+
# URIs not stubbed with FakeWeb are passed through to Net::HTTP.
|
44
45
|
def self.allow_net_connect=(allowed)
|
45
46
|
@allow_net_connect = allowed
|
46
47
|
end
|
@@ -55,6 +56,12 @@ module FakeWeb
|
|
55
56
|
@allow_net_connect
|
56
57
|
end
|
57
58
|
|
59
|
+
# This exception is raised if you set <tt>FakeWeb.allow_net_connect =
|
60
|
+
# false</tt> and subsequently try to make a request to a URI you haven't
|
61
|
+
# stubbed.
|
62
|
+
class NetConnectNotAllowedError < StandardError; end;
|
63
|
+
|
64
|
+
|
58
65
|
# Register +uri+ to be handled according to +options+. +uri+ can be a
|
59
66
|
# +String+ or an +URI+ object. +options+ must be either a +Hash+ or
|
60
67
|
# an +Array+ of +Hashes+ (see below) that must contain any one of the
|
@@ -170,7 +177,7 @@ module FakeWeb
|
|
170
177
|
|
171
178
|
def normalize_uri(uri)
|
172
179
|
case uri
|
173
|
-
when URI
|
180
|
+
when URI then uri
|
174
181
|
else
|
175
182
|
uri = 'http://' + uri unless uri.match('^https?://')
|
176
183
|
parsed_uri = URI.parse(uri)
|
@@ -241,7 +248,7 @@ module FakeWeb
|
|
241
248
|
|
242
249
|
def baked_response
|
243
250
|
resp = case options[:response]
|
244
|
-
when Net::HTTPResponse
|
251
|
+
when Net::HTTPResponse then options[:response]
|
245
252
|
when String
|
246
253
|
socket = Net::BufferedIO.new(options[:response])
|
247
254
|
r = Net::HTTPResponse.read_new(socket)
|
@@ -260,7 +267,8 @@ module FakeWeb
|
|
260
267
|
return unless options.has_key?(:exception)
|
261
268
|
ex_alloc = options[:exception].allocate
|
262
269
|
ex_instance = case ex_alloc
|
263
|
-
when Net::HTTPError, OpenURI::HTTPError
|
270
|
+
when Net::HTTPError, OpenURI::HTTPError
|
271
|
+
options[:exception].new('Exception from FakeWeb', response)
|
264
272
|
else options[:exception].new
|
265
273
|
end
|
266
274
|
raise ex_instance
|
@@ -2,39 +2,36 @@ require File.join(File.dirname(__FILE__), "test_helper")
|
|
2
2
|
|
3
3
|
class TestFakeWebAllowNetConnect < Test::Unit::TestCase
|
4
4
|
|
5
|
+
def setup
|
6
|
+
@original_allow_net_connect = FakeWeb.allow_net_connect?
|
7
|
+
end
|
8
|
+
|
9
|
+
def teardown
|
10
|
+
FakeWeb.allow_net_connect = @original_allow_net_connect
|
11
|
+
end
|
12
|
+
|
13
|
+
|
5
14
|
def test_unregistered_requests_are_passed_through_when_allow_net_connect_is_true
|
6
|
-
original_value = FakeWeb.allow_net_connect?
|
7
15
|
FakeWeb.allow_net_connect = true
|
8
|
-
|
9
16
|
setup_expectations_for_real_apple_hot_news_request
|
10
17
|
Net::HTTP.get(URI.parse("http://images.apple.com/main/rss/hotnews/hotnews.rss"))
|
11
|
-
|
12
|
-
FakeWeb.allow_net_connect = original_value
|
13
18
|
end
|
14
19
|
|
15
20
|
def test_raises_for_unregistered_requests_when_allow_net_connect_is_false
|
16
|
-
original_value = FakeWeb.allow_net_connect?
|
17
21
|
FakeWeb.allow_net_connect = false
|
18
|
-
|
19
|
-
assert_raise RuntimeError do
|
22
|
+
exception = assert_raise FakeWeb::NetConnectNotAllowedError do
|
20
23
|
Net::HTTP.get(URI.parse('http://example.com/'))
|
21
24
|
end
|
22
|
-
|
23
|
-
FakeWeb.allow_net_connect = original_value
|
24
25
|
end
|
25
26
|
|
26
27
|
def test_question_mark_method_returns_true_after_setting_allow_net_connect_to_true
|
27
|
-
original_value = FakeWeb.allow_net_connect?
|
28
28
|
FakeWeb.allow_net_connect = true
|
29
29
|
assert FakeWeb.allow_net_connect?
|
30
|
-
FakeWeb.allow_net_connect = original_value
|
31
30
|
end
|
32
31
|
|
33
32
|
def test_question_mark_method_returns_false_after_setting_allow_net_connect_to_false
|
34
|
-
original_value = FakeWeb.allow_net_connect?
|
35
33
|
FakeWeb.allow_net_connect = false
|
36
34
|
assert !FakeWeb.allow_net_connect?
|
37
|
-
FakeWeb.allow_net_connect = original_value
|
38
35
|
end
|
39
36
|
|
40
37
|
def test_allow_net_connect_is_true_by_default
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chrisk-fakeweb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.2.
|
4
|
+
version: 1.1.2.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Blaine Cook
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-12-31 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -66,7 +66,7 @@ rubyforge_project:
|
|
66
66
|
rubygems_version: 1.2.0
|
67
67
|
signing_key:
|
68
68
|
specification_version: 2
|
69
|
-
summary: A
|
69
|
+
summary: A tool for faking responses to HTTP requests
|
70
70
|
test_files:
|
71
71
|
- test/fixtures
|
72
72
|
- test/fixtures/test_example.txt
|