webmock 3.0.1 → 3.20.0

Sign up to get free protection for your applications and to get access to all the features.
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