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,481 +0,0 @@
1
- require 'spec_helper'
2
- require 'acceptance/webmock_shared'
3
-
4
- unless RUBY_PLATFORM =~ /java/
5
- require 'acceptance/curb/curb_spec_helper'
6
-
7
- shared_examples_for "Curb" do
8
- include CurbSpecHelper
9
-
10
- include_examples "with WebMock"
11
-
12
- describe "when doing PUTs" do
13
- it "should stub them" do
14
- stub_request(:put, "www.example.com").with(body: "01234")
15
- expect(http_request(:put, "http://www.example.com", body: "01234").
16
- status).to eq("200")
17
- end
18
- end
19
- end
20
-
21
- describe "Curb features" do
22
- before(:each) do
23
- WebMock.disable_net_connect!
24
- WebMock.reset!
25
- end
26
-
27
- describe "callbacks" do
28
- before(:each) do
29
- @curl = Curl::Easy.new
30
- @curl.url = "http://example.com"
31
- end
32
-
33
- describe 'on_debug' do
34
- it "should call on_debug" do
35
- stub_request(:any, "example.com").
36
- to_return(status: 200, headers: { 'Server' => 'nginx' }, body: { hello: :world }.to_json)
37
-
38
- test = []
39
-
40
- @curl.on_debug do |message, operation|
41
- test << "#{operation} -> #{message}"
42
- end
43
- @curl.headers['Content-Type'] = 'application/json'
44
- @curl.http_post({ hello: :world }.to_json)
45
-
46
- expect(test).to_not be_empty
47
- end
48
- end
49
-
50
- it "should call on_success with 2xx response" do
51
- body = "on_success fired"
52
- stub_request(:any, "example.com").to_return(body: body)
53
-
54
- test = nil
55
- @curl.on_success do |c|
56
- test = c.body_str
57
- end
58
- @curl.http_get
59
- expect(test).to eq(body)
60
- end
61
-
62
- it "should call on_missing with 4xx response" do
63
- response_code = 403
64
- stub_request(:any, "example.com").
65
- to_return(status: [response_code, "None shall pass"])
66
-
67
- test = nil
68
- @curl.on_missing do |c, code|
69
- test = code
70
- end
71
- @curl.http_get
72
- expect(test).to eq(response_code)
73
- end
74
-
75
- it "should call on_failure with 5xx response" do
76
- response_code = 599
77
- stub_request(:any, "example.com").
78
- to_return(status: [response_code, "Server On Fire"])
79
-
80
- test = nil
81
- @curl.on_failure do |c, code|
82
- test = code
83
- end
84
- @curl.http_get
85
- expect(test).to eq(response_code)
86
- end
87
-
88
- it "should call on_body when response body is read" do
89
- body = "on_body fired"
90
- stub_request(:any, "example.com").
91
- to_return(body: body)
92
-
93
- test = nil
94
- @curl.on_body do |data|
95
- test = data
96
- end
97
- @curl.http_get
98
- expect(test).to eq(body)
99
- end
100
-
101
- it "should call on_body for each chunk with chunked response" do
102
- stub_request(:any, "example.com").
103
- to_return(body: ["first_chunk", "second_chunk"],
104
- headers: {"Transfer-Encoding" => "chunked"})
105
-
106
- test = []
107
- @curl.on_body do |data|
108
- test << data
109
- end
110
- @curl.http_get
111
- expect(test).to eq(["first_chunk", "second_chunk"])
112
- end
113
-
114
- it "should call on_header when response headers are read" do
115
- stub_request(:any, "example.com").
116
- to_return(headers: {one: 1})
117
-
118
- test = []
119
- @curl.on_header do |data|
120
- test << data
121
- end
122
- @curl.http_get
123
- expect(test).to eq([
124
- "HTTP/1.1 200 \r\n",
125
- 'One: 1'
126
- ])
127
- end
128
-
129
- it "should call on_complete when request is complete" do
130
- body = "on_complete fired"
131
- stub_request(:any, "example.com").to_return(body: body)
132
-
133
- test = nil
134
- @curl.on_complete do |curl|
135
- test = curl.body_str
136
- end
137
- @curl.http_get
138
- expect(test).to eq(body)
139
- end
140
-
141
- it "should call on_progress when portion of response body is read" do
142
- stub_request(:any, "example.com").to_return(body: "01234")
143
-
144
- test = nil
145
- @curl.on_progress do |*args|
146
- expect(args.length).to eq(4)
147
- args.each {|arg| expect(arg.is_a?(Float)).to eq(true) }
148
- test = true
149
- end
150
- @curl.http_get
151
- expect(test).to eq(true)
152
- end
153
-
154
- it "should call callbacks in correct order on successful request" do
155
- stub_request(:any, "example.com")
156
- order = []
157
- @curl.on_success {|*args| order << :on_success }
158
- @curl.on_missing {|*args| order << :on_missing }
159
- @curl.on_failure {|*args| order << :on_failure }
160
- @curl.on_header {|*args| order << :on_header }
161
- @curl.on_body {|*args| order << :on_body }
162
- @curl.on_complete {|*args| order << :on_complete }
163
- @curl.on_progress {|*args| order << :on_progress }
164
- @curl.http_get
165
-
166
- expect(order).to eq([:on_progress,:on_header,:on_body,:on_complete,:on_success])
167
- end
168
-
169
- it "should call callbacks in correct order on failed request" do
170
- stub_request(:any, "example.com").to_return(status: [500, ""])
171
- order = []
172
- @curl.on_success {|*args| order << :on_success }
173
- @curl.on_missing {|*args| order << :on_missing }
174
- @curl.on_failure {|*args| order << :on_failure }
175
- @curl.on_header {|*args| order << :on_header }
176
- @curl.on_body {|*args| order << :on_body }
177
- @curl.on_complete {|*args| order << :on_complete }
178
- @curl.on_progress {|*args| order << :on_progress }
179
- @curl.http_get
180
-
181
- expect(order).to eq([:on_progress,:on_header,:on_body,:on_complete,:on_failure])
182
- end
183
-
184
- it "should call callbacks in correct order on missing request" do
185
- stub_request(:any, "example.com").to_return(status: [403, ""])
186
- order = []
187
- @curl.on_success {|*args| order << :on_success }
188
- @curl.on_missing {|*args| order << :on_missing }
189
- @curl.on_failure {|*args| order << :on_failure }
190
- @curl.on_header {|*args| order << :on_header }
191
- @curl.on_body {|*args| order << :on_body }
192
- @curl.on_complete {|*args| order << :on_complete }
193
- @curl.on_progress {|*args| order << :on_progress }
194
- @curl.http_get
195
-
196
- expect(order).to eq([:on_progress,:on_header,:on_body,:on_complete,:on_missing])
197
- end
198
- end
199
-
200
- describe '#last_effective_url' do
201
- before(:each) do
202
- @curl = Curl::Easy.new
203
- @curl.url = "http://example.com"
204
- end
205
-
206
- context 'when not following redirects' do
207
- before { @curl.follow_location = false }
208
-
209
- it 'should be the same as #url even with a location header' do
210
- stub_request(:any, 'example.com').
211
- to_return(body: "abc",
212
- status: 302,
213
- headers: { 'Location' => 'http://www.example.com' })
214
-
215
- @curl.http_get
216
- expect(@curl.last_effective_url).to eq('http://example.com')
217
- end
218
- end
219
-
220
- context 'when following redirects' do
221
- before { @curl.follow_location = true }
222
-
223
- it 'should be the same as #url when no location header is present' do
224
- stub_request(:any, "example.com")
225
- @curl.http_get
226
- expect(@curl.last_effective_url).to eq('http://example.com')
227
- end
228
-
229
- it 'should be the value of the location header when present' do
230
- stub_request(:any, 'example.com').
231
- to_return(headers: { 'Location' => 'http://www.example.com' })
232
- stub_request(:any, 'www.example.com')
233
-
234
- @curl.http_get
235
- expect(@curl.last_effective_url).to eq('http://www.example.com')
236
- end
237
-
238
- it 'should work with more than one redirect' do
239
- stub_request(:any, 'example.com').
240
- to_return(headers: { 'Location' => 'http://www.example.com' })
241
- stub_request(:any, 'www.example.com').
242
- to_return(headers: { 'Location' => 'http://blog.example.com' })
243
- stub_request(:any, 'blog.example.com')
244
-
245
- @curl.http_get
246
- expect(@curl.last_effective_url).to eq('http://blog.example.com')
247
- end
248
-
249
- it 'should maintain the original url' do
250
- stub_request(:any, 'example.com').
251
- to_return(headers: { 'Location' => 'http://www.example.com' })
252
- stub_request(:any, 'www.example.com')
253
-
254
- @curl.http_get
255
- expect(@curl.url).to eq('http://example.com')
256
- end
257
-
258
- it 'should have the redirected-to attrs (body, response code)' do
259
- stub_request(:any, 'example.com').
260
- to_return(body: 'request A',
261
- status: 302,
262
- headers: { 'Location' => 'http://www.example.com' })
263
- stub_request(:any, 'www.example.com').to_return(body: 'request B')
264
-
265
- @curl.http_get
266
- expect(@curl.body_str).to eq('request B')
267
- expect(@curl.response_code).to eq(200)
268
- end
269
-
270
- it 'should follow more than one redirect' do
271
- stub_request(:any, 'example.com').
272
- to_return(headers: { 'Location' => 'http://www.example.com' })
273
- stub_request(:any, 'www.example.com').
274
- to_return(headers: { 'Location' => 'http://blog.example.com' })
275
- stub_request(:any, 'blog.example.com').to_return(body: 'blog post')
276
-
277
- @curl.http_get
278
- expect(@curl.url).to eq('http://example.com')
279
- expect(@curl.body_str).to eq('blog post')
280
- end
281
- end
282
- end
283
-
284
- describe "#content_type" do
285
- before(:each) do
286
- @curl = Curl::Easy.new
287
- @curl.url = "http://example.com"
288
- end
289
-
290
- context "when response includes Content-Type header" do
291
- it "returns correct content_type" do
292
- content_type = "application/json"
293
-
294
- stub_request(:any, 'example.com').
295
- to_return(body: "abc",
296
- status: 200,
297
- headers: { 'Content-Type' => content_type })
298
-
299
- @curl.http_get
300
- expect(@curl.content_type).to eq(content_type)
301
- end
302
- end
303
-
304
- context "when response does not include Content-Type header" do
305
- it "returns nil for content_type" do
306
-
307
- stub_request(:any, 'example.com').
308
- to_return(body: "abc",
309
- status: 200 )
310
-
311
- @curl.http_get
312
- expect(@curl.content_type).to be_nil
313
- end
314
- end
315
- end
316
-
317
- describe "#chunked_response?" do
318
- before(:each) do
319
- @curl = Curl::Easy.new
320
- @curl.url = "http://example.com"
321
- end
322
-
323
- it "is true when Transfer-Encoding is 'chunked' and body responds to each" do
324
- stub_request(:any, 'example.com').
325
- to_return(body: ["abc", "def"],
326
- status: 200,
327
- headers: { 'Transfer-Encoding' => 'chunked' })
328
-
329
- @curl.http_get
330
- expect(@curl).to be_chunked_response
331
- end
332
-
333
- it "is false when Transfer-Encoding is not 'chunked'" do
334
- stub_request(:any, 'example.com').
335
- to_return(body: ["abc", "def"],
336
- status: 200)
337
-
338
- @curl.http_get
339
- expect(@curl).not_to be_chunked_response
340
- end
341
-
342
- it "is false when Transfer-Encoding is 'chunked' but body does not respond to each" do
343
- stub_request(:any, 'example.com').
344
- to_return(body: "abc",
345
- status: 200)
346
-
347
- @curl.http_get
348
- expect(@curl).not_to be_chunked_response
349
- end
350
- end
351
- end
352
-
353
- describe "Webmock with Curb" do
354
- describe "using #http for requests" do
355
- it_should_behave_like "Curb"
356
- include CurbSpecHelper::DynamicHttp
357
-
358
- it "should work with uppercase arguments" do
359
- stub_request(:get, "www.example.com").to_return(body: "abc")
360
-
361
- c = Curl::Easy.new
362
- c.url = "http://www.example.com"
363
- c.http(:GET)
364
- expect(c.body_str).to eq("abc")
365
- end
366
-
367
- it "should alias body to body_str" do
368
- stub_request(:get, "www.example.com").to_return(body: "abc")
369
-
370
- c = Curl::Easy.new
371
- c.url = "http://www.example.com"
372
- c.http(:GET)
373
- expect(c.body).to eq("abc")
374
- end
375
-
376
- it "supports array headers passed to Curl::Easy" do
377
- stub_request(:get, "www.example.com").with(headers: {'X-One' => '1'}).to_return(body: "abc")
378
-
379
- c = Curl::Easy.new
380
- c.url = "http://www.example.com"
381
- c.headers = ["X-One: 1"]
382
- c.http(:GET)
383
- expect(c.body).to eq("abc")
384
- end
385
-
386
- describe 'match request body' do
387
- it 'for post' do
388
- stub_request(:post, "www.example.com").with(body: 'foo=nhe').to_return(body: "abc")
389
-
390
- response = Curl.post("http://www.example.com", {foo: :nhe})
391
- expect(response.body_str).to eq("abc")
392
- end
393
-
394
- it 'for patch' do
395
- stub_request(:patch, "www.example.com").with(body: 'foo=nhe').to_return(body: "abc")
396
-
397
- response = Curl.patch("http://www.example.com", {foo: :nhe})
398
- expect(response.body_str).to eq("abc")
399
- end
400
-
401
- it 'for put' do
402
- stub_request(:put, "www.example.com").with(body: 'foo=nhe').to_return(body: "abc")
403
-
404
- response = Curl.put("http://www.example.com", {foo: :nhe})
405
- expect(response.body_str).to eq("abc")
406
- end
407
- end
408
- end
409
-
410
- describe "using #http_* methods for requests" do
411
- it_should_behave_like "Curb"
412
- include CurbSpecHelper::NamedHttp
413
-
414
- it "should work with blank arguments for post" do
415
- stub_request(:post, "www.example.com").with(body: "01234")
416
- c = Curl::Easy.new
417
- c.url = "http://www.example.com"
418
- c.post_body = "01234"
419
- c.http_post
420
- expect(c.response_code).to eq(200)
421
- end
422
-
423
- it "should work with several body arguments for post using the class method" do
424
- stub_request(:post, "www.example.com").with(body: {user: {first_name: 'Bartosz', last_name: 'Blimke'}})
425
- c = Curl::Easy.http_post "http://www.example.com", 'user[first_name]=Bartosz', 'user[last_name]=Blimke'
426
- expect(c.response_code).to eq(200)
427
- end
428
-
429
- it "should work with blank arguments for put" do
430
- stub_request(:put, "www.example.com").with(body: "01234")
431
- c = Curl::Easy.new
432
- c.url = "http://www.example.com"
433
- c.put_data = "01234"
434
- c.http_put
435
- expect(c.response_code).to eq(200)
436
- end
437
-
438
- it "should work with multiple arguments for post" do
439
- data = { name: "john", address: "111 example ave" }
440
-
441
- stub_request(:post, "www.example.com").with(body: data)
442
- c = Curl::Easy.new
443
- c.url = "http://www.example.com"
444
- c.http_post Curl::PostField.content('name', data[:name]), Curl::PostField.content('address', data[:address])
445
-
446
- expect(c.response_code).to eq(200)
447
- end
448
-
449
- end
450
-
451
- describe "using #perform for requests" do
452
- it_should_behave_like "Curb"
453
- include CurbSpecHelper::Perform
454
- end
455
-
456
- describe "using .http_* methods for requests" do
457
- it_should_behave_like "Curb"
458
- include CurbSpecHelper::ClassNamedHttp
459
- end
460
-
461
- describe "using .perform for requests" do
462
- it_should_behave_like "Curb"
463
- include CurbSpecHelper::ClassPerform
464
- end
465
-
466
- describe "using .reset" do
467
- before do
468
- @curl = Curl::Easy.new
469
- @curl.url = "http://example.com"
470
- body = "on_success fired"
471
- stub_request(:any, "example.com").to_return(body: body)
472
- @curl.http_get
473
- end
474
-
475
- it "should clear the body_str" do
476
- @curl.reset
477
- expect(@curl.body_str).to eq(nil)
478
- end
479
- end
480
- end
481
- end
@@ -1,147 +0,0 @@
1
- require 'ostruct'
2
-
3
- module CurbSpecHelper
4
- def http_request(method, uri, options = {}, &block)
5
- uri = Addressable::URI.heuristic_parse(uri)
6
- body = options[:body]
7
-
8
- curl = curb_http_request(uri, method, body, options)
9
-
10
- status, response_headers =
11
- WebMock::HttpLibAdapters::CurbAdapter.parse_header_string(curl.header_str)
12
-
13
- # Deal with the fact that the HTTP spec allows multi-values headers
14
- # to either be a single entry with a comma-separated listed of
15
- # values, or multiple separate entries
16
- response_headers.keys.each do |k|
17
- v = response_headers[k]
18
- if v.is_a?(Array)
19
- response_headers[k] = v.join(', ')
20
- end
21
- end
22
-
23
- OpenStruct.new(
24
- body: curl.body_str,
25
- headers: WebMock::Util::Headers.normalize_headers(response_headers),
26
- status: curl.response_code.to_s,
27
- message: status
28
- )
29
- end
30
-
31
- def setup_request(uri, curl, options={})
32
- curl ||= Curl::Easy.new
33
- curl.url = uri.to_s
34
- if options[:basic_auth]
35
- curl.http_auth_types = :basic
36
- curl.username = options[:basic_auth][0]
37
- curl.password = options[:basic_auth][1]
38
- end
39
- curl.timeout = 30
40
- curl.connect_timeout = 30
41
-
42
- if headers = options[:headers]
43
- headers.each {|k,v| curl.headers[k] = v }
44
- end
45
-
46
- curl
47
- end
48
-
49
- def client_timeout_exception_class
50
- Curl::Err::TimeoutError
51
- end
52
-
53
- def connection_refused_exception_class
54
- Curl::Err::ConnectionFailedError
55
- end
56
-
57
- def http_library
58
- :curb
59
- end
60
-
61
- module DynamicHttp
62
- def curb_http_request(uri, method, body, options)
63
- curl = setup_request(uri, nil, options)
64
-
65
- case method
66
- when :post
67
- curl.post_body = body
68
- when :put
69
- curl.put_data = body
70
- end
71
-
72
- curl.http(method.to_s.upcase)
73
- curl
74
- end
75
- end
76
-
77
- module NamedHttp
78
- def curb_http_request(uri, method, body, options)
79
- curl = setup_request(uri, nil, options)
80
-
81
- case method
82
- when :put, :post
83
- curl.send( "http_#{method}", body )
84
- else
85
- curl.send( "http_#{method}" )
86
- end
87
- curl
88
- end
89
- end
90
-
91
- module Perform
92
- def curb_http_request(uri, method, body, options)
93
- curl = setup_request(uri, nil, options)
94
-
95
- case method
96
- when :post
97
- curl.post_body = body
98
- when :put
99
- curl.put_data = body
100
- when :head
101
- curl.head = true
102
- when :delete
103
- curl.delete = true
104
- end
105
-
106
- curl.perform
107
- curl
108
- end
109
- end
110
-
111
- module ClassNamedHttp
112
- def curb_http_request(uri, method, body, options)
113
- args = ["http_#{method}", uri]
114
- args << body if method == :post || method == :put
115
-
116
- c = Curl::Easy.send(*args) do |curl|
117
- setup_request(uri, curl, options)
118
- end
119
-
120
- c
121
- end
122
- end
123
-
124
- module ClassPerform
125
- def curb_http_request(uri, method, body, options)
126
- args = ["http_#{method}", uri]
127
- args << body if method == :post || method == :put
128
-
129
- c = Curl::Easy.send(*args) do |curl|
130
- setup_request(uri, curl, options)
131
-
132
- case method
133
- when :post
134
- curl.post_body = body
135
- when :put
136
- curl.put_data = body
137
- when :head
138
- curl.head = true
139
- when :delete
140
- curl.delete = true
141
- end
142
- end
143
-
144
- c
145
- end
146
- end
147
- end