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.
Files changed (142) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +476 -2
  3. data/README.md +166 -42
  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 +228 -0
  12. data/lib/webmock/http_lib_adapters/curb_adapter.rb +14 -3
  13. data/lib/webmock/http_lib_adapters/em_http_request_adapter.rb +22 -9
  14. data/lib/webmock/http_lib_adapters/excon_adapter.rb +5 -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 +4 -1
  18. data/lib/webmock/http_lib_adapters/http_rb/request.rb +17 -5
  19. data/lib/webmock/http_lib_adapters/http_rb/response.rb +49 -5
  20. data/lib/webmock/http_lib_adapters/http_rb/streamer.rb +11 -3
  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 +25 -7
  24. data/lib/webmock/http_lib_adapters/manticore_adapter.rb +35 -15
  25. data/lib/webmock/http_lib_adapters/net_http.rb +59 -112
  26. data/lib/webmock/http_lib_adapters/net_http_response.rb +3 -1
  27. data/lib/webmock/http_lib_adapters/patron_adapter.rb +4 -2
  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 +3 -1
  36. data/lib/webmock/request_execution_verifier.rb +2 -0
  37. data/lib/webmock/request_pattern.rb +118 -61
  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 +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 +4 -1
  48. data/lib/webmock/stub_registry.rb +28 -11
  49. data/lib/webmock/stub_request_snippet.rb +2 -0
  50. data/lib/webmock/test_unit.rb +3 -3
  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 +6 -2
  59. data/lib/webmock/util/uri.rb +11 -9
  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 +22 -3
  64. data/lib/webmock.rb +5 -2
  65. metadata +99 -175
  66. data/.gemtest +0 -0
  67. data/.gitignore +0 -34
  68. data/.rspec-tm +0 -2
  69. data/.travis.yml +0 -21
  70. data/Gemfile +0 -9
  71. data/Rakefile +0 -30
  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/curb/curb_spec.rb +0 -481
  77. data/spec/acceptance/curb/curb_spec_helper.rb +0 -147
  78. data/spec/acceptance/em_http_request/em_http_request_spec.rb +0 -406
  79. data/spec/acceptance/em_http_request/em_http_request_spec_helper.rb +0 -77
  80. data/spec/acceptance/excon/excon_spec.rb +0 -77
  81. data/spec/acceptance/excon/excon_spec_helper.rb +0 -50
  82. data/spec/acceptance/http_rb/http_rb_spec.rb +0 -82
  83. data/spec/acceptance/http_rb/http_rb_spec_helper.rb +0 -54
  84. data/spec/acceptance/httpclient/httpclient_spec.rb +0 -217
  85. data/spec/acceptance/httpclient/httpclient_spec_helper.rb +0 -57
  86. data/spec/acceptance/manticore/manticore_spec.rb +0 -56
  87. data/spec/acceptance/manticore/manticore_spec_helper.rb +0 -35
  88. data/spec/acceptance/net_http/net_http_shared.rb +0 -153
  89. data/spec/acceptance/net_http/net_http_spec.rb +0 -331
  90. data/spec/acceptance/net_http/net_http_spec_helper.rb +0 -64
  91. data/spec/acceptance/net_http/real_net_http_spec.rb +0 -20
  92. data/spec/acceptance/patron/patron_spec.rb +0 -125
  93. data/spec/acceptance/patron/patron_spec_helper.rb +0 -54
  94. data/spec/acceptance/shared/allowing_and_disabling_net_connect.rb +0 -313
  95. data/spec/acceptance/shared/callbacks.rb +0 -147
  96. data/spec/acceptance/shared/complex_cross_concern_behaviors.rb +0 -36
  97. data/spec/acceptance/shared/enabling_and_disabling_webmock.rb +0 -95
  98. data/spec/acceptance/shared/precedence_of_stubs.rb +0 -15
  99. data/spec/acceptance/shared/request_expectations.rb +0 -923
  100. data/spec/acceptance/shared/returning_declared_responses.rb +0 -388
  101. data/spec/acceptance/shared/stubbing_requests.rb +0 -638
  102. data/spec/acceptance/typhoeus/typhoeus_hydra_spec.rb +0 -135
  103. data/spec/acceptance/typhoeus/typhoeus_hydra_spec_helper.rb +0 -60
  104. data/spec/acceptance/webmock_shared.rb +0 -41
  105. data/spec/fixtures/test.txt +0 -1
  106. data/spec/quality_spec.rb +0 -84
  107. data/spec/spec_helper.rb +0 -48
  108. data/spec/support/example_curl_output.txt +0 -22
  109. data/spec/support/failures.rb +0 -9
  110. data/spec/support/my_rack_app.rb +0 -53
  111. data/spec/support/network_connection.rb +0 -19
  112. data/spec/support/webmock_server.rb +0 -69
  113. data/spec/unit/api_spec.rb +0 -175
  114. data/spec/unit/errors_spec.rb +0 -129
  115. data/spec/unit/http_lib_adapters/http_lib_adapter_registry_spec.rb +0 -17
  116. data/spec/unit/http_lib_adapters/http_lib_adapter_spec.rb +0 -12
  117. data/spec/unit/matchers/hash_excluding_matcher_spec.rb +0 -61
  118. data/spec/unit/matchers/hash_including_matcher_spec.rb +0 -87
  119. data/spec/unit/rack_response_spec.rb +0 -112
  120. data/spec/unit/request_body_diff_spec.rb +0 -90
  121. data/spec/unit/request_execution_verifier_spec.rb +0 -208
  122. data/spec/unit/request_pattern_spec.rb +0 -596
  123. data/spec/unit/request_registry_spec.rb +0 -95
  124. data/spec/unit/request_signature_snippet_spec.rb +0 -89
  125. data/spec/unit/request_signature_spec.rb +0 -155
  126. data/spec/unit/request_stub_spec.rb +0 -199
  127. data/spec/unit/response_spec.rb +0 -282
  128. data/spec/unit/stub_registry_spec.rb +0 -103
  129. data/spec/unit/stub_request_snippet_spec.rb +0 -115
  130. data/spec/unit/util/hash_counter_spec.rb +0 -39
  131. data/spec/unit/util/hash_keys_stringifier_spec.rb +0 -27
  132. data/spec/unit/util/headers_spec.rb +0 -28
  133. data/spec/unit/util/json_spec.rb +0 -33
  134. data/spec/unit/util/query_mapper_spec.rb +0 -150
  135. data/spec/unit/util/uri_spec.rb +0 -299
  136. data/spec/unit/util/version_checker_spec.rb +0 -65
  137. data/spec/unit/webmock_spec.rb +0 -11
  138. data/test/http_request.rb +0 -24
  139. data/test/shared_test.rb +0 -108
  140. data/test/test_helper.rb +0 -23
  141. data/test/test_webmock.rb +0 -6
  142. data/webmock.gemspec +0 -46
@@ -1,406 +0,0 @@
1
- # encoding: utf-8
2
- require 'spec_helper'
3
- require 'acceptance/webmock_shared'
4
- require 'ostruct'
5
-
6
- unless RUBY_PLATFORM =~ /java/
7
- require 'acceptance/em_http_request/em_http_request_spec_helper'
8
-
9
- describe "EM::HttpRequest" do
10
- include EMHttpRequestSpecHelper
11
-
12
- include_context "with WebMock", :no_status_message
13
-
14
- #functionality only supported for em-http-request 1.x
15
- if defined?(EventMachine::HttpConnection)
16
- context 'when a real request is made and redirects are followed', net_connect: true do
17
- before { WebMock.allow_net_connect! }
18
-
19
- # This url redirects to the https URL.
20
- let(:http_url) { "http://raw.github.com:80/gist/fb555cb593f3349d53af/6921dd638337d3f6a51b0e02e7f30e3c414f70d6/vcr_gist" }
21
- let(:https_url) { http_url.gsub('http', 'https').gsub('80', '443') }
22
-
23
- def make_request
24
- EM.run do
25
- request = EM::HttpRequest.new(http_url).get(redirects: 1)
26
- request.callback { EM.stop }
27
- end
28
- end
29
-
30
- it "invokes the globally_stub_request hook with both requests" do
31
- urls = []
32
- WebMock.globally_stub_request { |r| urls << r.uri.to_s; nil }
33
-
34
- make_request
35
-
36
- expect(urls).to eq([http_url, https_url])
37
- end
38
-
39
- it 'invokes the after_request hook with both requests' do
40
- urls = []
41
- WebMock.after_request { |req, res| urls << req.uri.to_s }
42
-
43
- make_request
44
-
45
- expect(urls).to eq([http_url, https_url])
46
- end
47
- end
48
-
49
- describe "with middleware" do
50
-
51
- it "should work with request middleware" do
52
- stub_request(:get, "www.example.com").with(body: 'bar')
53
-
54
- middleware = Class.new do
55
- def request(client, head, body)
56
- [{}, 'bar']
57
- end
58
- end
59
-
60
- EM.run do
61
- conn = EventMachine::HttpRequest.new('http://www.example.com/')
62
-
63
- conn.use middleware
64
-
65
- http = conn.get(body: 'foo')
66
-
67
- http.callback do
68
- expect(WebMock).to have_requested(:get, "www.example.com").with(body: 'bar')
69
- EM.stop
70
- end
71
- end
72
- end
73
-
74
- let(:response_middleware) do
75
- Class.new do
76
- def response(resp)
77
- resp.response = 'bar'
78
- end
79
- end
80
- end
81
-
82
- it "should work with response middleware" do
83
- stub_request(:get, "www.example.com").to_return(body: 'foo')
84
-
85
- EM.run do
86
- conn = EventMachine::HttpRequest.new('http://www.example.com/')
87
-
88
- conn.use response_middleware
89
-
90
- http = conn.get
91
-
92
- http.callback do
93
- expect(http.response).to eq('bar')
94
- EM.stop
95
- end
96
- end
97
- end
98
-
99
- let(:webmock_server_url) { "http://#{WebMockServer.instance.host_with_port}/" }
100
-
101
- shared_examples_for "em-http-request middleware/after_request hook integration" do
102
- it 'yields the original raw body to the after_request hook even if a response middleware modifies the body' do
103
- yielded_response_body = nil
104
- ::WebMock.after_request do |request, response|
105
- yielded_response_body = response.body
106
- end
107
-
108
- EM::HttpRequest.use response_middleware
109
-
110
- EM.run do
111
- http = EventMachine::HttpRequest.new(webmock_server_url).get
112
- http.callback { EM.stop }
113
- end
114
-
115
- expect(yielded_response_body).to eq("hello world")
116
- end
117
- end
118
-
119
- context 'making a real request', net_connect: true do
120
- before { WebMock.allow_net_connect! }
121
- include_examples "em-http-request middleware/after_request hook integration"
122
- end
123
-
124
- context 'when the request is stubbed' do
125
- before { stub_request(:get, webmock_server_url).to_return(body: 'hello world') }
126
- include_examples "em-http-request middleware/after_request hook integration"
127
- end
128
- end
129
-
130
- it 'should trigger error callbacks asynchronously' do
131
- stub_request(:get, 'www.example.com').to_timeout
132
- called = false
133
-
134
- EM.run do
135
- conn = EventMachine::HttpRequest.new('http://www.example.com/')
136
- http = conn.get
137
- http.errback do
138
- called = true
139
- EM.stop
140
- end
141
- expect(called).to eq(false)
142
- end
143
-
144
- expect(called).to eq(true)
145
- end
146
-
147
- # not pretty, but it works
148
- if defined?(EventMachine::Synchrony)
149
- describe "with synchrony" do
150
- let(:webmock_em_http) { File.expand_path(File.join(File.dirname(__FILE__), "../lib/webmock/http_lib_adapters/em_http_request/em_http_request_1_x.rb")) }
151
-
152
- before(:each) do
153
- # need to reload the webmock em-http adapter after we require synchrony
154
- WebMock::HttpLibAdapters::EmHttpRequestAdapter.disable!
155
- $".delete webmock_em_http
156
- $".delete File.expand_path(File.join(File.dirname(__FILE__), "../../../lib/webmock/http_lib_adapters/em_http_request_adapter.rb"))
157
- require 'em-synchrony'
158
- require 'em-synchrony/em-http'
159
- require File.expand_path(File.join(File.dirname(__FILE__), "../../../lib/webmock/http_lib_adapters/em_http_request_adapter.rb"))
160
- end
161
-
162
- it "should work" do
163
- stub_request(:post, /.*.testserver.com*/).to_return(status: 200, body: 'ok')
164
- expect {
165
- EM.run do
166
- fiber = Fiber.new do
167
- EM::HttpRequest.new("http://www.testserver.com").post body: "foo=bar&baz=bang", timeout: 60
168
- EM.stop
169
- end
170
- fiber.resume
171
- end
172
- }.not_to raise_error
173
- end
174
-
175
- after(:each) do
176
- EM.send(:remove_const, :Synchrony)
177
- EM.send(:remove_const, :HTTPMethods)
178
- WebMock::HttpLibAdapters::EmHttpRequestAdapter.disable!
179
- $".reject! {|path| path.include? "em-http-request"}
180
- $".delete webmock_em_http
181
- $".delete File.expand_path(File.join(File.dirname(__FILE__), "../../../lib/webmock/http_lib_adapters/em_http_request_adapter.rb"))
182
- require 'em-http-request'
183
- require File.expand_path(File.join(File.dirname(__FILE__), "../../../lib/webmock/http_lib_adapters/em_http_request_adapter.rb"))
184
- end
185
- end
186
- end
187
- end
188
-
189
- it "should work with streaming" do
190
- stub_request(:get, "www.example.com").to_return(body: "abc")
191
- response = ""
192
- EM.run {
193
- http = EventMachine::HttpRequest.new('http://www.example.com/').get
194
- http.stream { |chunk| response = chunk; EM.stop }
195
- }
196
- expect(response).to eq("abc")
197
- end
198
-
199
- it "should work with responses that use chunked transfer encoding" do
200
- stub_request(:get, "www.example.com").to_return(body: "abc", headers: { 'Transfer-Encoding' => 'chunked' })
201
- expect(http_request(:get, "http://www.example.com").body).to eq("abc")
202
- end
203
-
204
- it "should work with optional query params" do
205
- stub_request(:get, "www.example.com/?x=3&a[]=b&a[]=c").to_return(body: "abc")
206
- expect(http_request(:get, "http://www.example.com/?x=3", query: {"a" => ["b", "c"]}).body).to eq("abc")
207
- end
208
-
209
- it "should work with optional query params declared as string" do
210
- stub_request(:get, "www.example.com/?x=3&a[]=b&a[]=c").to_return(body: "abc")
211
- expect(http_request(:get, "http://www.example.com/?x=3", query: "a[]=b&a[]=c").body).to eq("abc")
212
- end
213
-
214
- it "should work when the body is passed as a Hash" do
215
- stub_request(:post, "www.example.com").with(body: {a: "1", b: "2"}).to_return(body: "ok")
216
- expect(http_request(:post, "http://www.example.com", body: {a: "1", b: "2"}).body).to eq("ok")
217
- end
218
-
219
- if defined?(EventMachine::HttpConnection)
220
- it "should work when a file is passed as body" do
221
- stub_request(:post, "www.example.com").with(body: File.read(__FILE__)).to_return(body: "ok")
222
- expect(http_request(:post, "http://www.example.com", file: __FILE__).body).to eq("ok")
223
- end
224
- end
225
-
226
- it "should work with UTF-8 strings" do
227
- body = "Привет, Мир!"
228
- stub_request(:post, "www.example.com").to_return(body: body)
229
- expect(http_request(:post, "http://www.example.com").body.bytesize).to eq(body.bytesize)
230
- end
231
-
232
- it "should work with multiple requests to the same connection" do
233
- stub_request(:get, "www.example.com/foo").to_return(body: "bar")
234
- stub_request(:get, "www.example.com/baz").to_return(body: "wombat")
235
- err1 = nil
236
- err2 = nil
237
- body1 = nil
238
- body2 = nil
239
- i = 0
240
-
241
- EM.run do
242
- conn = EM::HttpRequest.new("http://www.example.com")
243
- conn.get(path: "/foo").callback do |resp|
244
- body1 = resp.response
245
- i += 1; EM.stop if i == 2
246
- end.errback do |resp|
247
- err1 = resp.error
248
- i += 1; EM.stop if i == 2
249
- end
250
-
251
- conn.get(path: "/baz").callback do |resp|
252
- body2 = resp.response
253
- i += 1; EM.stop if i == 2
254
- end.errback do |resp|
255
- err2 = resp.error
256
- i += 1; EM.stop if i == 2
257
- end
258
- end
259
-
260
- expect(err1).to be(nil)
261
- expect(err2).to be(nil)
262
- expect(body1).to eq("bar")
263
- expect(body2).to eq("wombat")
264
- end
265
-
266
- it "should work with multiple requests to the same connection when the first request times out" do
267
- stub_request(:get, "www.example.com/foo").to_timeout.then.to_return(status: 200, body: "wombat")
268
- err = nil
269
- body = nil
270
-
271
- EM.run do
272
- conn = EM::HttpRequest.new("http://www.example.com")
273
- conn.get(path: "/foo").callback do |resp|
274
- err = :success_from_timeout
275
- EM.stop
276
- end.errback do |resp|
277
- conn.get(path: "/foo").callback do |retry_resp|
278
- expect(retry_resp.response_header.status).to eq(200)
279
- body = retry_resp.response
280
- EM.stop
281
- end.errback do |retry_resp|
282
- err = retry_resp.error
283
- EM.stop
284
- end
285
- end
286
- end
287
-
288
- expect(err).to be(nil)
289
- expect(body).to eq("wombat")
290
- end
291
-
292
- describe "mocking EM::HttpClient API" do
293
- let(:uri) { "http://www.example.com/" }
294
-
295
- before do
296
- stub_request(:get, uri)
297
- WebMock::HttpLibAdapters::EmHttpRequestAdapter.enable!
298
- end
299
-
300
- def client(uri, options = {})
301
- client = nil
302
- EM.run do
303
- client = EventMachine::HttpRequest.new(uri).get(options)
304
- client.callback { EM.stop }
305
- client.errback { failed }
306
- end
307
- client
308
- end
309
-
310
- subject { client(uri) }
311
-
312
- it 'should support #uri' do
313
- expect(subject.uri).to eq(Addressable::URI.parse(uri))
314
- end
315
-
316
- it 'should support #last_effective_url' do
317
- expect(subject.last_effective_url).to eq(Addressable::URI.parse(uri))
318
- end
319
-
320
- context "with a query" do
321
- let(:uri) { "http://www.example.com/?a=1&b=2" }
322
- subject { client("http://www.example.com/?a=1", query: { 'b' => 2 }) }
323
-
324
- it "#request_signature doesn't mutate the original uri" do
325
- expect(subject.uri).to eq(Addressable::URI.parse("http://www.example.com/?a=1"))
326
- signature = WebMock::RequestRegistry.instance.requested_signatures.hash.keys.first
327
- expect(signature.uri).to eq(Addressable::URI.parse(uri))
328
- end
329
- end
330
-
331
- describe 'get_response_cookie' do
332
-
333
- before(:each) do
334
- stub_request(:get, "http://example.org/").
335
- to_return(
336
- status: 200,
337
- body: "",
338
- headers: { 'Set-Cookie' => cookie_string }
339
- )
340
- end
341
-
342
- describe 'success' do
343
-
344
- context 'with only one cookie' do
345
-
346
- let(:cookie_name) { 'name_of_the_cookie' }
347
- let(:cookie_value) { 'value_of_the_cookie' }
348
- let(:cookie_string) { "#{cookie_name}=#{cookie_value}" }
349
-
350
- it 'successfully gets the cookie' do
351
- EM.run {
352
- http = EventMachine::HttpRequest.new('http://example.org').get
353
-
354
- http.errback { fail(http.error) }
355
- http.callback {
356
- expect(http.get_response_cookie(cookie_name)).to eq(cookie_value)
357
- EM.stop
358
- }
359
- }
360
- end
361
- end
362
-
363
- context 'with several cookies' do
364
-
365
- let(:cookie_name) { 'name_of_the_cookie' }
366
- let(:cookie_value) { 'value_of_the_cookie' }
367
- let(:cookie_2_name) { 'name_of_the_2nd_cookie' }
368
- let(:cookie_2_value) { 'value_of_the_2nd_cookie' }
369
- let(:cookie_string) { %W(#{cookie_name}=#{cookie_value} #{cookie_2_name}=#{cookie_2_value}) }
370
-
371
- it 'successfully gets both cookies' do
372
- EM.run {
373
- http = EventMachine::HttpRequest.new('http://example.org').get
374
-
375
- http.errback { fail(http.error) }
376
- http.callback {
377
- expect(http.get_response_cookie(cookie_name)).to eq(cookie_value)
378
- expect(http.get_response_cookie(cookie_2_name)).to eq(cookie_2_value)
379
- EM.stop
380
- }
381
- }
382
- end
383
- end
384
- end
385
-
386
- describe 'failure' do
387
-
388
- let(:cookie_string) { 'a=b' }
389
-
390
- it 'returns nil when no cookie is found' do
391
- EM.run {
392
- http = EventMachine::HttpRequest.new('http://example.org').get
393
-
394
- http.errback { fail(http.error) }
395
- http.callback {
396
- expect(http.get_response_cookie('not_found_cookie')).to eq(nil)
397
- EM.stop
398
- }
399
- }
400
- end
401
- end
402
- end
403
- end
404
-
405
- end
406
- end
@@ -1,77 +0,0 @@
1
- module EMHttpRequestSpecHelper
2
-
3
- def failed
4
- EventMachine.stop
5
- fail
6
- end
7
-
8
- def http_request(method, uri, options = {}, &block)
9
- @http = nil
10
- head = options[:headers] || {}
11
- if options[:basic_auth]
12
- head.merge!('authorization' => options[:basic_auth])
13
- end
14
- response = nil
15
- error = nil
16
- error_set = false
17
- uri = Addressable::URI.heuristic_parse(uri)
18
- EventMachine.run {
19
- request = EventMachine::HttpRequest.new("#{uri.normalize.to_s}")
20
- http = request.send(method, {
21
- timeout: 30,
22
- body: options[:body],
23
- file: options[:file],
24
- query: options[:query],
25
- head: head,
26
- compressed: false
27
- }, &block)
28
- http.errback {
29
- error_set = true
30
- error = if http.respond_to?(:errors)
31
- http.errors
32
- else
33
- http.error
34
- end
35
- failed
36
- }
37
- http.callback {
38
- response = OpenStruct.new({
39
- body: http.response,
40
- headers: WebMock::Util::Headers.normalize_headers(extract_response_headers(http)),
41
- message: http.response_header.http_reason,
42
- status: http.response_header.status.to_s
43
- })
44
- EventMachine.stop
45
- }
46
- @http = http
47
- }
48
- raise error.to_s if error_set
49
- response
50
- end
51
-
52
- def client_timeout_exception_class
53
- "WebMock timeout error"
54
- end
55
-
56
- def connection_refused_exception_class
57
- RuntimeError
58
- end
59
-
60
- def http_library
61
- :em_http_request
62
- end
63
-
64
- private
65
-
66
- def extract_response_headers(http)
67
- headers = {}
68
- if http.response_header
69
- http.response_header.each do |k,v|
70
- v = v.join(", ") if v.is_a?(Array)
71
- headers[k] = v
72
- end
73
- end
74
- headers
75
- end
76
-
77
- end
@@ -1,77 +0,0 @@
1
- require 'spec_helper'
2
- require 'acceptance/webmock_shared'
3
- require 'acceptance/excon/excon_spec_helper'
4
-
5
- describe "Excon" do
6
- include ExconSpecHelper
7
- include_context "with WebMock", :no_url_auth
8
-
9
- it 'should allow Excon requests to use query hash paramters' do
10
- stub_request(:get, "http://example.com/resource/?a=1&b=2").to_return(body: "abc")
11
- expect(Excon.new('http://example.com').get(path: "resource/", query: {a: 1, b: 2}).body).to eq("abc")
12
- end
13
-
14
- it 'should support Excon :expects options' do
15
- stub_request(:get, "http://example.com/").to_return(body: 'a')
16
- expect { Excon.new('http://example.com').get(expects: 204) }.to raise_error(Excon::Errors::OK)
17
- end
18
-
19
- context "with response_block" do
20
- it "should support excon response_block for real requests", net_connect: true do
21
- a = []
22
- WebMock.allow_net_connect!
23
- r = Excon.new('http://httpstat.us/200', headers: { "Accept" => "*" }).
24
- get(response_block: lambda {|e, remaining, total| a << e}, chunk_size: 1)
25
- expect(a).to eq(["2", "0", "0", " ", "O", "K"])
26
- expect(r.body).to eq("")
27
- end
28
-
29
- it "should support excon response_block" do
30
- a = []
31
- stub_request(:get, "http://example.com/").to_return(body: "abc")
32
- r = Excon.new('http://example.com').get(response_block: lambda {|e, remaining, total| a << e}, chunk_size: 1)
33
- expect(a).to eq(['a', 'b', 'c'])
34
- expect(r.body).to eq("")
35
- end
36
-
37
- it "should invoke callbacks with response body even if a real request is made", net_connect: true do
38
- a = []
39
- WebMock.allow_net_connect!
40
- response = nil
41
- WebMock.after_request { |_, res|
42
- response = res
43
- }
44
- r = Excon.new('http://httpstat.us/200', headers: { "Accept" => "*" }).
45
- get(response_block: lambda {|e, remaining, total| a << e}, chunk_size: 1)
46
- expect(response.body).to eq("200 OK")
47
- expect(a).to eq(["2", "0", "0", " ", "O", "K"])
48
- expect(r.body).to eq("")
49
- end
50
- end
51
-
52
- let(:file) { File.new(__FILE__) }
53
- let(:file_contents) { File.read(__FILE__) }
54
-
55
- it 'handles file uploads correctly' do
56
- stub_request(:put, "http://example.com/upload").with(body: file_contents)
57
-
58
- yielded_request_body = nil
59
- WebMock.after_request do |req, res|
60
- yielded_request_body = req.body
61
- end
62
-
63
- Excon.new("http://example.com").put(path: "upload", body: file)
64
-
65
- expect(yielded_request_body).to eq(file_contents)
66
- end
67
-
68
- describe '.request_params_from' do
69
-
70
- it 'rejects invalid request keys' do
71
- request_params = WebMock::HttpLibAdapters::ExconAdapter.request_params_from(body: :keep, fake: :reject)
72
- expect(request_params).to eq(body: :keep)
73
- end
74
-
75
- end
76
-
77
- end
@@ -1,50 +0,0 @@
1
- require 'ostruct'
2
-
3
- module ExconSpecHelper
4
-
5
- def http_request(method, uri, options = {}, &block)
6
- Excon.defaults[:ssl_verify_peer] = false
7
- Excon.defaults[:ciphers] = 'DEFAULT'
8
- uri = Addressable::URI.heuristic_parse(uri)
9
- uri = uri.to_s.gsub(' ', '%20')
10
-
11
- excon_options = {}
12
-
13
- if basic_auth = options.delete(:basic_auth)
14
- excon_options = {user: basic_auth[0], password: basic_auth[1]}
15
- end
16
-
17
- if Gem::Version.new(Excon::VERSION) < Gem::Version.new("0.29.0")
18
- options = options.merge(method: method, nonblock: false) # Dup and merge
19
- response = Excon.new(uri, excon_options).request(options, &block)
20
- else
21
- options = options.merge(method: method) # Dup and merge
22
- response = Excon.new(uri, excon_options.merge(nonblock: false)).request(options, &block)
23
- end
24
-
25
- headers = WebMock::Util::Headers.normalize_headers(response.headers)
26
- headers = headers.inject({}) do |res, (name, value)|
27
- res[name] = value.is_a?(Array) ? value.flatten.join(', ') : value
28
- res
29
- end
30
-
31
- OpenStruct.new \
32
- body: response.body,
33
- headers: headers,
34
- status: response.status.to_s,
35
- message: response.reason_phrase
36
- end
37
-
38
- def client_timeout_exception_class
39
- Excon::Errors::Timeout
40
- end
41
-
42
- def connection_refused_exception_class
43
- Excon::Errors::SocketError
44
- end
45
-
46
- def http_library
47
- :excon
48
- end
49
-
50
- end
@@ -1,82 +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 closed" do
76
- stub_request :get, "example.com/foo"
77
- response = HTTP.get "http://example.com/foo"
78
-
79
- response.connection.close
80
- end
81
- end
82
- end