webmock 3.18.1 → 3.19.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 (141) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +34 -0
  3. data/README.md +34 -15
  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 +2 -0
  12. data/lib/webmock/http_lib_adapters/curb_adapter.rb +2 -0
  13. data/lib/webmock/http_lib_adapters/em_http_request_adapter.rb +14 -6
  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 +2 -0
  18. data/lib/webmock/http_lib_adapters/http_rb/request.rb +3 -1
  19. data/lib/webmock/http_lib_adapters/http_rb/response.rb +2 -0
  20. data/lib/webmock/http_lib_adapters/http_rb/streamer.rb +2 -0
  21. data/lib/webmock/http_lib_adapters/http_rb/webmock.rb +2 -0
  22. data/lib/webmock/http_lib_adapters/http_rb_adapter.rb +2 -0
  23. data/lib/webmock/http_lib_adapters/httpclient_adapter.rb +2 -0
  24. data/lib/webmock/http_lib_adapters/manticore_adapter.rb +2 -0
  25. data/lib/webmock/http_lib_adapters/net_http.rb +2 -0
  26. data/lib/webmock/http_lib_adapters/net_http_response.rb +2 -0
  27. data/lib/webmock/http_lib_adapters/patron_adapter.rb +2 -0
  28. data/lib/webmock/http_lib_adapters/typhoeus_hydra_adapter.rb +2 -0
  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 +2 -0
  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 +3 -1
  38. data/lib/webmock/request_registry.rb +2 -0
  39. data/lib/webmock/request_signature.rb +2 -0
  40. data/lib/webmock/request_signature_snippet.rb +2 -0
  41. data/lib/webmock/request_stub.rb +7 -1
  42. data/lib/webmock/response.rb +2 -0
  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 +22 -8
  55. data/lib/webmock/util/json.rb +2 -0
  56. data/lib/webmock/util/query_mapper.rb +2 -0
  57. data/lib/webmock/util/uri.rb +3 -1
  58. data/lib/webmock/util/values_stringifier.rb +2 -0
  59. data/lib/webmock/util/version_checker.rb +7 -5
  60. data/lib/webmock/version.rb +3 -1
  61. data/lib/webmock/webmock.rb +2 -0
  62. data/lib/webmock.rb +2 -0
  63. metadata +36 -168
  64. data/.gemtest +0 -0
  65. data/.github/workflows/CI.yml +0 -38
  66. data/.gitignore +0 -34
  67. data/.rspec-tm +0 -2
  68. data/Gemfile +0 -9
  69. data/Rakefile +0 -38
  70. data/minitest/test_helper.rb +0 -34
  71. data/minitest/test_webmock.rb +0 -9
  72. data/minitest/webmock_spec.rb +0 -60
  73. data/spec/acceptance/async_http_client/async_http_client_spec.rb +0 -375
  74. data/spec/acceptance/async_http_client/async_http_client_spec_helper.rb +0 -73
  75. data/spec/acceptance/curb/curb_spec.rb +0 -510
  76. data/spec/acceptance/curb/curb_spec_helper.rb +0 -147
  77. data/spec/acceptance/em_http_request/em_http_request_spec.rb +0 -462
  78. data/spec/acceptance/em_http_request/em_http_request_spec_helper.rb +0 -77
  79. data/spec/acceptance/excon/excon_spec.rb +0 -77
  80. data/spec/acceptance/excon/excon_spec_helper.rb +0 -52
  81. data/spec/acceptance/http_rb/http_rb_spec.rb +0 -93
  82. data/spec/acceptance/http_rb/http_rb_spec_helper.rb +0 -54
  83. data/spec/acceptance/httpclient/httpclient_spec.rb +0 -217
  84. data/spec/acceptance/httpclient/httpclient_spec_helper.rb +0 -57
  85. data/spec/acceptance/manticore/manticore_spec.rb +0 -107
  86. data/spec/acceptance/manticore/manticore_spec_helper.rb +0 -35
  87. data/spec/acceptance/net_http/net_http_shared.rb +0 -190
  88. data/spec/acceptance/net_http/net_http_spec.rb +0 -395
  89. data/spec/acceptance/net_http/net_http_spec_helper.rb +0 -64
  90. data/spec/acceptance/net_http/real_net_http_spec.rb +0 -20
  91. data/spec/acceptance/patron/patron_spec.rb +0 -123
  92. data/spec/acceptance/patron/patron_spec_helper.rb +0 -54
  93. data/spec/acceptance/shared/allowing_and_disabling_net_connect.rb +0 -313
  94. data/spec/acceptance/shared/callbacks.rb +0 -148
  95. data/spec/acceptance/shared/complex_cross_concern_behaviors.rb +0 -36
  96. data/spec/acceptance/shared/enabling_and_disabling_webmock.rb +0 -95
  97. data/spec/acceptance/shared/precedence_of_stubs.rb +0 -15
  98. data/spec/acceptance/shared/request_expectations.rb +0 -930
  99. data/spec/acceptance/shared/returning_declared_responses.rb +0 -409
  100. data/spec/acceptance/shared/stubbing_requests.rb +0 -678
  101. data/spec/acceptance/typhoeus/typhoeus_hydra_spec.rb +0 -135
  102. data/spec/acceptance/typhoeus/typhoeus_hydra_spec_helper.rb +0 -60
  103. data/spec/acceptance/webmock_shared.rb +0 -41
  104. data/spec/fixtures/test.txt +0 -1
  105. data/spec/quality_spec.rb +0 -84
  106. data/spec/spec_helper.rb +0 -48
  107. data/spec/support/example_curl_output.txt +0 -22
  108. data/spec/support/failures.rb +0 -9
  109. data/spec/support/my_rack_app.rb +0 -53
  110. data/spec/support/network_connection.rb +0 -19
  111. data/spec/support/webmock_server.rb +0 -70
  112. data/spec/unit/api_spec.rb +0 -175
  113. data/spec/unit/errors_spec.rb +0 -129
  114. data/spec/unit/http_lib_adapters/http_lib_adapter_registry_spec.rb +0 -17
  115. data/spec/unit/http_lib_adapters/http_lib_adapter_spec.rb +0 -12
  116. data/spec/unit/matchers/hash_excluding_matcher_spec.rb +0 -61
  117. data/spec/unit/matchers/hash_including_matcher_spec.rb +0 -87
  118. data/spec/unit/rack_response_spec.rb +0 -112
  119. data/spec/unit/request_body_diff_spec.rb +0 -90
  120. data/spec/unit/request_execution_verifier_spec.rb +0 -208
  121. data/spec/unit/request_pattern_spec.rb +0 -748
  122. data/spec/unit/request_registry_spec.rb +0 -95
  123. data/spec/unit/request_signature_snippet_spec.rb +0 -89
  124. data/spec/unit/request_signature_spec.rb +0 -175
  125. data/spec/unit/request_stub_spec.rb +0 -234
  126. data/spec/unit/response_spec.rb +0 -314
  127. data/spec/unit/stub_registry_spec.rb +0 -103
  128. data/spec/unit/stub_request_snippet_spec.rb +0 -115
  129. data/spec/unit/util/hash_counter_spec.rb +0 -39
  130. data/spec/unit/util/hash_keys_stringifier_spec.rb +0 -27
  131. data/spec/unit/util/headers_spec.rb +0 -28
  132. data/spec/unit/util/json_spec.rb +0 -33
  133. data/spec/unit/util/query_mapper_spec.rb +0 -157
  134. data/spec/unit/util/uri_spec.rb +0 -371
  135. data/spec/unit/util/version_checker_spec.rb +0 -65
  136. data/spec/unit/webmock_spec.rb +0 -114
  137. data/test/http_request.rb +0 -24
  138. data/test/shared_test.rb +0 -108
  139. data/test/test_helper.rb +0 -23
  140. data/test/test_webmock.rb +0 -12
  141. data/webmock.gemspec +0 -54
@@ -1,510 +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
- it "supports headers containing the ':' character" do
387
- stub_request(:get, "www.example.com").with(headers: {'Referer'=>'http://www.example.com'}).to_return(body: "abc")
388
-
389
- c = Curl::Easy.new
390
- c.url = "http://www.example.com"
391
- c.headers = ["Referer: http://www.example.com"]
392
- c.http(:GET)
393
- expect(c.body).to eq("abc")
394
- expect(c.headers).to eq(["Referer: http://www.example.com"])
395
- end
396
-
397
- describe 'match request body' do
398
- it 'for post' do
399
- stub_request(:post, "www.example.com").with(body: 'foo=nhe').to_return(body: "abc")
400
-
401
- response = Curl.post("http://www.example.com", {foo: :nhe})
402
- expect(response.body_str).to eq("abc")
403
- end
404
-
405
- it 'for patch' do
406
- stub_request(:patch, "www.example.com").with(body: 'foo=nhe').to_return(body: "abc")
407
-
408
- response = Curl.patch("http://www.example.com", {foo: :nhe})
409
- expect(response.body_str).to eq("abc")
410
- end
411
-
412
- it 'for put' do
413
- stub_request(:put, "www.example.com").with(body: 'foo=nhe').to_return(body: "abc")
414
-
415
- response = Curl.put("http://www.example.com", {foo: :nhe})
416
- expect(response.body_str).to eq("abc")
417
- end
418
- end
419
- end
420
-
421
- describe "using #http_* methods for requests" do
422
- it_should_behave_like "Curb"
423
- include CurbSpecHelper::NamedHttp
424
-
425
- it "should reset @webmock_method after each call" do
426
- stub_request(:post, "www.example.com").with(body: "01234")
427
- c = Curl::Easy.new
428
- c.url = "http://www.example.com"
429
- c.post_body = "01234"
430
- c.http_post
431
- expect {
432
- c.perform
433
- }.to raise_error(WebMock::NetConnectNotAllowedError, %r(Real HTTP connections are disabled. Unregistered request: GET http://www.example.com))
434
- end
435
-
436
- it "should work with blank arguments for post" do
437
- stub_request(:post, "www.example.com").with(body: "01234")
438
- c = Curl::Easy.new
439
- c.url = "http://www.example.com"
440
- c.post_body = "01234"
441
- c.http_post
442
- expect(c.response_code).to eq(200)
443
- end
444
-
445
- it "should work with several body arguments for post using the class method" do
446
- stub_request(:post, "www.example.com").with(body: {user: {first_name: 'Bartosz', last_name: 'Blimke'}})
447
- c = Curl::Easy.http_post "http://www.example.com", 'user[first_name]=Bartosz', 'user[last_name]=Blimke'
448
- expect(c.response_code).to eq(200)
449
- end
450
-
451
- it "should work with blank arguments for put" do
452
- stub_request(:put, "www.example.com").with(body: "01234")
453
- c = Curl::Easy.new
454
- c.url = "http://www.example.com"
455
- c.put_data = "01234"
456
- c.http_put
457
- expect(c.response_code).to eq(200)
458
- end
459
-
460
- it "should work with multiple arguments for post" do
461
- data = { name: "john", address: "111 example ave" }
462
-
463
- stub_request(:post, "www.example.com").with(body: data)
464
- c = Curl::Easy.new
465
- c.url = "http://www.example.com"
466
- c.http_post Curl::PostField.content('name', data[:name]), Curl::PostField.content('address', data[:address])
467
-
468
- expect(c.response_code).to eq(200)
469
- end
470
-
471
- end
472
-
473
- describe "using #perform for requests" do
474
- it_should_behave_like "Curb"
475
- include CurbSpecHelper::Perform
476
- end
477
-
478
- describe "using .http_* methods for requests" do
479
- it_should_behave_like "Curb"
480
- include CurbSpecHelper::ClassNamedHttp
481
- end
482
-
483
- describe "using .perform for requests" do
484
- it_should_behave_like "Curb"
485
- include CurbSpecHelper::ClassPerform
486
- end
487
-
488
- describe "using #reset" do
489
- before do
490
- @curl = Curl::Easy.new
491
- @curl.url = "http://example.com"
492
- stub_request(:any, "example.com").
493
- to_return(body: "abc",
494
- headers: { "Content-Type" => "application/json" })
495
- @curl.http_get
496
- end
497
-
498
- it "should clear all memoized response fields" do
499
- @curl.reset
500
- expect(@curl).to have_attributes(
501
- body_str: nil,
502
- content_type: nil,
503
- header_str: nil,
504
- last_effective_url: nil,
505
- response_code: 0,
506
- )
507
- end
508
- end
509
- end
510
- 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