chrisk-fakeweb 1.2.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,17 @@
1
+ fakeweb (1.2.1)
2
+
3
+ * fix that query parameters are handled correctly when registering with a URI
4
+ object [Anselmo Alves, Chris Kampmeier]
5
+
6
+ * fix an exception when registering with the :response option and a string
7
+ containing "\0" [Jonathan Baudanza, Chris Kampmeier]
8
+
9
+ * fix that trailing slashes were considered significant for requests to the root
10
+ of a domain [Chris Kampmeier]
11
+
12
+ * add support for HTTP basic authentication via userinfo strings in URIs
13
+ [Michael Bleigh]
14
+
1
15
  fakeweb (1.2.0)
2
16
 
3
17
  * add lib/fakeweb.rb so you can require "fakeweb" as well [Chris Kampmeier]
@@ -11,6 +11,10 @@ RubyForge mirror. Just install the gem:
11
11
 
12
12
  sudo gem install fakeweb
13
13
 
14
+ Note: the gem was previously available as +FakeWeb+ (capital letters), but now
15
+ all versions are simply registered as +fakeweb+. If you have any old +FakeWeb+
16
+ gems lying around, remove them: <tt>sudo gem uninstall FakeWeb</tt>
17
+
14
18
 
15
19
  == Help and discussion
16
20
 
@@ -19,6 +23,7 @@ RDocs for the current release are available at http://fakeweb.rubyforge.org.
19
23
  There's a mailing list for questions and discussion at
20
24
  http://groups.google.com/group/fakeweb-users.
21
25
 
26
+ The main source repository is http://github.com/chrisk/fakeweb.
22
27
 
23
28
  == Examples
24
29
 
@@ -86,6 +91,21 @@ option for that response.)
86
91
  req.delete("/posts/1").body # => "Post not found"
87
92
  end
88
93
 
94
+ === Using HTTP basic authentication
95
+
96
+ You can stub requests that use basic authentication with +userinfo+ strings in
97
+ the URIs:
98
+
99
+ FakeWeb.register_uri("http://example.com/secret", :string => "Unauthorized", :status => ["401", "Unauthorized"])
100
+ FakeWeb.register_uri("http://user:pass@example.com/secret", :string => "Authorized")
101
+
102
+ Net::HTTP.start("example.com") do |http|
103
+ req = Net::HTTP::Get.new("/secret")
104
+ http.request(req) # => "Unauthorized"
105
+ req.basic_auth("user", "pass")
106
+ http.request(req) # => "Authorized"
107
+ end
108
+
89
109
  === Clearing registered URIs
90
110
 
91
111
  The FakeWeb registry is a singleton that lasts for the duration of your
@@ -159,4 +179,4 @@ Copyright 2008-2009 various contributors
159
179
  with FakeWeb; if not, write to the Free Software Foundation, Inc., 51
160
180
  Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
161
181
 
162
- See <tt>LICENSE.txt</tt> for the full terms.
182
+ See <tt>LICENSE.txt</tt> for the full terms.
data/Rakefile CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'rubygems'
2
+ require 'rake/gempackagetask'
2
3
  require 'rake/testtask'
3
4
  require 'rake/rdoctask'
4
5
 
@@ -7,7 +8,7 @@ task :default => :test
7
8
  desc "Run All Tests"
8
9
  Rake::TestTask.new :test do |test|
9
10
  test.test_files = ["test/**/*.rb"]
10
- test.verbose = true
11
+ test.verbose = false
11
12
  end
12
13
 
13
14
  desc "Generate Documentation"
@@ -60,4 +61,10 @@ else
60
61
  t.rcov_opts << "--exclude gems"
61
62
  t.rcov_opts << "--no-validator-links"
62
63
  end
63
- end
64
+ end
65
+
66
+ spec = eval(File.read(File.join(File.dirname(__FILE__), "fakeweb.gemspec")))
67
+ Rake::GemPackageTask.new(spec) do |pkg|
68
+ pkg.need_tar_gz = true
69
+ pkg.need_zip = true
70
+ end
@@ -14,7 +14,11 @@ module Net #:nodoc: all
14
14
  when Socket, OpenSSL::SSL::SSLSocket, IO
15
15
  io
16
16
  when String
17
- File.exists?(io) ? File.open(io, "r") : StringIO.new(io)
17
+ if !io.include?("\0") && File.exists?(io)
18
+ File.open(io, "r")
19
+ else
20
+ StringIO.new(io)
21
+ end
18
22
  end
19
23
  raise "Unable to create local socket" unless @io
20
24
  end
@@ -34,7 +38,13 @@ module Net #:nodoc: all
34
38
  path = request.path
35
39
  path = URI.parse(request.path).request_uri if request.path =~ /^http/
36
40
 
37
- uri = "#{protocol}://#{self.address}:#{self.port}#{path}"
41
+ if request['authorization'].nil?
42
+ userinfo = ""
43
+ else
44
+ userinfo = request['authorization'].sub(/^Basic /, "").unpack("m").first + "@"
45
+ end
46
+
47
+ uri = "#{protocol}://#{userinfo}#{self.address}:#{self.port}#{path}"
38
48
  method = request.method.downcase.to_sym
39
49
 
40
50
  if FakeWeb.registered_uri?(method, uri)
@@ -53,4 +63,4 @@ module Net #:nodoc: all
53
63
  end
54
64
  end
55
65
 
56
- end
66
+ end
@@ -56,14 +56,15 @@ module FakeWeb
56
56
  private
57
57
 
58
58
  def normalize_uri(uri)
59
- case uri
60
- when URI then uri
61
- else
62
- uri = 'http://' + uri unless uri.match('^https?://')
63
- parsed_uri = URI.parse(uri)
64
- parsed_uri.query = sort_query_params(parsed_uri.query)
65
- parsed_uri
66
- end
59
+ normalized_uri =
60
+ case uri
61
+ when URI then uri
62
+ else
63
+ uri = 'http://' + uri unless uri.match('^https?://')
64
+ URI.parse(uri)
65
+ end
66
+ normalized_uri.query = sort_query_params(normalized_uri.query)
67
+ normalized_uri.normalize
67
68
  end
68
69
 
69
70
  def sort_query_params(query)
@@ -0,0 +1,44 @@
1
+ require File.join(File.dirname(__FILE__), "test_helper")
2
+
3
+ class TestFakeAuthentication < Test::Unit::TestCase
4
+ def setup
5
+ FakeWeb.register_uri('http://user:pass@mock/auth.txt', :string => 'authorized')
6
+ FakeWeb.register_uri('http://user2:pass@mock/auth.txt', :string => 'wrong user')
7
+ FakeWeb.register_uri('http://mock/auth.txt', :string => 'unauthorized')
8
+ end
9
+
10
+ def test_register_uri_with_authentication
11
+ FakeWeb.register_uri('http://user:pass@mock/test_example.txt', :string => "example")
12
+ assert FakeWeb.registered_uri?('http://user:pass@mock/test_example.txt')
13
+ end
14
+
15
+ def test_register_uri_with_authentication_doesnt_trigger_without
16
+ FakeWeb.register_uri('http://user:pass@mock/test_example.txt', :string => "example")
17
+ assert !FakeWeb.registered_uri?('http://mock/test_example.txt')
18
+ end
19
+
20
+ def test_register_uri_with_authentication_doesnt_trigger_with_incorrect_credentials
21
+ FakeWeb.register_uri('http://user:pass@mock/test_example.txt', :string => "example")
22
+ assert !FakeWeb.registered_uri?('http://user:wrong@mock/test_example.txt')
23
+ end
24
+
25
+ def test_unauthenticated_request
26
+ http = Net::HTTP.new('mock', 80)
27
+ req = Net::HTTP::Get.new('/auth.txt')
28
+ assert_equal http.request(req).body, 'unauthorized'
29
+ end
30
+
31
+ def test_authenticated_request
32
+ http = Net::HTTP.new('mock',80)
33
+ req = Net::HTTP::Get.new('/auth.txt')
34
+ req.basic_auth 'user', 'pass'
35
+ assert_equal http.request(req).body, 'authorized'
36
+ end
37
+
38
+ def test_incorrectly_authenticated_request
39
+ http = Net::HTTP.new('mock',80)
40
+ req = Net::HTTP::Get.new('/auth.txt')
41
+ req.basic_auth 'user2', 'pass'
42
+ assert_equal http.request(req).body, 'wrong user'
43
+ end
44
+ end
@@ -486,4 +486,15 @@ class TestFakeWeb < Test::Unit::TestCase
486
486
  def test_requiring_fakeweb_instead_of_fake_web
487
487
  require "fakeweb"
488
488
  end
489
+
490
+ def test_registering_using_response_with_string_containing_null_byte
491
+ # Regression test for File.exists? raising an ArgumentError ("string
492
+ # contains null byte") since :response first tries to find by filename.
493
+ # The string should be treated as a response body, instead, and an
494
+ # EOFError is raised when the byte is encountered.
495
+ FakeWeb.register_uri("http://example.com", :response => "test\0test")
496
+ assert_raise EOFError do
497
+ Net::HTTP.get(URI.parse("http://example.com"))
498
+ end
499
+ end
489
500
  end
@@ -6,24 +6,36 @@ class TestFakeWebQueryString < Test::Unit::TestCase
6
6
  FakeWeb.clean_registry
7
7
  end
8
8
 
9
- def test_register_uri_with_query_params
9
+ def test_register_uri_string_with_query_params
10
10
  FakeWeb.register_uri('http://example.com/?a=1&b=1', :string => 'foo')
11
11
  assert FakeWeb.registered_uri?('http://example.com/?a=1&b=1')
12
+
13
+ FakeWeb.register_uri(URI.parse("http://example.org/?a=1&b=1"), :string => "foo")
14
+ assert FakeWeb.registered_uri?("http://example.org/?a=1&b=1")
12
15
  end
13
16
 
14
17
  def test_register_uri_with_query_params_and_check_in_different_order
15
18
  FakeWeb.register_uri('http://example.com/?a=1&b=1', :string => 'foo')
16
19
  assert FakeWeb.registered_uri?('http://example.com/?b=1&a=1')
20
+
21
+ FakeWeb.register_uri(URI.parse('http://example.org/?a=1&b=1'), :string => 'foo')
22
+ assert FakeWeb.registered_uri?('http://example.org/?b=1&a=1')
17
23
  end
18
24
 
19
25
  def test_registered_uri_gets_recognized_with_empty_query_params
20
26
  FakeWeb.register_uri('http://example.com/', :string => 'foo')
21
27
  assert FakeWeb.registered_uri?('http://example.com/?')
28
+
29
+ FakeWeb.register_uri(URI.parse('http://example.org/'), :string => 'foo')
30
+ assert FakeWeb.registered_uri?('http://example.org/?')
22
31
  end
23
32
 
24
33
  def test_register_uri_with_empty_query_params_and_check_with_none
25
34
  FakeWeb.register_uri('http://example.com/?', :string => 'foo')
26
35
  assert FakeWeb.registered_uri?('http://example.com/')
36
+
37
+ FakeWeb.register_uri(URI.parse('http://example.org/?'), :string => 'foo')
38
+ assert FakeWeb.registered_uri?('http://example.org/')
27
39
  end
28
40
 
29
41
  def test_registry_sort_query_params
@@ -0,0 +1,62 @@
1
+ require File.join(File.dirname(__FILE__), "test_helper")
2
+
3
+ class TestFakeWebTrailingSlashes < Test::Unit::TestCase
4
+
5
+ def setup
6
+ FakeWeb.clean_registry
7
+ @original_allow_net_connect = FakeWeb.allow_net_connect?
8
+ end
9
+
10
+ def teardown
11
+ FakeWeb.allow_net_connect = @old_allow_net_conncet
12
+ end
13
+
14
+ def test_registering_root_without_slash_and_ask_predicate_method_with_slash
15
+ FakeWeb.register_uri(:get, "http://www.example.com", :string => "root")
16
+ assert FakeWeb.registered_uri?(:get, "http://www.example.com/")
17
+ end
18
+
19
+ def test_registering_root_without_slash_and_request
20
+ FakeWeb.register_uri(:get, "http://www.example.com", :string => "root")
21
+ response = Net::HTTP.start("www.example.com") { |query| query.get('/') }
22
+ assert_equal "root", response.body
23
+ end
24
+
25
+ def test_registering_root_with_slash_and_ask_predicate_method_without_slash
26
+ FakeWeb.register_uri(:get, "http://www.example.com/", :string => "root")
27
+ assert FakeWeb.registered_uri?(:get, "http://www.example.com")
28
+ end
29
+
30
+ def test_registering_root_with_slash_and_request
31
+ FakeWeb.register_uri(:get, "http://www.example.com/", :string => "root")
32
+ response = Net::HTTP.start("www.example.com") { |query| query.get('/') }
33
+ assert_equal "root", response.body
34
+ end
35
+
36
+ def test_registering_path_without_slash_and_ask_predicate_method_with_slash
37
+ FakeWeb.register_uri(:get, "http://www.example.com/users", :string => "User list")
38
+ assert !FakeWeb.registered_uri?(:get, "http://www.example.com/users/")
39
+ end
40
+
41
+ def test_registering_path_without_slash_and_request_with_slash
42
+ FakeWeb.allow_net_connect = false
43
+ FakeWeb.register_uri(:get, "http://www.example.com/users", :string => "User list")
44
+ assert_raise FakeWeb::NetConnectNotAllowedError do
45
+ response = Net::HTTP.start("www.example.com") { |query| query.get('/users/') }
46
+ end
47
+ end
48
+
49
+ def test_registering_path_with_slash_and_ask_predicate_method_without_slash
50
+ FakeWeb.register_uri(:get, "http://www.example.com/users/", :string => "User list")
51
+ assert !FakeWeb.registered_uri?(:get, "http://www.example.com/users")
52
+ end
53
+
54
+ def test_registering_path_with_slash_and_request_without_slash
55
+ FakeWeb.allow_net_connect = false
56
+ FakeWeb.register_uri(:get, "http://www.example.com/users/", :string => "User list")
57
+ assert_raise FakeWeb::NetConnectNotAllowedError do
58
+ response = Net::HTTP.start("www.example.com") { |query| query.get('/users') }
59
+ end
60
+ end
61
+
62
+ end
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.2.0
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Blaine Cook
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-03-07 00:00:00 -08:00
13
+ date: 2009-04-29 00:00:00 -07:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -56,10 +56,12 @@ files:
56
56
  - test/fixtures/test_example.txt
57
57
  - test/fixtures/test_txt_file
58
58
  - test/test_allow_net_connect.rb
59
+ - test/test_fake_authentication.rb
59
60
  - test/test_fake_web.rb
60
61
  - test/test_fake_web_open_uri.rb
61
62
  - test/test_helper.rb
62
63
  - test/test_query_string.rb
64
+ - test/test_trailing_slashes.rb
63
65
  has_rdoc: true
64
66
  homepage: http://github.com/chrisk/fakeweb
65
67
  post_install_message:
@@ -101,7 +103,9 @@ test_files:
101
103
  - test/fixtures/test_example.txt
102
104
  - test/fixtures/test_txt_file
103
105
  - test/test_allow_net_connect.rb
106
+ - test/test_fake_authentication.rb
104
107
  - test/test_fake_web.rb
105
108
  - test/test_fake_web_open_uri.rb
106
109
  - test/test_helper.rb
107
110
  - test/test_query_string.rb
111
+ - test/test_trailing_slashes.rb