webmock 3.0.1 → 3.20.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 (138) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +558 -2
  3. data/README.md +200 -42
  4. data/lib/webmock/api.rb +14 -0
  5. data/lib/webmock/assertion_failure.rb +2 -0
  6. data/lib/webmock/callback_registry.rb +2 -0
  7. data/lib/webmock/config.rb +2 -0
  8. data/lib/webmock/cucumber.rb +2 -0
  9. data/lib/webmock/deprecation.rb +2 -0
  10. data/lib/webmock/errors.rb +2 -0
  11. data/lib/webmock/http_lib_adapters/async_http_client_adapter.rb +223 -0
  12. data/lib/webmock/http_lib_adapters/curb_adapter.rb +21 -5
  13. data/lib/webmock/http_lib_adapters/em_http_request_adapter.rb +20 -9
  14. data/lib/webmock/http_lib_adapters/excon_adapter.rb +7 -2
  15. data/lib/webmock/http_lib_adapters/http_lib_adapter.rb +2 -0
  16. data/lib/webmock/http_lib_adapters/http_lib_adapter_registry.rb +2 -0
  17. data/lib/webmock/http_lib_adapters/http_rb/client.rb +4 -1
  18. data/lib/webmock/http_lib_adapters/http_rb/request.rb +19 -1
  19. data/lib/webmock/http_lib_adapters/http_rb/response.rb +29 -3
  20. data/lib/webmock/http_lib_adapters/http_rb/streamer.rb +11 -3
  21. data/lib/webmock/http_lib_adapters/http_rb/webmock.rb +9 -3
  22. data/lib/webmock/http_lib_adapters/http_rb_adapter.rb +2 -0
  23. data/lib/webmock/http_lib_adapters/httpclient_adapter.rb +30 -9
  24. data/lib/webmock/http_lib_adapters/manticore_adapter.rb +35 -15
  25. data/lib/webmock/http_lib_adapters/net_http.rb +38 -89
  26. data/lib/webmock/http_lib_adapters/net_http_response.rb +3 -1
  27. data/lib/webmock/http_lib_adapters/patron_adapter.rb +6 -4
  28. data/lib/webmock/http_lib_adapters/typhoeus_hydra_adapter.rb +18 -2
  29. data/lib/webmock/matchers/any_arg_matcher.rb +15 -0
  30. data/lib/webmock/matchers/hash_argument_matcher.rb +23 -0
  31. data/lib/webmock/matchers/hash_excluding_matcher.rb +17 -0
  32. data/lib/webmock/matchers/hash_including_matcher.rb +6 -23
  33. data/lib/webmock/minitest.rb +2 -0
  34. data/lib/webmock/rack_response.rb +3 -1
  35. data/lib/webmock/request_body_diff.rb +3 -1
  36. data/lib/webmock/request_execution_verifier.rb +4 -3
  37. data/lib/webmock/request_pattern.rb +132 -52
  38. data/lib/webmock/request_registry.rb +3 -1
  39. data/lib/webmock/request_signature.rb +5 -3
  40. data/lib/webmock/request_signature_snippet.rb +6 -4
  41. data/lib/webmock/request_stub.rb +34 -0
  42. data/lib/webmock/response.rb +22 -14
  43. data/lib/webmock/responses_sequence.rb +2 -0
  44. data/lib/webmock/rspec/matchers/request_pattern_matcher.rb +2 -0
  45. data/lib/webmock/rspec/matchers/webmock_matcher.rb +2 -0
  46. data/lib/webmock/rspec/matchers.rb +2 -0
  47. data/lib/webmock/rspec.rb +12 -3
  48. data/lib/webmock/stub_registry.rb +28 -11
  49. data/lib/webmock/stub_request_snippet.rb +12 -6
  50. data/lib/webmock/test_unit.rb +3 -3
  51. data/lib/webmock/util/hash_counter.rb +15 -9
  52. data/lib/webmock/util/hash_keys_stringifier.rb +2 -0
  53. data/lib/webmock/util/hash_validator.rb +2 -0
  54. data/lib/webmock/util/headers.rb +39 -11
  55. data/lib/webmock/util/json.rb +3 -2
  56. data/lib/webmock/util/query_mapper.rb +11 -7
  57. data/lib/webmock/util/uri.rb +13 -11
  58. data/lib/webmock/util/values_stringifier.rb +22 -0
  59. data/lib/webmock/util/version_checker.rb +7 -5
  60. data/lib/webmock/version.rb +3 -1
  61. data/lib/webmock/webmock.rb +22 -3
  62. data/lib/webmock.rb +55 -48
  63. metadata +106 -175
  64. data/.gemtest +0 -0
  65. data/.gitignore +0 -34
  66. data/.rspec-tm +0 -2
  67. data/.travis.yml +0 -20
  68. data/Gemfile +0 -9
  69. data/Rakefile +0 -30
  70. data/minitest/test_helper.rb +0 -34
  71. data/minitest/test_webmock.rb +0 -9
  72. data/minitest/webmock_spec.rb +0 -60
  73. data/spec/acceptance/curb/curb_spec.rb +0 -466
  74. data/spec/acceptance/curb/curb_spec_helper.rb +0 -147
  75. data/spec/acceptance/em_http_request/em_http_request_spec.rb +0 -406
  76. data/spec/acceptance/em_http_request/em_http_request_spec_helper.rb +0 -77
  77. data/spec/acceptance/excon/excon_spec.rb +0 -75
  78. data/spec/acceptance/excon/excon_spec_helper.rb +0 -50
  79. data/spec/acceptance/http_rb/http_rb_spec.rb +0 -73
  80. data/spec/acceptance/http_rb/http_rb_spec_helper.rb +0 -51
  81. data/spec/acceptance/httpclient/httpclient_spec.rb +0 -210
  82. data/spec/acceptance/httpclient/httpclient_spec_helper.rb +0 -57
  83. data/spec/acceptance/manticore/manticore_spec.rb +0 -56
  84. data/spec/acceptance/manticore/manticore_spec_helper.rb +0 -35
  85. data/spec/acceptance/net_http/net_http_shared.rb +0 -153
  86. data/spec/acceptance/net_http/net_http_spec.rb +0 -317
  87. data/spec/acceptance/net_http/net_http_spec_helper.rb +0 -64
  88. data/spec/acceptance/net_http/real_net_http_spec.rb +0 -20
  89. data/spec/acceptance/patron/patron_spec.rb +0 -118
  90. data/spec/acceptance/patron/patron_spec_helper.rb +0 -54
  91. data/spec/acceptance/shared/allowing_and_disabling_net_connect.rb +0 -313
  92. data/spec/acceptance/shared/callbacks.rb +0 -147
  93. data/spec/acceptance/shared/complex_cross_concern_behaviors.rb +0 -36
  94. data/spec/acceptance/shared/enabling_and_disabling_webmock.rb +0 -95
  95. data/spec/acceptance/shared/precedence_of_stubs.rb +0 -15
  96. data/spec/acceptance/shared/request_expectations.rb +0 -916
  97. data/spec/acceptance/shared/returning_declared_responses.rb +0 -388
  98. data/spec/acceptance/shared/stubbing_requests.rb +0 -583
  99. data/spec/acceptance/typhoeus/typhoeus_hydra_spec.rb +0 -135
  100. data/spec/acceptance/typhoeus/typhoeus_hydra_spec_helper.rb +0 -60
  101. data/spec/acceptance/webmock_shared.rb +0 -41
  102. data/spec/fixtures/test.txt +0 -1
  103. data/spec/quality_spec.rb +0 -84
  104. data/spec/spec_helper.rb +0 -48
  105. data/spec/support/example_curl_output.txt +0 -22
  106. data/spec/support/failures.rb +0 -9
  107. data/spec/support/my_rack_app.rb +0 -53
  108. data/spec/support/network_connection.rb +0 -19
  109. data/spec/support/webmock_server.rb +0 -69
  110. data/spec/unit/api_spec.rb +0 -75
  111. data/spec/unit/errors_spec.rb +0 -129
  112. data/spec/unit/http_lib_adapters/http_lib_adapter_registry_spec.rb +0 -17
  113. data/spec/unit/http_lib_adapters/http_lib_adapter_spec.rb +0 -12
  114. data/spec/unit/matchers/hash_including_matcher_spec.rb +0 -87
  115. data/spec/unit/rack_response_spec.rb +0 -112
  116. data/spec/unit/request_body_diff_spec.rb +0 -90
  117. data/spec/unit/request_execution_verifier_spec.rb +0 -208
  118. data/spec/unit/request_pattern_spec.rb +0 -590
  119. data/spec/unit/request_registry_spec.rb +0 -95
  120. data/spec/unit/request_signature_snippet_spec.rb +0 -89
  121. data/spec/unit/request_signature_spec.rb +0 -155
  122. data/spec/unit/request_stub_spec.rb +0 -199
  123. data/spec/unit/response_spec.rb +0 -282
  124. data/spec/unit/stub_registry_spec.rb +0 -103
  125. data/spec/unit/stub_request_snippet_spec.rb +0 -95
  126. data/spec/unit/util/hash_counter_spec.rb +0 -39
  127. data/spec/unit/util/hash_keys_stringifier_spec.rb +0 -27
  128. data/spec/unit/util/headers_spec.rb +0 -28
  129. data/spec/unit/util/json_spec.rb +0 -33
  130. data/spec/unit/util/query_mapper_spec.rb +0 -144
  131. data/spec/unit/util/uri_spec.rb +0 -299
  132. data/spec/unit/util/version_checker_spec.rb +0 -65
  133. data/spec/unit/webmock_spec.rb +0 -11
  134. data/test/http_request.rb +0 -24
  135. data/test/shared_test.rb +0 -95
  136. data/test/test_helper.rb +0 -23
  137. data/test/test_webmock.rb +0 -6
  138. data/webmock.gemspec +0 -46
@@ -1,51 +0,0 @@
1
- require "ostruct"
2
-
3
- module HttpRbSpecHelper
4
- def http_request(method, uri, options = {})
5
- chain = HTTP
6
-
7
- if basic_auth = options.delete(:basic_auth)
8
- chain = chain.basic_auth(user: basic_auth[0], pass: basic_auth[1])
9
- end
10
-
11
- response = chain.request(method, normalize_uri(uri), options)
12
-
13
- OpenStruct.new({
14
- body: response.body.to_s,
15
- headers: normalize_headers(response.headers.to_h),
16
- status: response.code.to_s,
17
- message: response.reason
18
- })
19
- end
20
-
21
- def client_timeout_exception_class
22
- return Errno::ETIMEDOUT if HTTP::VERSION < "1.0.0"
23
- HTTP::ConnectionError
24
- end
25
-
26
- def connection_refused_exception_class
27
- return Errno::ECONNREFUSED if HTTP::VERSION < "1.0.0"
28
- HTTP::ConnectionError
29
- end
30
-
31
- def http_library
32
- :http_rb
33
- end
34
-
35
- def normalize_uri(uri)
36
- Addressable::URI.heuristic_parse(uri).normalize.to_s
37
- end
38
-
39
- def normalize_headers(headers)
40
- headers = Hash[headers.map { |k, v| [k, Array(v).join(", ")] }]
41
- WebMock::Util::Headers.normalize_headers headers
42
- end
43
-
44
- def stub_simple_request(host, status = 200, headers = {}, body = nil)
45
- stub_request(:any, host).to_return({
46
- status: status,
47
- headers: headers.merge({ "Host" => host }),
48
- body: body
49
- })
50
- end
51
- end
@@ -1,210 +0,0 @@
1
- require 'spec_helper'
2
- require 'acceptance/webmock_shared'
3
- require 'ostruct'
4
-
5
- require 'acceptance/httpclient/httpclient_spec_helper'
6
-
7
- describe "HTTPClient" do
8
- include HTTPClientSpecHelper
9
-
10
- before(:each) do
11
- WebMock.reset_callbacks
12
- HTTPClientSpecHelper.async_mode = false
13
- end
14
-
15
- include_examples "with WebMock"
16
-
17
- it "should raise a clearly readable error if request with multipart body is sent" do
18
- stub_request(:post, 'www.example.com').with(body: {type: 'image'})
19
-
20
- expect {
21
- HTTPClient.new.post_content('www.example.com', type: 'image', file: File.new('spec/fixtures/test.txt'))
22
- }.to raise_error(ArgumentError, "WebMock does not support matching body for multipart/form-data requests yet :(")
23
- end
24
-
25
- it "should yield block on response if block provided" do
26
- stub_request(:get, "www.example.com").to_return(body: "abc")
27
- response_body = ""
28
- http_request(:get, "http://www.example.com/") do |body|
29
- response_body = body
30
- end
31
- expect(response_body).to eq("abc")
32
- end
33
-
34
- it "should match requests if headers are the same but in different order" do
35
- stub_request(:get, "www.example.com").with(headers: {"a" => ["b", "c"]} )
36
- expect(http_request(
37
- :get, "http://www.example.com/",
38
- headers: {"a" => ["c", "b"]}).status).to eq("200")
39
- end
40
-
41
- describe "when using async requests" do
42
- before(:each) do
43
- HTTPClientSpecHelper.async_mode = true
44
- end
45
-
46
- include_examples "with WebMock"
47
- end
48
-
49
- it "should work with get_content" do
50
- stub_request(:get, 'www.example.com').to_return(status: 200, body: 'test', headers: {})
51
- str = ''
52
- HTTPClient.get_content('www.example.com') do |content|
53
- str << content
54
- end
55
- expect(str).to eq('test')
56
- end
57
-
58
- it "should work via JSONClient subclass" do
59
- stub_request(:get, 'www.example.com').to_return(
60
- status: 200,
61
- body: '{"test": "foo"}',
62
- headers: {'Content-Type' => 'application/json'}
63
- )
64
- content = JSONClient.get('www.example.com').content
65
- expect(content).to eq("test" => "foo")
66
- end
67
-
68
- context "multipart bodies" do
69
- let(:header) {{
70
- 'Accept' => 'application/json',
71
- 'Content-Type' => 'multipart/form-data'
72
- }}
73
-
74
- let(:body) {[
75
- {
76
- 'Content-Type' => 'application/json',
77
- 'Content-Disposition' => 'form-data',
78
- :content => '{"foo": "bar", "baz": 2}'
79
- }
80
- ]}
81
-
82
- let(:make_request) {HTTPClient.new.post("http://www.example.com", body: body, header: header)}
83
-
84
- before do
85
- stub_request(:post, "www.example.com")
86
- end
87
-
88
- it "should work with multipart bodies" do
89
- make_request
90
- end
91
- end
92
-
93
-
94
- context "Filters" do
95
- class Filter
96
- def filter_request(request)
97
- request.header["Authorization"] = "Bearer 0123456789"
98
- end
99
-
100
- def filter_response(request, response)
101
- response.header.set('X-Powered-By', 'webmock')
102
- end
103
- end
104
-
105
- before do
106
- @client = HTTPClient.new
107
- @client.request_filter << Filter.new
108
- stub_request(:get, 'www.example.com').with(headers: {'Authorization' => 'Bearer 0123456789'})
109
- end
110
-
111
- it "supports request filters" do
112
- expect(@client.request(:get, 'http://www.example.com/').status).to eq(200)
113
- end
114
-
115
- it "supports response filters" do
116
- res = @client.request(:get, 'http://www.example.com/')
117
- expect(res.header['X-Powered-By'].first).to eq('webmock')
118
- end
119
- end
120
-
121
- context 'when a client instance is re-used for another identical request' do
122
- let(:client) { HTTPClient.new }
123
- let(:webmock_server_url) {"http://#{WebMockServer.instance.host_with_port}/"}
124
-
125
- before { WebMock.allow_net_connect! }
126
-
127
- it 'invokes the global_stub_request hook for each request' do
128
- # Mock time to ensure that date headers match
129
- now = Time.now
130
- allow(Time).to receive(:now).and_return(now)
131
-
132
- request_signatures = []
133
- WebMock.globally_stub_request do |request_sig|
134
- request_signatures << request_sig
135
- nil # to let the request be made for real
136
- end
137
-
138
- http_request(:get, webmock_server_url, client: client, headers: { "Cookie" => "bar=; foo=" })
139
-
140
- if defined? HTTP::CookieJar
141
- http_request(:get, webmock_server_url, client: client, headers: { "Cookie" => "bar=; foo=" })
142
- else
143
- # If http-cookie is not present, then the cookie headers will saved between requests
144
- http_request(:get, webmock_server_url, client: client)
145
- end
146
-
147
- expect(request_signatures.size).to eq(2)
148
- # Verify the request signatures were identical as needed by this example
149
- expect(request_signatures.first).to eq(request_signatures.last)
150
- end
151
- end
152
-
153
- context 'session headers' do
154
- it "client sends a User-Agent header when given an agent_name explicitly to the client" do
155
- user_agent = "Client/0.1"
156
- stub_request(:get, "www.example.com").with(headers: { 'User-agent' => "#{user_agent} #{HTTPClient::LIB_NAME}" })
157
- HTTPClient.new(agent_name: user_agent).get("www.example.com")
158
- end
159
-
160
- it "client sends the Accept, User-Agent, and Date by default" do
161
- WebMock.disable_net_connect!
162
- stub_request(:get, "www.example.com").with do |req|
163
- req.headers["Accept"] == "*/*" &&
164
- req.headers["User-Agent"] == "#{HTTPClient::DEFAULT_AGENT_NAME} #{HTTPClient::LIB_NAME}" &&
165
- req.headers["Date"]
166
- end
167
- http_request(:get, "www.example.com")
168
- end
169
-
170
- it "explicitly defined headers take precedence over session defaults" do
171
- headers = { 'Accept' => 'foo/bar', 'User-Agent' => 'custom', 'Date' => 'today' }
172
- stub_request(:get, "www.example.com").with(headers: headers)
173
- HTTPClient.new.get("www.example.com", nil, headers)
174
- end
175
- end
176
-
177
- context 'httpclient response header' do
178
- it 'receives request_method, request_uri, and request_query from the request header' do
179
- stub_request :get, 'www.example.com'
180
- message = HTTPClient.new.get 'www.example.com'
181
- expect(message.header.request_uri.to_s).to eq('www.example.com')
182
- end
183
- end
184
-
185
- context 'httpclient streams response', net_connect: true do
186
- before do
187
- WebMock.allow_net_connect!
188
- WebMock.after_request(except: [:other_lib]) do |_, response|
189
- @response = response
190
- end
191
- end
192
-
193
- it 'sets the full body on the webmock response' do
194
- body = ''
195
- HTTPClient.new.request(:get, 'http://www.example.com/') do |http_res, chunk|
196
- body += chunk
197
- end
198
- expect(@response.body).to eq body
199
- end
200
- end
201
-
202
- context 'credentials' do
203
- it 'are detected when manually specifying Authorization header' do
204
- stub_request(:get, "http://www.example.com/").with(basic_auth: ['username', 'password']).to_return(status: 200)
205
-
206
- headers = {'Authorization' => 'Basic dXNlcm5hbWU6cGFzc3dvcmQ='}
207
- expect(http_request(:get, 'http://www.example.com/', {headers: headers}).status).to eql('200')
208
- end
209
- end
210
- end
@@ -1,57 +0,0 @@
1
- module HTTPClientSpecHelper
2
- class << self
3
- attr_accessor :async_mode
4
- end
5
-
6
- def http_request(method, uri, options = {}, &block)
7
- uri = Addressable::URI.heuristic_parse(uri)
8
- c = options.fetch(:client) { HTTPClient.new }
9
- c.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE
10
- c.reset_all
11
- if options[:basic_auth]
12
- c.force_basic_auth = true
13
- c.set_basic_auth(nil, options[:basic_auth][0], options[:basic_auth][1])
14
- end
15
- params = [method, uri.normalize.to_s,
16
- WebMock::Util::QueryMapper.query_to_values(uri.query, notation: WebMock::Config.instance.query_values_notation), options[:body], options[:headers] || {}]
17
- if HTTPClientSpecHelper.async_mode
18
- connection = c.request_async(*params)
19
- connection.join
20
- response = connection.pop
21
- else
22
- response = c.request(*params, &block)
23
- end
24
- headers = merge_headers(response)
25
- OpenStruct.new({
26
- body: HTTPClientSpecHelper.async_mode ? response.content.read : response.content,
27
- headers: headers,
28
- status: response.code.to_s,
29
- message: response.reason
30
- })
31
- end
32
-
33
- def client_timeout_exception_class
34
- HTTPClient::TimeoutError
35
- end
36
-
37
- def connection_refused_exception_class
38
- Errno::ECONNREFUSED
39
- end
40
-
41
- def http_library
42
- :httpclient
43
- end
44
-
45
- private
46
-
47
- def merge_headers(response)
48
- response.header.all.inject({}) do |headers, header|
49
- if !headers.has_key?(header[0])
50
- headers[header[0]] = header[1]
51
- else
52
- headers[header[0]] = [headers[header[0]], header[1]].join(', ')
53
- end
54
- headers
55
- end
56
- end
57
- end
@@ -1,56 +0,0 @@
1
- require 'spec_helper'
2
- require 'acceptance/webmock_shared'
3
-
4
- if RUBY_PLATFORM =~ /java/
5
- require 'acceptance/manticore/manticore_spec_helper'
6
-
7
- describe "Manticore" do
8
- include ManticoreSpecHelper
9
-
10
- include_context "with WebMock", :no_status_message
11
-
12
- context "calling http methods on Manticore directly using Manticore's facade" do
13
- it "handles GET" do
14
- stub_request(:get, "http://example-foo.com").to_return(status: 301)
15
- response = Manticore.get("http://example-foo.com")
16
- expect(response.code).to eq(301)
17
- end
18
-
19
- it "handles POST" do
20
- stub_request(:post, "http://example-foo.com").to_return(status: 201)
21
- response = Manticore.post("http://example-foo.com", {hello: "world"})
22
- expect(response.code).to eq(201)
23
- end
24
-
25
- it "handles PUT" do
26
- stub_request(:put, "http://example-foo.com").to_return(status: 409)
27
- response = Manticore.put("http://example-foo.com", {hello: "world"})
28
- expect(response.code).to eq(409)
29
- end
30
-
31
- it "handles PATCH" do
32
- stub_request(:patch, "http://example-foo.com").to_return(status: 409)
33
- response = Manticore.patch("http://example-foo.com", {hello: "world"})
34
- expect(response.code).to eq(409)
35
- end
36
-
37
- it "handles DELETE" do
38
- stub_request(:delete, "http://example-foo.com").to_return(status: 204)
39
- response = Manticore.delete("http://example-foo.com", {id: 1})
40
- expect(response.code).to eq(204)
41
- end
42
-
43
- it "handles OPTIONS" do
44
- stub_request(:options, "http://example-foo.com").to_return(status: 200)
45
- response = Manticore.options("http://example-foo.com")
46
- expect(response.code).to eq(200)
47
- end
48
-
49
- it "handles HEAD" do
50
- stub_request(:head, "http://example-foo.com").to_return(status: 204)
51
- response = Manticore.head("http://example-foo.com")
52
- expect(response.code).to eq(204)
53
- end
54
- end
55
- end
56
- end
@@ -1,35 +0,0 @@
1
- module ManticoreSpecHelper
2
- def http_request(method, uri, options = {})
3
- client = Manticore::Client.new
4
-
5
- if basic_auth = options[:basic_auth]
6
- options = options.merge(auth: {user: basic_auth[0], pass: basic_auth[1]})
7
- end
8
-
9
- response = client.http(method, uri, options)
10
- OpenStruct.new({
11
- body: response.body || '',
12
- headers: WebMock::Util::Headers.normalize_headers(join_array_values(response.headers)),
13
- status: response.code.to_s
14
- })
15
- end
16
-
17
- def join_array_values(hash)
18
- hash.reduce({}) do |h, (k,v)|
19
- v = v.join(', ') if v.is_a?(Array)
20
- h.merge(k => v)
21
- end
22
- end
23
-
24
- def client_timeout_exception_class
25
- Manticore::ConnectTimeout
26
- end
27
-
28
- def connection_refused_exception_class
29
- Manticore::SocketException
30
- end
31
-
32
- def http_library
33
- :manticore
34
- end
35
- end
@@ -1,153 +0,0 @@
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
- expect(response.body).to 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
- expect(body).to match(/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
-
36
- if !defined?(WebMock::Config) || WebMock::Config.instance.net_http_connect_on_start
37
- expect(socket_id_before_request).not_to eq(nil.object_id)
38
- expect(socket_id_after_request).not_to eq(nil.object_id)
39
- expect(socket_id_after_request).to eq(socket_id_before_request)
40
- else
41
- expect(socket_id_before_request).to eq(nil.object_id)
42
- expect(socket_id_after_request).not_to eq(nil.object_id)
43
- end
44
- end
45
-
46
- it "should pass the read_timeout value on", net_connect: true do
47
- @http = Net::HTTP.new('localhost', port)
48
- read_timeout = @http.read_timeout + 1
49
- @http.read_timeout = read_timeout
50
- @http.start {|conn|
51
- conn.request(Net::HTTP::Get.new("/"))
52
- socket = conn.instance_variable_get(:@socket)
53
- expect(socket.read_timeout).to eq(read_timeout)
54
- }
55
- end
56
-
57
- describe "without start" do
58
- it "should close connection after a real request" do
59
- @http.get('/') { }
60
- expect(@http).not_to be_started
61
- end
62
-
63
- it "should execute block exactly once" do
64
- times = 0
65
- @http.get('/') { times += 1 }
66
- expect(times).to eq(1)
67
- end
68
-
69
- it "should have socket open during a real request" do
70
- socket_id = nil
71
- @http.get('/') {
72
- socket_id = @http.instance_variable_get(:@socket).object_id
73
- }
74
- expect(socket_id).not_to be_nil
75
- end
76
-
77
- it "should be started during a real request" do
78
- started = nil
79
- @http.get('/') {
80
- started = @http.started?
81
- }
82
- expect(started).to eq(true)
83
- expect(@http.started?).to eq(false)
84
- end
85
- end
86
-
87
- describe "with start" do
88
- it "should close connection after a real request" do
89
- @http.start {|conn| conn.get('/') { } }
90
- expect(@http).not_to be_started
91
- end
92
-
93
- it "should execute block exactly once" do
94
- times = 0
95
- @http.start {|conn| conn.get('/') { times += 1 }}
96
- expect(times).to eq(1)
97
- end
98
-
99
- it "should have socket open during a real request" do
100
- socket_id = nil
101
- @http.start {|conn| conn.get('/') {
102
- socket_id = conn.instance_variable_get(:@socket).object_id
103
- }
104
- }
105
- expect(socket_id).not_to be_nil
106
- end
107
-
108
- it "should be started during a real request" do
109
- started = nil
110
- @http.start {|conn| conn.get('/') {
111
- started = conn.started?
112
- }
113
- }
114
- expect(started).to eq(true)
115
- expect(@http.started?).to eq(false)
116
- end
117
- end
118
-
119
- describe "with start without request block" do
120
- it "should close connection after a real request" do
121
- @http.start {|conn| conn.get('/') }
122
- expect(@http).not_to be_started
123
- end
124
-
125
- it "should have socket open during a real request" do
126
- socket_id = nil
127
- @http.start {|conn|
128
- socket_id = conn.instance_variable_get(:@socket).object_id
129
- }
130
- expect(socket_id).not_to be_nil
131
- end
132
-
133
- it "should be started during a real request" do
134
- started = nil
135
- @http.start {|conn|
136
- started = conn.started?
137
- }
138
- expect(started).to eq(true)
139
- expect(@http.started?).to eq(false)
140
- end
141
- end
142
-
143
- describe "with start without a block and finish" do
144
- it "should gracefully start and close connection" do
145
- @http.start
146
- @http.get("/")
147
- expect(@http).to be_started
148
- @http.finish
149
- expect(@http).not_to be_started
150
- end
151
- end
152
- end
153
- end