webmock 1.6.4 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. data/.gemtest +0 -0
  2. data/.gitignore +3 -1
  3. data/.travis.yml +6 -0
  4. data/CHANGELOG.md +211 -118
  5. data/Gemfile +16 -1
  6. data/Guardfile +24 -0
  7. data/LICENSE +1 -1
  8. data/README.md +64 -15
  9. data/Rakefile +19 -6
  10. data/lib/webmock.rb +9 -4
  11. data/lib/webmock/api.rb +5 -4
  12. data/lib/webmock/assertion_failure.rb +1 -1
  13. data/lib/webmock/callback_registry.rb +1 -1
  14. data/lib/webmock/config.rb +2 -2
  15. data/lib/webmock/cucumber.rb +1 -1
  16. data/lib/webmock/errors.rb +17 -5
  17. data/lib/webmock/http_lib_adapters/{curb.rb → curb_adapter.rb} +79 -49
  18. data/lib/webmock/http_lib_adapters/{em_http_request.rb → em_http_request/em_http_request_0_x.rb} +20 -15
  19. data/lib/webmock/http_lib_adapters/em_http_request/em_http_request_1_x.rb +201 -0
  20. data/lib/webmock/http_lib_adapters/em_http_request_adapter.rb +11 -0
  21. data/lib/webmock/http_lib_adapters/http_lib_adapter.rb +7 -0
  22. data/lib/webmock/http_lib_adapters/http_lib_adapter_registry.rb +19 -0
  23. data/lib/webmock/http_lib_adapters/{httpclient.rb → httpclient_adapter.rb} +35 -8
  24. data/lib/webmock/http_lib_adapters/net_http.rb +84 -25
  25. data/lib/webmock/http_lib_adapters/net_http_response.rb +17 -17
  26. data/lib/webmock/http_lib_adapters/patron_adapter.rb +124 -0
  27. data/lib/webmock/http_lib_adapters/typhoeus_hydra_adapter.rb +166 -0
  28. data/lib/webmock/minitest.rb +15 -0
  29. data/lib/webmock/rack_response.rb +52 -0
  30. data/lib/webmock/request_pattern.rb +4 -2
  31. data/lib/webmock/request_signature.rb +4 -0
  32. data/lib/webmock/request_stub.rb +35 -2
  33. data/lib/webmock/responses_sequence.rb +2 -2
  34. data/lib/webmock/rspec.rb +2 -2
  35. data/lib/webmock/rspec/matchers.rb +9 -4
  36. data/lib/webmock/rspec/matchers/webmock_matcher.rb +1 -1
  37. data/lib/webmock/stub_registry.rb +1 -1
  38. data/lib/webmock/stub_request_snippet.rb +14 -11
  39. data/lib/webmock/util/hash_keys_stringifier.rb +4 -4
  40. data/lib/webmock/util/headers.rb +3 -3
  41. data/lib/webmock/util/json.rb +54 -0
  42. data/lib/webmock/util/uri.rb +1 -1
  43. data/lib/webmock/version.rb +1 -1
  44. data/lib/webmock/webmock.rb +20 -3
  45. data/minitest/test_helper.rb +29 -0
  46. data/minitest/test_webmock.rb +6 -0
  47. data/minitest/webmock_spec.rb +30 -0
  48. data/spec/curb_spec.rb +26 -8
  49. data/spec/curb_spec_helper.rb +6 -6
  50. data/spec/em_http_request_spec.rb +95 -1
  51. data/spec/em_http_request_spec_helper.rb +16 -16
  52. data/spec/errors_spec.rb +19 -4
  53. data/spec/example_curl_output.txt +22 -22
  54. data/spec/http_lib_adapters/http_lib_adapter_registry_spec.rb +17 -0
  55. data/spec/http_lib_adapters/http_lib_adapter_spec.rb +12 -0
  56. data/spec/httpclient_spec.rb +1 -1
  57. data/spec/httpclient_spec_helper.rb +3 -38
  58. data/spec/my_rack_app.rb +18 -0
  59. data/spec/net_http_shared.rb +125 -0
  60. data/spec/net_http_spec.rb +27 -31
  61. data/spec/net_http_spec_helper.rb +4 -34
  62. data/spec/network_connection.rb +1 -1
  63. data/spec/patron_spec_helper.rb +4 -7
  64. data/spec/quality_spec.rb +60 -0
  65. data/spec/rack_response_spec.rb +33 -0
  66. data/spec/real_net_http_spec.rb +20 -0
  67. data/spec/request_execution_verifier_spec.rb +8 -8
  68. data/spec/request_pattern_spec.rb +3 -3
  69. data/spec/request_stub_spec.rb +19 -19
  70. data/spec/response_spec.rb +8 -8
  71. data/spec/spec_helper.rb +14 -11
  72. data/spec/stub_request_snippet_spec.rb +85 -37
  73. data/spec/support/webmock_server.rb +62 -0
  74. data/spec/typhoeus_hydra_spec.rb +53 -0
  75. data/spec/typhoeus_hydra_spec_helper.rb +50 -0
  76. data/spec/util/headers_spec.rb +5 -5
  77. data/spec/util/json_spec.rb +7 -0
  78. data/spec/util/uri_spec.rb +1 -1
  79. data/spec/vendor/addressable/lib/uri.rb +1 -0
  80. data/spec/vendor/crack/lib/crack.rb +1 -0
  81. data/spec/vendor/right_http_connection-1.2.4/History.txt +4 -4
  82. data/spec/vendor/right_http_connection-1.2.4/README.txt +4 -4
  83. data/spec/vendor/right_http_connection-1.2.4/Rakefile +3 -3
  84. data/spec/vendor/right_http_connection-1.2.4/lib/net_fix.rb +4 -4
  85. data/spec/vendor/right_http_connection-1.2.4/setup.rb +4 -4
  86. data/spec/webmock_shared.rb +375 -143
  87. data/spec/webmock_spec.rb +7 -0
  88. data/test/http_request.rb +24 -0
  89. data/test/shared_test.rb +47 -0
  90. data/test/test_helper.rb +6 -3
  91. data/test/test_webmock.rb +2 -67
  92. data/webmock.gemspec +8 -7
  93. metadata +153 -88
  94. data/lib/webmock/http_lib_adapters/patron.rb +0 -100
  95. data/spec/other_net_http_libs_spec.rb +0 -30
@@ -1,3 +1,5 @@
1
+ require 'ostruct'
2
+
1
3
  module CurbSpecHelper
2
4
  def http_request(method, uri, options = {}, &block)
3
5
  uri = Addressable::URI.heuristic_parse(uri)
@@ -5,7 +7,8 @@ module CurbSpecHelper
5
7
 
6
8
  curl = curb_http_request(uri, method, body, options)
7
9
 
8
- status, response_headers = Curl::Easy::WebmockHelper.parse_header_string(curl.header_str)
10
+ status, response_headers =
11
+ WebMock::HttpLibAdapters::CurbAdapter.parse_header_string(curl.header_str)
9
12
 
10
13
  OpenStruct.new(
11
14
  :body => curl.body_str,
@@ -17,7 +20,7 @@ module CurbSpecHelper
17
20
 
18
21
  def setup_request(uri, curl, options={})
19
22
  curl ||= Curl::Easy.new
20
- curl.url = uri.omit(:userinfo).to_s
23
+ curl.url = uri.omit(:userinfo).to_s
21
24
  curl.username = uri.user
22
25
  curl.password = uri.password
23
26
  curl.timeout = 10
@@ -38,9 +41,6 @@ module CurbSpecHelper
38
41
  Curl::Err::ConnectionFailedError
39
42
  end
40
43
 
41
- def setup_expectations_for_real_request(options = {})
42
- end
43
-
44
44
  def http_library
45
45
  :curb
46
46
  end
@@ -54,7 +54,7 @@ module CurbSpecHelper
54
54
  curl.post_body = body
55
55
  when :put
56
56
  curl.put_data = body
57
- end
57
+ end
58
58
 
59
59
  curl.http(method)
60
60
  curl
@@ -10,6 +10,97 @@ unless RUBY_PLATFORM =~ /java/
10
10
 
11
11
  it_should_behave_like "WebMock"
12
12
 
13
+ #functionality only supported for em-http-request 1.x
14
+ if defined?(EventMachine::HttpConnection)
15
+ describe "with middleware" do
16
+
17
+ it "should work with request middleware" do
18
+ stub_http_request(:get, "www.example.com").with(:body => 'bar')
19
+
20
+ middleware = Class.new do
21
+ def request(client, head, body)
22
+ [{}, 'bar']
23
+ end
24
+ end
25
+
26
+ EM.run do
27
+ conn = EventMachine::HttpRequest.new('http://www.example.com/')
28
+
29
+ conn.use middleware
30
+
31
+ http = conn.get(:body => 'foo')
32
+
33
+ http.callback do
34
+ WebMock.should have_requested(:get, "www.example.com").with(:body => 'bar')
35
+ EM.stop
36
+ end
37
+ end
38
+ end
39
+
40
+ it "should work with response middleware" do
41
+ stub_http_request(:get, "www.example.com").to_return(:body => 'foo')
42
+
43
+ middleware = Class.new do
44
+ def response(resp)
45
+ resp.response = 'bar'
46
+ end
47
+ end
48
+
49
+ EM.run do
50
+ conn = EventMachine::HttpRequest.new('http://www.example.com/')
51
+
52
+ conn.use middleware
53
+
54
+ http = conn.get
55
+
56
+ http.callback do
57
+ http.response.should be == 'bar'
58
+ EM.stop
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ # not pretty, but it works
65
+ describe "with synchrony" do
66
+ let(:webmock_em_http) { File.expand_path(File.join(File.dirname(__FILE__), "../lib/webmock/http_lib_adapters/em_http_request/em_http_request_1_x.rb")) }
67
+
68
+ before(:each) do
69
+ # need to reload the webmock em-http adapter after we require synchrony
70
+ WebMock::HttpLibAdapters::EmHttpRequestAdapter.disable!
71
+ $".delete webmock_em_http
72
+ $".delete File.expand_path(File.join(File.dirname(__FILE__), "../lib/webmock/http_lib_adapters/em_http_request_adapter.rb"))
73
+ require 'em-synchrony'
74
+ require 'em-synchrony/em-http'
75
+ require File.expand_path(File.join(File.dirname(__FILE__), "../lib/webmock/http_lib_adapters/em_http_request_adapter.rb"))
76
+ end
77
+
78
+ it "should work" do
79
+ stub_request(:post, /.*.testserver.com*/).to_return(:status => 200, :body => 'ok')
80
+ lambda {
81
+ EM.run do
82
+ fiber = Fiber.new do
83
+ http = EM::HttpRequest.new("http://www.testserver.com").post :body => "foo=bar&baz=bang", :timeout => 60
84
+ EM.stop
85
+ end
86
+ fiber.resume
87
+ end
88
+ }.should_not raise_error
89
+ end
90
+
91
+ after(:each) do
92
+ EM.send(:remove_const, :Synchrony)
93
+ EM.send(:remove_const, :HTTPMethods)
94
+ WebMock::HttpLibAdapters::EmHttpRequestAdapter.disable!
95
+ $".reject! {|path| path.include? "em-http-request"}
96
+ $".delete webmock_em_http
97
+ $".delete File.expand_path(File.join(File.dirname(__FILE__), "../lib/webmock/http_lib_adapters/em_http_request_adapter.rb"))
98
+ require 'em-http-request'
99
+ require File.expand_path(File.join(File.dirname(__FILE__), "../lib/webmock/http_lib_adapters/em_http_request_adapter.rb"))
100
+ end
101
+ end
102
+ end
103
+
13
104
  it "should work with streaming" do
14
105
  stub_http_request(:get, "www.example.com").to_return(:body => "abc")
15
106
  response = ""
@@ -36,7 +127,10 @@ unless RUBY_PLATFORM =~ /java/
36
127
  end
37
128
 
38
129
  describe "mocking EM::HttpClient API" do
39
- before { stub_http_request(:get, "www.example.com/") }
130
+ before do
131
+ stub_http_request(:get, "www.example.com/")
132
+ WebMock::HttpLibAdapters::EmHttpRequestAdapter.enable!
133
+ end
40
134
  subject do
41
135
  client = nil
42
136
  EM.run do
@@ -6,34 +6,37 @@ module EMHttpRequestSpecHelper
6
6
  end
7
7
 
8
8
  def http_request(method, uri, options = {}, &block)
9
+ @http = nil
10
+ head = options[:headers] || {}
9
11
  response = nil
10
12
  error = nil
11
13
  uri = Addressable::URI.heuristic_parse(uri)
12
14
  EventMachine.run {
13
- request = EventMachine::HttpRequest.new("#{uri.omit(:userinfo).normalize.to_s}")
14
- http = request.send(:setup_request, method, {
15
- :timeout => 10,
15
+ request = EventMachine::HttpRequest.new("#{uri.normalize.to_s}")
16
+ http = request.send(method, {
17
+ :timeout => 10,
16
18
  :body => options[:body],
17
19
  :query => options[:query],
18
- 'authorization' => [uri.user, uri.password],
19
- :head => options[:headers]}, &block)
20
+ :head => head.merge('authorization' => [uri.user, uri.password])
21
+ }, &block)
20
22
  http.errback {
21
23
  error = if http.respond_to?(:errors)
22
- http.errors
24
+ http.errors
23
25
  else
24
26
  http.error
25
- end
26
- failed
27
+ end
28
+ failed
27
29
  }
28
- http.callback {
30
+ http.callback {
29
31
  response = OpenStruct.new({
30
32
  :body => http.response,
31
- :headers => WebMock::Util::Headers.normalize_headers(extract_response_headers(http)),
33
+ :headers => WebMock::Util::Headers.normalize_headers(extract_response_headers(http)),
32
34
  :message => http.response_header.http_reason,
33
35
  :status => http.response_header.status.to_s
34
36
  })
35
37
  EventMachine.stop
36
38
  }
39
+ @http = http
37
40
  }
38
41
  raise error if error
39
42
  response
@@ -47,21 +50,18 @@ module EMHttpRequestSpecHelper
47
50
  ""
48
51
  end
49
52
 
50
- def setup_expectations_for_real_request(options = {})
51
- end
52
-
53
53
  def http_library
54
54
  :em_http_request
55
55
  end
56
-
56
+
57
57
  private
58
-
58
+
59
59
  def extract_response_headers(http)
60
60
  headers = {}
61
61
  if http.response_header
62
62
  http.response_header.each do |k,v|
63
63
  v = v.join(", ") if v.is_a?(Array)
64
- headers[k] = v
64
+ headers[k] = v
65
65
  end
66
66
  end
67
67
  headers
data/spec/errors_spec.rb CHANGED
@@ -5,13 +5,28 @@ describe "errors" do
5
5
  describe "message" do
6
6
  it "should have message with request signature and snippet" do
7
7
  request_signature = mock(:to_s => "aaa")
8
+ request_stub = mock
9
+ WebMock::RequestStub.stub!(:from_request_signature).and_return(request_stub)
8
10
  WebMock::StubRequestSnippet.stub!(:new).
9
- with(request_signature).and_return(mock(:to_s => "bbb"))
11
+ with(request_stub).and_return(mock(:to_s => "bbb"))
10
12
  expected = "Real HTTP connections are disabled. Unregistered request: aaa" +
11
13
  "\n\nYou can stub this request with the following snippet:\n\n" +
12
- "bbb\n\n============================================================"
13
- WebMock::NetConnectNotAllowedError.new(request_signature).message.should == expected
14
+ "bbb\n\n============================================================"
15
+ WebMock::NetConnectNotAllowedError.new(request_signature).message.should == expected
16
+ end
17
+
18
+ it "should have message with registered stubs if available" do
19
+ request_signature = mock(:to_s => "aaa")
20
+ request_stub = mock
21
+ WebMock::StubRegistry.instance.stub!(:request_stubs).and_return([request_stub])
22
+ WebMock::RequestStub.stub!(:from_request_signature).and_return(request_stub)
23
+ WebMock::StubRequestSnippet.stub!(:new).
24
+ with(request_stub).and_return(mock(:to_s => "bbb"))
25
+ expected = "Real HTTP connections are disabled. Unregistered request: aaa" +
26
+ "\n\nYou can stub this request with the following snippet:\n\n" +
27
+ "bbb\n\nregistered request stubs:\n\nbbb\n\n============================================================"
28
+ WebMock::NetConnectNotAllowedError.new(request_signature).message.should == expected
14
29
  end
15
30
  end
16
31
  end
17
- end
32
+ end
@@ -1,22 +1,22 @@
1
- HTTP/1.1 202 OK
2
- Content-Type: text/html; charset=UTF-8
3
- Connection: Keep-Alive
4
- Date: Sat, 23 Jan 2010 01:01:05 GMT
5
- Content-Length: 438
6
- Accept: image/jpeg
7
- Accept: image/png
8
-
9
- <HTML>
10
- <HEAD>
11
- <TITLE>Example Web Page</TITLE>
12
- </HEAD>
13
- <body>
14
- <p>You have reached this web page by typing &quot;example.com&quot;,
15
- &quot;example.net&quot;,
16
- or &quot;example.org&quot; into your web browser.</p>
17
- <p>These domain names are reserved for use in documentation and are not available
18
- for registration. See <a href="http://www.rfc-editor.org/rfc/rfc2606.txt">RFC
19
- 2606</a>, Section 3.</p>
20
- </BODY>
21
- </HTML>
22
-
1
+ HTTP/1.1 202 OK
2
+ Content-Type: text/html; charset=UTF-8
3
+ Connection: Keep-Alive
4
+ Date: Sat, 23 Jan 2010 01:01:05 GMT
5
+ Content-Length: 419
6
+ Accept: image/jpeg
7
+ Accept: image/png
8
+
9
+ <HTML>
10
+ <HEAD>
11
+ <TITLE>Example Web Page</TITLE>
12
+ </HEAD>
13
+ <body>
14
+ <p>You have reached this web page by typing &quot;example.com&quot;,
15
+ &quot;example.net&quot;,
16
+ or &quot;example.org&quot; into your web browser.</p>
17
+ <p>These domain names are reserved for use in documentation and are not available
18
+ for registration. See <a href="http://www.rfc-editor.org/rfc/rfc2606.txt">RFC
19
+ 2606</a>, Section 3.</p>
20
+ </BODY>
21
+ </HTML>
22
+
@@ -0,0 +1,17 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe WebMock::HttpLibAdapterRegistry do
4
+ describe "each_adapter" do
5
+ it "should yield block over each adapter" do
6
+ class MyAdapter < WebMock::HttpLibAdapter; end
7
+ WebMock::HttpLibAdapterRegistry.instance.register(:my_lib, MyAdapter)
8
+ adapters = []
9
+ WebMock::HttpLibAdapterRegistry.instance.each_adapter {|n,a|
10
+ adapters << [n, a]
11
+ }
12
+ adapters.should include([:my_lib, MyAdapter])
13
+ WebMock::HttpLibAdapterRegistry.instance.
14
+ http_lib_adapters.delete(:my_lib)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe WebMock::HttpLibAdapter do
4
+ describe "adapter_for" do
5
+ it "should add adapter to adapter registry" do
6
+ class MyAdapter < WebMock::HttpLibAdapter; end
7
+ WebMock::HttpLibAdapterRegistry.instance.
8
+ should_receive(:register).with(:my_lib, MyAdapter)
9
+ MyAdapter.adapter_for(:my_lib)
10
+ end
11
+ end
12
+ end
@@ -28,7 +28,7 @@ describe "Webmock with HTTPClient" do
28
28
  :get, "http://www.example.com/",
29
29
  :headers => {"a" => ["c", "b"]}).status.should == "200"
30
30
  end
31
-
31
+
32
32
 
33
33
  describe "async requests" do
34
34
 
@@ -2,7 +2,7 @@ module HTTPClientSpecHelper
2
2
  class << self
3
3
  attr_accessor :async_mode
4
4
  end
5
-
5
+
6
6
  def http_request(method, uri, options = {}, &block)
7
7
  uri = Addressable::URI.heuristic_parse(uri)
8
8
  c = HTTPClient.new
@@ -17,7 +17,7 @@ module HTTPClientSpecHelper
17
17
  else
18
18
  response = c.request(*params, &block)
19
19
  end
20
- headers = response.header.all.inject({}) do |headers, header|
20
+ headers = response.header.all.inject({}) do |headers, header|
21
21
  if !headers.has_key?(header[0])
22
22
  headers[header[0]] = header[1]
23
23
  else
@@ -41,43 +41,8 @@ module HTTPClientSpecHelper
41
41
  Errno::ECONNREFUSED
42
42
  end
43
43
 
44
- def setup_expectations_for_real_request(options = {})
45
- socket = mock("TCPSocket")
46
- TCPSocket.should_receive(:new).
47
- with(options[:host], options[:port]).at_least(:once).and_return(socket)
48
-
49
- socket.stub!(:closed?).and_return(false)
50
- socket.stub!(:close).and_return(true)
51
-
52
- request_parts = ["#{options[:method]} #{options[:path]} HTTP/1.1", "Host: #{options[:host]}"]
53
-
54
- if options[:port] == 443
55
- OpenSSL::SSL::SSLSocket.should_receive(:new).
56
- with(socket, instance_of(OpenSSL::SSL::SSLContext)).
57
- at_least(:once).and_return(socket = mock("SSLSocket"))
58
- socket.should_receive(:connect).at_least(:once).with()
59
- socket.should_receive(:peer_cert).and_return(mock('peer cert', :extensions => []))
60
- socket.should_receive(:write).with(/#{request_parts[0]}.*#{request_parts[1]}.*/m).and_return(100)
61
- else
62
- socket.should_receive(:<<).with(/#{request_parts[0]}.*#{request_parts[1]}.*/m).and_return(100)
63
- end
64
-
65
- socket.stub!(:sync=).with(true)
66
-
67
- socket.should_receive(:gets).with("\n").
68
- and_return("HTTP/1.1 #{options[:response_code]} #{options[:response_message]}\r\n",
69
- "Content-Length: #{options[:response_body].length}\r\n",
70
- "\r\n")
71
- socket.stub(:readpartial) do |size, buf|
72
- buf << options[:response_body]
73
- end
74
-
75
- socket.stub!(:eof?).and_return(true)
76
- socket.stub!(:close).and_return(true)
77
- end
78
-
79
44
  def http_library
80
- :http_client
45
+ :httpclient
81
46
  end
82
47
 
83
48
  end
@@ -0,0 +1,18 @@
1
+ require 'rack'
2
+
3
+ class MyRackApp
4
+ def self.call(env)
5
+ case env.values_at('REQUEST_METHOD', 'PATH_INFO')
6
+ when ['GET', '/']
7
+ [200, {}, ["This is my root!"]]
8
+ when ['GET', '/greet']
9
+ name = env['QUERY_STRING'][/name=([^&]*)/, 1] || "World"
10
+ [200, {}, ["Hello, #{name}"]]
11
+ when ['POST', '/greet']
12
+ name = env["rack.input"].read[/name=([^&]*)/, 1] || "World"
13
+ [200, {}, ["Good to meet you, #{name}!"]]
14
+ else
15
+ [404, {}, ['']]
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,125 @@
1
+ shared_examples_for "Net::HTTP" do
2
+ describe "when making real requests", :net_connect => true do
3
+ let(:port){ WebMockServer.instance.port }
4
+
5
+ before(:each) do
6
+ @http = Net::HTTP.new("localhost", port)
7
+ end
8
+
9
+ it "should return a Net::ReadAdapter from response.body when a real request is made with a block and #read_body", :net_connect => true do
10
+ response = Net::HTTP.new("localhost", port).request_get('/') { |r| r.read_body { } }
11
+ response.body.should be_a(Net::ReadAdapter)
12
+ end
13
+
14
+ it "should handle requests with block passed to read_body", :net_connect => true do
15
+ body = ""
16
+ req = Net::HTTP::Get.new("/")
17
+ Net::HTTP.start("localhost", port) do |http|
18
+ http.request(req) do |res|
19
+ res.read_body do |str|
20
+ body << str
21
+ end
22
+ end
23
+ end
24
+ body.should =~ /hello world/
25
+ end
26
+
27
+ it "should connect only once when connected on start", :net_connect => true do
28
+ @http = Net::HTTP.new('localhost', port)
29
+ socket_id_before_request = socket_id_after_request = nil
30
+ @http.start {|conn|
31
+ socket_id_before_request = conn.instance_variable_get(:@socket).object_id
32
+ conn.request(Net::HTTP::Get.new("/"))
33
+ socket_id_after_request = conn.instance_variable_get(:@socket).object_id
34
+ }
35
+ socket_id_after_request.should_not be_nil
36
+ socket_id_after_request.should == socket_id_before_request
37
+ end
38
+
39
+ describe "without start" do
40
+ it "should close connection after a real request" do
41
+ @http.get('/') { }
42
+ @http.should_not be_started
43
+ end
44
+
45
+ it "should execute block exactly once" do
46
+ times = 0
47
+ @http.get('/') { times += 1 }
48
+ times.should == 1
49
+ end
50
+
51
+ it "should have socket open during a real request" do
52
+ socket_id = nil
53
+ @http.get('/') {
54
+ socket_id = @http.instance_variable_get(:@socket).object_id
55
+ }
56
+ socket_id.should_not be_nil
57
+ end
58
+
59
+ it "should be started during a real request" do
60
+ started = nil
61
+ @http.get('/') {
62
+ started = @http.started?
63
+ }
64
+ started.should == true
65
+ @http.started?.should == false
66
+ end
67
+ end
68
+
69
+ describe "with start" do
70
+ it "should close connection after a real request" do
71
+ @http.start {|conn| conn.get('/') { } }
72
+ @http.should_not be_started
73
+ end
74
+
75
+ it "should execute block exactly once" do
76
+ times = 0
77
+ @http.start {|conn| conn.get('/') { times += 1 }}
78
+ times.should == 1
79
+ end
80
+
81
+ it "should have socket open during a real request" do
82
+ socket_id = nil
83
+ @http.start {|conn| conn.get('/') {
84
+ socket_id = conn.instance_variable_get(:@socket).object_id
85
+ }
86
+ }
87
+ socket_id.should_not be_nil
88
+ end
89
+
90
+ it "should be started during a real request" do
91
+ started = nil
92
+ @http.start {|conn| conn.get('/') {
93
+ started = conn.started?
94
+ }
95
+ }
96
+ started.should == true
97
+ @http.started?.should == false
98
+ end
99
+ end
100
+
101
+ describe "with start without request block" do
102
+ it "should close connection after a real request" do
103
+ @http.start {|conn| conn.get('/') }
104
+ @http.should_not be_started
105
+ end
106
+
107
+ it "should have socket open during a real request" do
108
+ socket_id = nil
109
+ @http.start {|conn|
110
+ socket_id = conn.instance_variable_get(:@socket).object_id
111
+ }
112
+ socket_id.should_not be_nil
113
+ end
114
+
115
+ it "should be started during a real request" do
116
+ started = nil
117
+ @http.start {|conn|
118
+ started = conn.started?
119
+ }
120
+ started.should == true
121
+ @http.started?.should == false
122
+ end
123
+ end
124
+ end
125
+ end