webmock 3.14.0 → 3.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +213 -3
- data/README.md +66 -20
- data/lib/webmock/api.rb +2 -0
- data/lib/webmock/assertion_failure.rb +2 -0
- data/lib/webmock/callback_registry.rb +2 -0
- data/lib/webmock/config.rb +2 -0
- data/lib/webmock/cucumber.rb +2 -0
- data/lib/webmock/deprecation.rb +2 -0
- data/lib/webmock/errors.rb +2 -0
- data/lib/webmock/http_lib_adapters/async_http_client_adapter.rb +16 -4
- data/lib/webmock/http_lib_adapters/curb_adapter.rb +4 -2
- data/lib/webmock/http_lib_adapters/em_http_request_adapter.rb +17 -7
- data/lib/webmock/http_lib_adapters/excon_adapter.rb +2 -0
- data/lib/webmock/http_lib_adapters/http_lib_adapter.rb +2 -0
- data/lib/webmock/http_lib_adapters/http_lib_adapter_registry.rb +2 -0
- data/lib/webmock/http_lib_adapters/http_rb/client.rb +3 -3
- data/lib/webmock/http_lib_adapters/http_rb/request.rb +17 -5
- data/lib/webmock/http_lib_adapters/http_rb/response.rb +32 -9
- data/lib/webmock/http_lib_adapters/http_rb/streamer.rb +10 -2
- data/lib/webmock/http_lib_adapters/http_rb/webmock.rb +8 -2
- data/lib/webmock/http_lib_adapters/http_rb_adapter.rb +7 -5
- data/lib/webmock/http_lib_adapters/httpclient_adapter.rb +26 -25
- data/lib/webmock/http_lib_adapters/manticore_adapter.rb +2 -0
- data/lib/webmock/http_lib_adapters/net_http.rb +46 -121
- data/lib/webmock/http_lib_adapters/net_http_response.rb +2 -0
- data/lib/webmock/http_lib_adapters/patron_adapter.rb +3 -1
- data/lib/webmock/http_lib_adapters/typhoeus_hydra_adapter.rb +18 -2
- data/lib/webmock/matchers/any_arg_matcher.rb +2 -0
- data/lib/webmock/matchers/hash_argument_matcher.rb +2 -0
- data/lib/webmock/matchers/hash_excluding_matcher.rb +2 -0
- data/lib/webmock/matchers/hash_including_matcher.rb +2 -0
- data/lib/webmock/minitest.rb +2 -0
- data/lib/webmock/rack_response.rb +5 -1
- data/lib/webmock/request_body_diff.rb +2 -0
- data/lib/webmock/request_execution_verifier.rb +2 -0
- data/lib/webmock/request_pattern.rb +35 -12
- data/lib/webmock/request_registry.rb +2 -0
- data/lib/webmock/request_signature.rb +4 -2
- data/lib/webmock/request_signature_snippet.rb +2 -0
- data/lib/webmock/request_stub.rb +34 -0
- data/lib/webmock/response.rb +15 -13
- data/lib/webmock/responses_sequence.rb +2 -0
- data/lib/webmock/rspec/matchers/request_pattern_matcher.rb +2 -0
- data/lib/webmock/rspec/matchers/webmock_matcher.rb +2 -0
- data/lib/webmock/rspec/matchers.rb +2 -0
- data/lib/webmock/rspec.rb +2 -0
- data/lib/webmock/stub_registry.rb +2 -0
- data/lib/webmock/stub_request_snippet.rb +2 -0
- data/lib/webmock/test_unit.rb +2 -0
- data/lib/webmock/util/hash_counter.rb +12 -6
- data/lib/webmock/util/hash_keys_stringifier.rb +2 -0
- data/lib/webmock/util/hash_validator.rb +2 -0
- data/lib/webmock/util/headers.rb +23 -10
- data/lib/webmock/util/parsers/json.rb +72 -0
- data/lib/webmock/util/parsers/parse_error.rb +7 -0
- data/lib/webmock/util/parsers/xml.rb +16 -0
- data/lib/webmock/util/query_mapper.rb +2 -0
- data/lib/webmock/util/uri.rb +3 -1
- data/lib/webmock/util/values_stringifier.rb +2 -0
- data/lib/webmock/util/version_checker.rb +7 -5
- data/lib/webmock/version.rb +3 -1
- data/lib/webmock/webmock.rb +12 -0
- data/lib/webmock.rb +4 -2
- metadata +66 -185
- data/.gemtest +0 -0
- data/.github/workflows/CI.yml +0 -37
- data/.gitignore +0 -34
- data/.rspec-tm +0 -2
- data/Gemfile +0 -9
- data/Rakefile +0 -38
- data/lib/webmock/util/json.rb +0 -67
- data/minitest/test_helper.rb +0 -34
- data/minitest/test_webmock.rb +0 -9
- data/minitest/webmock_spec.rb +0 -60
- data/spec/acceptance/async_http_client/async_http_client_spec.rb +0 -375
- data/spec/acceptance/async_http_client/async_http_client_spec_helper.rb +0 -73
- data/spec/acceptance/curb/curb_spec.rb +0 -499
- data/spec/acceptance/curb/curb_spec_helper.rb +0 -147
- data/spec/acceptance/em_http_request/em_http_request_spec.rb +0 -462
- data/spec/acceptance/em_http_request/em_http_request_spec_helper.rb +0 -77
- data/spec/acceptance/excon/excon_spec.rb +0 -77
- data/spec/acceptance/excon/excon_spec_helper.rb +0 -52
- data/spec/acceptance/http_rb/http_rb_spec.rb +0 -93
- data/spec/acceptance/http_rb/http_rb_spec_helper.rb +0 -54
- data/spec/acceptance/httpclient/httpclient_spec.rb +0 -217
- data/spec/acceptance/httpclient/httpclient_spec_helper.rb +0 -57
- data/spec/acceptance/manticore/manticore_spec.rb +0 -107
- data/spec/acceptance/manticore/manticore_spec_helper.rb +0 -35
- data/spec/acceptance/net_http/net_http_shared.rb +0 -153
- data/spec/acceptance/net_http/net_http_spec.rb +0 -369
- data/spec/acceptance/net_http/net_http_spec_helper.rb +0 -64
- data/spec/acceptance/net_http/real_net_http_spec.rb +0 -20
- data/spec/acceptance/patron/patron_spec.rb +0 -125
- data/spec/acceptance/patron/patron_spec_helper.rb +0 -54
- data/spec/acceptance/shared/allowing_and_disabling_net_connect.rb +0 -313
- data/spec/acceptance/shared/callbacks.rb +0 -148
- data/spec/acceptance/shared/complex_cross_concern_behaviors.rb +0 -36
- data/spec/acceptance/shared/enabling_and_disabling_webmock.rb +0 -95
- data/spec/acceptance/shared/precedence_of_stubs.rb +0 -15
- data/spec/acceptance/shared/request_expectations.rb +0 -930
- data/spec/acceptance/shared/returning_declared_responses.rb +0 -409
- data/spec/acceptance/shared/stubbing_requests.rb +0 -678
- data/spec/acceptance/typhoeus/typhoeus_hydra_spec.rb +0 -135
- data/spec/acceptance/typhoeus/typhoeus_hydra_spec_helper.rb +0 -60
- data/spec/acceptance/webmock_shared.rb +0 -41
- data/spec/fixtures/test.txt +0 -1
- data/spec/quality_spec.rb +0 -84
- data/spec/spec_helper.rb +0 -48
- data/spec/support/example_curl_output.txt +0 -22
- data/spec/support/failures.rb +0 -9
- data/spec/support/my_rack_app.rb +0 -53
- data/spec/support/network_connection.rb +0 -19
- data/spec/support/webmock_server.rb +0 -70
- data/spec/unit/api_spec.rb +0 -175
- data/spec/unit/errors_spec.rb +0 -129
- data/spec/unit/http_lib_adapters/http_lib_adapter_registry_spec.rb +0 -17
- data/spec/unit/http_lib_adapters/http_lib_adapter_spec.rb +0 -12
- data/spec/unit/matchers/hash_excluding_matcher_spec.rb +0 -61
- data/spec/unit/matchers/hash_including_matcher_spec.rb +0 -87
- data/spec/unit/rack_response_spec.rb +0 -112
- data/spec/unit/request_body_diff_spec.rb +0 -90
- data/spec/unit/request_execution_verifier_spec.rb +0 -208
- data/spec/unit/request_pattern_spec.rb +0 -736
- data/spec/unit/request_registry_spec.rb +0 -95
- data/spec/unit/request_signature_snippet_spec.rb +0 -89
- data/spec/unit/request_signature_spec.rb +0 -155
- data/spec/unit/request_stub_spec.rb +0 -199
- data/spec/unit/response_spec.rb +0 -286
- data/spec/unit/stub_registry_spec.rb +0 -103
- data/spec/unit/stub_request_snippet_spec.rb +0 -115
- data/spec/unit/util/hash_counter_spec.rb +0 -39
- data/spec/unit/util/hash_keys_stringifier_spec.rb +0 -27
- data/spec/unit/util/headers_spec.rb +0 -28
- data/spec/unit/util/json_spec.rb +0 -33
- data/spec/unit/util/query_mapper_spec.rb +0 -157
- data/spec/unit/util/uri_spec.rb +0 -371
- data/spec/unit/util/version_checker_spec.rb +0 -65
- data/spec/unit/webmock_spec.rb +0 -60
- data/test/http_request.rb +0 -24
- data/test/shared_test.rb +0 -108
- data/test/test_helper.rb +0 -23
- data/test/test_webmock.rb +0 -12
- data/webmock.gemspec +0 -54
@@ -1,499 +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 reset @webmock_method after each call" 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 {
|
421
|
-
c.perform
|
422
|
-
}.to raise_error(WebMock::NetConnectNotAllowedError, %r(Real HTTP connections are disabled. Unregistered request: GET http://www.example.com))
|
423
|
-
end
|
424
|
-
|
425
|
-
it "should work with blank arguments for post" 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(c.response_code).to eq(200)
|
432
|
-
end
|
433
|
-
|
434
|
-
it "should work with several body arguments for post using the class method" do
|
435
|
-
stub_request(:post, "www.example.com").with(body: {user: {first_name: 'Bartosz', last_name: 'Blimke'}})
|
436
|
-
c = Curl::Easy.http_post "http://www.example.com", 'user[first_name]=Bartosz', 'user[last_name]=Blimke'
|
437
|
-
expect(c.response_code).to eq(200)
|
438
|
-
end
|
439
|
-
|
440
|
-
it "should work with blank arguments for put" do
|
441
|
-
stub_request(:put, "www.example.com").with(body: "01234")
|
442
|
-
c = Curl::Easy.new
|
443
|
-
c.url = "http://www.example.com"
|
444
|
-
c.put_data = "01234"
|
445
|
-
c.http_put
|
446
|
-
expect(c.response_code).to eq(200)
|
447
|
-
end
|
448
|
-
|
449
|
-
it "should work with multiple arguments for post" do
|
450
|
-
data = { name: "john", address: "111 example ave" }
|
451
|
-
|
452
|
-
stub_request(:post, "www.example.com").with(body: data)
|
453
|
-
c = Curl::Easy.new
|
454
|
-
c.url = "http://www.example.com"
|
455
|
-
c.http_post Curl::PostField.content('name', data[:name]), Curl::PostField.content('address', data[:address])
|
456
|
-
|
457
|
-
expect(c.response_code).to eq(200)
|
458
|
-
end
|
459
|
-
|
460
|
-
end
|
461
|
-
|
462
|
-
describe "using #perform for requests" do
|
463
|
-
it_should_behave_like "Curb"
|
464
|
-
include CurbSpecHelper::Perform
|
465
|
-
end
|
466
|
-
|
467
|
-
describe "using .http_* methods for requests" do
|
468
|
-
it_should_behave_like "Curb"
|
469
|
-
include CurbSpecHelper::ClassNamedHttp
|
470
|
-
end
|
471
|
-
|
472
|
-
describe "using .perform for requests" do
|
473
|
-
it_should_behave_like "Curb"
|
474
|
-
include CurbSpecHelper::ClassPerform
|
475
|
-
end
|
476
|
-
|
477
|
-
describe "using #reset" do
|
478
|
-
before do
|
479
|
-
@curl = Curl::Easy.new
|
480
|
-
@curl.url = "http://example.com"
|
481
|
-
stub_request(:any, "example.com").
|
482
|
-
to_return(body: "abc",
|
483
|
-
headers: { "Content-Type" => "application/json" })
|
484
|
-
@curl.http_get
|
485
|
-
end
|
486
|
-
|
487
|
-
it "should clear all memoized response fields" do
|
488
|
-
@curl.reset
|
489
|
-
expect(@curl).to have_attributes(
|
490
|
-
body_str: nil,
|
491
|
-
content_type: nil,
|
492
|
-
header_str: nil,
|
493
|
-
last_effective_url: nil,
|
494
|
-
response_code: 0,
|
495
|
-
)
|
496
|
-
end
|
497
|
-
end
|
498
|
-
end
|
499
|
-
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
|