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