webmock 3.14.0 → 3.24.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (144) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +207 -3
  3. data/README.md +65 -20
  4. data/lib/webmock/api.rb +2 -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 +16 -4
  12. data/lib/webmock/http_lib_adapters/curb_adapter.rb +4 -2
  13. data/lib/webmock/http_lib_adapters/em_http_request_adapter.rb +17 -7
  14. data/lib/webmock/http_lib_adapters/excon_adapter.rb +2 -0
  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 +3 -3
  18. data/lib/webmock/http_lib_adapters/http_rb/request.rb +17 -5
  19. data/lib/webmock/http_lib_adapters/http_rb/response.rb +32 -9
  20. data/lib/webmock/http_lib_adapters/http_rb/streamer.rb +10 -2
  21. data/lib/webmock/http_lib_adapters/http_rb/webmock.rb +8 -2
  22. data/lib/webmock/http_lib_adapters/http_rb_adapter.rb +7 -5
  23. data/lib/webmock/http_lib_adapters/httpclient_adapter.rb +26 -25
  24. data/lib/webmock/http_lib_adapters/manticore_adapter.rb +2 -0
  25. data/lib/webmock/http_lib_adapters/net_http.rb +28 -117
  26. data/lib/webmock/http_lib_adapters/net_http_response.rb +2 -0
  27. data/lib/webmock/http_lib_adapters/patron_adapter.rb +3 -1
  28. data/lib/webmock/http_lib_adapters/typhoeus_hydra_adapter.rb +18 -2
  29. data/lib/webmock/matchers/any_arg_matcher.rb +2 -0
  30. data/lib/webmock/matchers/hash_argument_matcher.rb +2 -0
  31. data/lib/webmock/matchers/hash_excluding_matcher.rb +2 -0
  32. data/lib/webmock/matchers/hash_including_matcher.rb +2 -0
  33. data/lib/webmock/minitest.rb +2 -0
  34. data/lib/webmock/rack_response.rb +5 -1
  35. data/lib/webmock/request_body_diff.rb +2 -0
  36. data/lib/webmock/request_execution_verifier.rb +2 -0
  37. data/lib/webmock/request_pattern.rb +35 -12
  38. data/lib/webmock/request_registry.rb +2 -0
  39. data/lib/webmock/request_signature.rb +4 -2
  40. data/lib/webmock/request_signature_snippet.rb +2 -0
  41. data/lib/webmock/request_stub.rb +34 -0
  42. data/lib/webmock/response.rb +15 -13
  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 +2 -0
  48. data/lib/webmock/stub_registry.rb +2 -0
  49. data/lib/webmock/stub_request_snippet.rb +2 -0
  50. data/lib/webmock/test_unit.rb +2 -0
  51. data/lib/webmock/util/hash_counter.rb +12 -6
  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 +23 -10
  55. data/lib/webmock/util/parsers/json.rb +72 -0
  56. data/lib/webmock/util/parsers/parse_error.rb +7 -0
  57. data/lib/webmock/util/parsers/xml.rb +16 -0
  58. data/lib/webmock/util/query_mapper.rb +2 -0
  59. data/lib/webmock/util/uri.rb +3 -1
  60. data/lib/webmock/util/values_stringifier.rb +2 -0
  61. data/lib/webmock/util/version_checker.rb +7 -5
  62. data/lib/webmock/version.rb +3 -1
  63. data/lib/webmock/webmock.rb +12 -0
  64. data/lib/webmock.rb +4 -2
  65. metadata +66 -182
  66. data/.gemtest +0 -0
  67. data/.github/workflows/CI.yml +0 -37
  68. data/.gitignore +0 -34
  69. data/.rspec-tm +0 -2
  70. data/Gemfile +0 -9
  71. data/Rakefile +0 -38
  72. data/lib/webmock/util/json.rb +0 -67
  73. data/minitest/test_helper.rb +0 -34
  74. data/minitest/test_webmock.rb +0 -9
  75. data/minitest/webmock_spec.rb +0 -60
  76. data/spec/acceptance/async_http_client/async_http_client_spec.rb +0 -375
  77. data/spec/acceptance/async_http_client/async_http_client_spec_helper.rb +0 -73
  78. data/spec/acceptance/curb/curb_spec.rb +0 -499
  79. data/spec/acceptance/curb/curb_spec_helper.rb +0 -147
  80. data/spec/acceptance/em_http_request/em_http_request_spec.rb +0 -462
  81. data/spec/acceptance/em_http_request/em_http_request_spec_helper.rb +0 -77
  82. data/spec/acceptance/excon/excon_spec.rb +0 -77
  83. data/spec/acceptance/excon/excon_spec_helper.rb +0 -52
  84. data/spec/acceptance/http_rb/http_rb_spec.rb +0 -93
  85. data/spec/acceptance/http_rb/http_rb_spec_helper.rb +0 -54
  86. data/spec/acceptance/httpclient/httpclient_spec.rb +0 -217
  87. data/spec/acceptance/httpclient/httpclient_spec_helper.rb +0 -57
  88. data/spec/acceptance/manticore/manticore_spec.rb +0 -107
  89. data/spec/acceptance/manticore/manticore_spec_helper.rb +0 -35
  90. data/spec/acceptance/net_http/net_http_shared.rb +0 -153
  91. data/spec/acceptance/net_http/net_http_spec.rb +0 -369
  92. data/spec/acceptance/net_http/net_http_spec_helper.rb +0 -64
  93. data/spec/acceptance/net_http/real_net_http_spec.rb +0 -20
  94. data/spec/acceptance/patron/patron_spec.rb +0 -125
  95. data/spec/acceptance/patron/patron_spec_helper.rb +0 -54
  96. data/spec/acceptance/shared/allowing_and_disabling_net_connect.rb +0 -313
  97. data/spec/acceptance/shared/callbacks.rb +0 -148
  98. data/spec/acceptance/shared/complex_cross_concern_behaviors.rb +0 -36
  99. data/spec/acceptance/shared/enabling_and_disabling_webmock.rb +0 -95
  100. data/spec/acceptance/shared/precedence_of_stubs.rb +0 -15
  101. data/spec/acceptance/shared/request_expectations.rb +0 -930
  102. data/spec/acceptance/shared/returning_declared_responses.rb +0 -409
  103. data/spec/acceptance/shared/stubbing_requests.rb +0 -678
  104. data/spec/acceptance/typhoeus/typhoeus_hydra_spec.rb +0 -135
  105. data/spec/acceptance/typhoeus/typhoeus_hydra_spec_helper.rb +0 -60
  106. data/spec/acceptance/webmock_shared.rb +0 -41
  107. data/spec/fixtures/test.txt +0 -1
  108. data/spec/quality_spec.rb +0 -84
  109. data/spec/spec_helper.rb +0 -48
  110. data/spec/support/example_curl_output.txt +0 -22
  111. data/spec/support/failures.rb +0 -9
  112. data/spec/support/my_rack_app.rb +0 -53
  113. data/spec/support/network_connection.rb +0 -19
  114. data/spec/support/webmock_server.rb +0 -70
  115. data/spec/unit/api_spec.rb +0 -175
  116. data/spec/unit/errors_spec.rb +0 -129
  117. data/spec/unit/http_lib_adapters/http_lib_adapter_registry_spec.rb +0 -17
  118. data/spec/unit/http_lib_adapters/http_lib_adapter_spec.rb +0 -12
  119. data/spec/unit/matchers/hash_excluding_matcher_spec.rb +0 -61
  120. data/spec/unit/matchers/hash_including_matcher_spec.rb +0 -87
  121. data/spec/unit/rack_response_spec.rb +0 -112
  122. data/spec/unit/request_body_diff_spec.rb +0 -90
  123. data/spec/unit/request_execution_verifier_spec.rb +0 -208
  124. data/spec/unit/request_pattern_spec.rb +0 -736
  125. data/spec/unit/request_registry_spec.rb +0 -95
  126. data/spec/unit/request_signature_snippet_spec.rb +0 -89
  127. data/spec/unit/request_signature_spec.rb +0 -155
  128. data/spec/unit/request_stub_spec.rb +0 -199
  129. data/spec/unit/response_spec.rb +0 -286
  130. data/spec/unit/stub_registry_spec.rb +0 -103
  131. data/spec/unit/stub_request_snippet_spec.rb +0 -115
  132. data/spec/unit/util/hash_counter_spec.rb +0 -39
  133. data/spec/unit/util/hash_keys_stringifier_spec.rb +0 -27
  134. data/spec/unit/util/headers_spec.rb +0 -28
  135. data/spec/unit/util/json_spec.rb +0 -33
  136. data/spec/unit/util/query_mapper_spec.rb +0 -157
  137. data/spec/unit/util/uri_spec.rb +0 -371
  138. data/spec/unit/util/version_checker_spec.rb +0 -65
  139. data/spec/unit/webmock_spec.rb +0 -60
  140. data/test/http_request.rb +0 -24
  141. data/test/shared_test.rb +0 -108
  142. data/test/test_helper.rb +0 -23
  143. data/test/test_webmock.rb +0 -12
  144. data/webmock.gemspec +0 -54
@@ -1,93 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require "spec_helper"
4
- require "acceptance/webmock_shared"
5
- require "acceptance/http_rb/http_rb_spec_helper"
6
-
7
- describe "HTTP.rb" do
8
- include HttpRbSpecHelper
9
-
10
- include_examples "with WebMock", :no_status_message
11
-
12
- context "streaming body" do
13
- let(:response) { HTTP.get "http://example.com" }
14
- before { stub_simple_request "example.com", 302, {}, "abc" }
15
-
16
- it "works as if it was streamed from socket" do
17
- expect(response.body.readpartial 1).to eq "a"
18
- end
19
-
20
- it "fails if body was already streamed" do
21
- response.body.to_s
22
- expect { response.body.readpartial 1 }.to raise_error(HTTP::StateError)
23
- end
24
- end
25
-
26
- context "without following redirects" do
27
- let(:response) { http_request(:get, "http://example.com") }
28
- let(:headers) { response.headers }
29
-
30
- it "stops on first request" do
31
- stub_simple_request("example.com", 302, "Location" => "http://www.example.com")
32
- stub_simple_request("www.example.com")
33
-
34
- expect(headers).to include "Host" => "example.com"
35
- end
36
- end
37
-
38
- context "following redirects" do
39
- let(:options) { { follow: true } }
40
- let(:response) { http_request(:get, "http://example.com", options) }
41
- let(:headers) { response.headers }
42
-
43
- it "returns response of destination" do
44
- stub_simple_request("example.com", 302, "Location" => "http://www.example.com")
45
- stub_simple_request("www.example.com")
46
-
47
- expect(headers).to include "Host" => "www.example.com"
48
- end
49
- end
50
-
51
- context "restored request uri on replayed response object" do
52
- it "keeps non-default port" do
53
- stub_request :get, "example.com:1234/foo"
54
- response = HTTP.get "http://example.com:1234/foo"
55
-
56
- expect(response.uri.to_s).to eq "http://example.com:1234/foo"
57
- end
58
-
59
- it "does not injects default port" do
60
- stub_request :get, "example.com/foo"
61
- response = HTTP.get "http://example.com/foo"
62
-
63
- expect(response.uri.to_s).to eq "http://example.com/foo"
64
- end
65
-
66
- it "strips out default port even if it was explicitly given" do
67
- stub_request :get, "example.com/foo"
68
- response = HTTP.get "http://example.com:80/foo"
69
-
70
- expect(response.uri.to_s).to eq "http://example.com/foo"
71
- end
72
- end
73
-
74
- context "streamer" do
75
- it "can be read to a provided buffer" do
76
- stub_request(:get, "example.com/foo")
77
- .to_return(status: 200, body: "Hello world! ")
78
- response = HTTP.get "http://example.com/foo"
79
-
80
- buffer = ""
81
- response.body.readpartial(1024, buffer)
82
-
83
- expect(buffer).to eq "Hello world! "
84
- end
85
-
86
- it "can be closed" do
87
- stub_request :get, "example.com/foo"
88
- response = HTTP.get "http://example.com/foo"
89
-
90
- response.connection.close
91
- end
92
- end
93
- end
@@ -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,107 +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
-
55
- context "when a custom failure handler is defined" do
56
- let(:failure_handler) { proc {} }
57
-
58
- before do
59
- allow(failure_handler).to receive(:call).with(kind_of(Manticore::Timeout)) do |ex|
60
- raise ex
61
- end
62
- end
63
-
64
- it "handles timeouts by invoking the failure handler" do
65
- stub_request(:get, "http://example-foo.com").to_timeout
66
- request = Manticore.get("http://example-foo.com").tap do |req|
67
- req.on_failure(&failure_handler)
68
- end
69
- expect { request.call }.to raise_error(Manticore::Timeout)
70
- expect(failure_handler).to have_received(:call)
71
- end
72
- end
73
-
74
- context 'when used in a streaming mode' do
75
- let(:webmock_server_url) {"http://#{WebMockServer.instance.host_with_port}/"}
76
- let(:result_chunks) { [] }
77
-
78
- def manticore_streaming_get
79
- Manticore.get(webmock_server_url).tap do |req|
80
- req.on_success do |response|
81
- response.body do |chunk|
82
- result_chunks << chunk
83
- end
84
- end
85
- end
86
- end
87
-
88
- context 'when connections are allowed' do
89
- it 'works' do
90
- WebMock.allow_net_connect!
91
- expect { manticore_streaming_get.call }.to_not raise_error
92
- expect(result_chunks).to_not be_empty
93
- end
94
- end
95
-
96
- context 'when stubbed' do
97
- it 'works' do
98
- stub_body = 'hello!'
99
- stub_request(:get, webmock_server_url).to_return(body: stub_body)
100
- expect { manticore_streaming_get.call }.to_not raise_error
101
- expect(result_chunks).to eq [stub_body]
102
- end
103
- end
104
- end
105
- end
106
- end
107
- 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