webmock 3.7.1

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 +7 -0
  2. data/.gemtest +0 -0
  3. data/.gitignore +34 -0
  4. data/.rspec-tm +2 -0
  5. data/.travis.yml +19 -0
  6. data/CHANGELOG.md +1698 -0
  7. data/Gemfile +9 -0
  8. data/LICENSE +20 -0
  9. data/README.md +1125 -0
  10. data/Rakefile +28 -0
  11. data/lib/webmock.rb +59 -0
  12. data/lib/webmock/api.rb +109 -0
  13. data/lib/webmock/assertion_failure.rb +11 -0
  14. data/lib/webmock/callback_registry.rb +35 -0
  15. data/lib/webmock/config.rb +18 -0
  16. data/lib/webmock/cucumber.rb +10 -0
  17. data/lib/webmock/deprecation.rb +9 -0
  18. data/lib/webmock/errors.rb +17 -0
  19. data/lib/webmock/http_lib_adapters/async_http_client_adapter.rb +214 -0
  20. data/lib/webmock/http_lib_adapters/curb_adapter.rb +347 -0
  21. data/lib/webmock/http_lib_adapters/em_http_request_adapter.rb +228 -0
  22. data/lib/webmock/http_lib_adapters/excon_adapter.rb +162 -0
  23. data/lib/webmock/http_lib_adapters/http_lib_adapter.rb +7 -0
  24. data/lib/webmock/http_lib_adapters/http_lib_adapter_registry.rb +19 -0
  25. data/lib/webmock/http_lib_adapters/http_rb/client.rb +14 -0
  26. data/lib/webmock/http_lib_adapters/http_rb/request.rb +16 -0
  27. data/lib/webmock/http_lib_adapters/http_rb/response.rb +43 -0
  28. data/lib/webmock/http_lib_adapters/http_rb/streamer.rb +29 -0
  29. data/lib/webmock/http_lib_adapters/http_rb/webmock.rb +68 -0
  30. data/lib/webmock/http_lib_adapters/http_rb_adapter.rb +37 -0
  31. data/lib/webmock/http_lib_adapters/httpclient_adapter.rb +242 -0
  32. data/lib/webmock/http_lib_adapters/manticore_adapter.rb +130 -0
  33. data/lib/webmock/http_lib_adapters/net_http.rb +361 -0
  34. data/lib/webmock/http_lib_adapters/net_http_response.rb +34 -0
  35. data/lib/webmock/http_lib_adapters/patron_adapter.rb +130 -0
  36. data/lib/webmock/http_lib_adapters/typhoeus_hydra_adapter.rb +174 -0
  37. data/lib/webmock/matchers/any_arg_matcher.rb +13 -0
  38. data/lib/webmock/matchers/hash_argument_matcher.rb +21 -0
  39. data/lib/webmock/matchers/hash_excluding_matcher.rb +15 -0
  40. data/lib/webmock/matchers/hash_including_matcher.rb +17 -0
  41. data/lib/webmock/minitest.rb +41 -0
  42. data/lib/webmock/rack_response.rb +69 -0
  43. data/lib/webmock/request_body_diff.rb +64 -0
  44. data/lib/webmock/request_execution_verifier.rb +77 -0
  45. data/lib/webmock/request_pattern.rb +370 -0
  46. data/lib/webmock/request_registry.rb +35 -0
  47. data/lib/webmock/request_signature.rb +54 -0
  48. data/lib/webmock/request_signature_snippet.rb +61 -0
  49. data/lib/webmock/request_stub.rb +100 -0
  50. data/lib/webmock/response.rb +153 -0
  51. data/lib/webmock/responses_sequence.rb +40 -0
  52. data/lib/webmock/rspec.rb +41 -0
  53. data/lib/webmock/rspec/matchers.rb +27 -0
  54. data/lib/webmock/rspec/matchers/request_pattern_matcher.rb +78 -0
  55. data/lib/webmock/rspec/matchers/webmock_matcher.rb +67 -0
  56. data/lib/webmock/stub_registry.rb +67 -0
  57. data/lib/webmock/stub_request_snippet.rb +38 -0
  58. data/lib/webmock/test_unit.rb +22 -0
  59. data/lib/webmock/util/hash_counter.rb +39 -0
  60. data/lib/webmock/util/hash_keys_stringifier.rb +25 -0
  61. data/lib/webmock/util/hash_validator.rb +17 -0
  62. data/lib/webmock/util/headers.rb +64 -0
  63. data/lib/webmock/util/json.rb +67 -0
  64. data/lib/webmock/util/query_mapper.rb +281 -0
  65. data/lib/webmock/util/uri.rb +110 -0
  66. data/lib/webmock/util/values_stringifier.rb +20 -0
  67. data/lib/webmock/util/version_checker.rb +111 -0
  68. data/lib/webmock/version.rb +3 -0
  69. data/lib/webmock/webmock.rb +161 -0
  70. data/minitest/test_helper.rb +34 -0
  71. data/minitest/test_webmock.rb +9 -0
  72. data/minitest/webmock_spec.rb +60 -0
  73. data/spec/acceptance/async_http_client/async_http_client_spec.rb +349 -0
  74. data/spec/acceptance/async_http_client/async_http_client_spec_helper.rb +73 -0
  75. data/spec/acceptance/curb/curb_spec.rb +492 -0
  76. data/spec/acceptance/curb/curb_spec_helper.rb +147 -0
  77. data/spec/acceptance/em_http_request/em_http_request_spec.rb +406 -0
  78. data/spec/acceptance/em_http_request/em_http_request_spec_helper.rb +77 -0
  79. data/spec/acceptance/excon/excon_spec.rb +77 -0
  80. data/spec/acceptance/excon/excon_spec_helper.rb +50 -0
  81. data/spec/acceptance/http_rb/http_rb_spec.rb +82 -0
  82. data/spec/acceptance/http_rb/http_rb_spec_helper.rb +54 -0
  83. data/spec/acceptance/httpclient/httpclient_spec.rb +217 -0
  84. data/spec/acceptance/httpclient/httpclient_spec_helper.rb +57 -0
  85. data/spec/acceptance/manticore/manticore_spec.rb +56 -0
  86. data/spec/acceptance/manticore/manticore_spec_helper.rb +35 -0
  87. data/spec/acceptance/net_http/net_http_shared.rb +153 -0
  88. data/spec/acceptance/net_http/net_http_spec.rb +331 -0
  89. data/spec/acceptance/net_http/net_http_spec_helper.rb +64 -0
  90. data/spec/acceptance/net_http/real_net_http_spec.rb +20 -0
  91. data/spec/acceptance/patron/patron_spec.rb +125 -0
  92. data/spec/acceptance/patron/patron_spec_helper.rb +54 -0
  93. data/spec/acceptance/shared/allowing_and_disabling_net_connect.rb +313 -0
  94. data/spec/acceptance/shared/callbacks.rb +148 -0
  95. data/spec/acceptance/shared/complex_cross_concern_behaviors.rb +36 -0
  96. data/spec/acceptance/shared/enabling_and_disabling_webmock.rb +95 -0
  97. data/spec/acceptance/shared/precedence_of_stubs.rb +15 -0
  98. data/spec/acceptance/shared/request_expectations.rb +930 -0
  99. data/spec/acceptance/shared/returning_declared_responses.rb +409 -0
  100. data/spec/acceptance/shared/stubbing_requests.rb +643 -0
  101. data/spec/acceptance/typhoeus/typhoeus_hydra_spec.rb +135 -0
  102. data/spec/acceptance/typhoeus/typhoeus_hydra_spec_helper.rb +60 -0
  103. data/spec/acceptance/webmock_shared.rb +41 -0
  104. data/spec/fixtures/test.txt +1 -0
  105. data/spec/quality_spec.rb +84 -0
  106. data/spec/spec_helper.rb +48 -0
  107. data/spec/support/example_curl_output.txt +22 -0
  108. data/spec/support/failures.rb +9 -0
  109. data/spec/support/my_rack_app.rb +53 -0
  110. data/spec/support/network_connection.rb +19 -0
  111. data/spec/support/webmock_server.rb +70 -0
  112. data/spec/unit/api_spec.rb +175 -0
  113. data/spec/unit/errors_spec.rb +129 -0
  114. data/spec/unit/http_lib_adapters/http_lib_adapter_registry_spec.rb +17 -0
  115. data/spec/unit/http_lib_adapters/http_lib_adapter_spec.rb +12 -0
  116. data/spec/unit/matchers/hash_excluding_matcher_spec.rb +61 -0
  117. data/spec/unit/matchers/hash_including_matcher_spec.rb +87 -0
  118. data/spec/unit/rack_response_spec.rb +112 -0
  119. data/spec/unit/request_body_diff_spec.rb +90 -0
  120. data/spec/unit/request_execution_verifier_spec.rb +208 -0
  121. data/spec/unit/request_pattern_spec.rb +601 -0
  122. data/spec/unit/request_registry_spec.rb +95 -0
  123. data/spec/unit/request_signature_snippet_spec.rb +89 -0
  124. data/spec/unit/request_signature_spec.rb +155 -0
  125. data/spec/unit/request_stub_spec.rb +199 -0
  126. data/spec/unit/response_spec.rb +282 -0
  127. data/spec/unit/stub_registry_spec.rb +103 -0
  128. data/spec/unit/stub_request_snippet_spec.rb +115 -0
  129. data/spec/unit/util/hash_counter_spec.rb +39 -0
  130. data/spec/unit/util/hash_keys_stringifier_spec.rb +27 -0
  131. data/spec/unit/util/headers_spec.rb +28 -0
  132. data/spec/unit/util/json_spec.rb +33 -0
  133. data/spec/unit/util/query_mapper_spec.rb +157 -0
  134. data/spec/unit/util/uri_spec.rb +361 -0
  135. data/spec/unit/util/version_checker_spec.rb +65 -0
  136. data/spec/unit/webmock_spec.rb +19 -0
  137. data/test/http_request.rb +24 -0
  138. data/test/shared_test.rb +108 -0
  139. data/test/test_helper.rb +23 -0
  140. data/test/test_webmock.rb +6 -0
  141. data/webmock.gemspec +45 -0
  142. metadata +496 -0
@@ -0,0 +1,73 @@
1
+ module AsyncHttpClientSpecHelper
2
+ def http_request(method, url, options = {}, &block)
3
+ endpoint = Async::HTTP::Endpoint.parse(url)
4
+
5
+ path = endpoint.path
6
+ path = path + "?" + options[:query] if options[:query]
7
+
8
+ headers = (options[:headers] || {}).each_with_object([]) do |(k, v), o|
9
+ Array(v).each do |v|
10
+ o.push [k, v]
11
+ end
12
+ end
13
+ headers.push(
14
+ ['authorization', 'Basic ' + Base64.strict_encode64(options[:basic_auth].join(':'))]
15
+ ) if options[:basic_auth]
16
+
17
+ body = options[:body]
18
+
19
+ Async do
20
+ begin
21
+ Async::HTTP::Client.open(endpoint) do |client|
22
+ response = client.send(
23
+ method,
24
+ path,
25
+ headers,
26
+ body
27
+ )
28
+
29
+ OpenStruct.new(
30
+ build_hash_response(response)
31
+ )
32
+ end
33
+ rescue Exception => e
34
+ e
35
+ end
36
+ end.wait
37
+ end
38
+
39
+ def client_timeout_exception_class
40
+ Async::TimeoutError
41
+ end
42
+
43
+ def connection_refused_exception_class
44
+ Errno::ECONNREFUSED
45
+ end
46
+
47
+ def http_library
48
+ :async_http_client
49
+ end
50
+
51
+ private
52
+
53
+ def build_hash_response(response)
54
+ {
55
+
56
+ status: response.status.to_s,
57
+ message: Protocol::HTTP1::Reason::DESCRIPTIONS[response.status],
58
+ headers: build_response_headers(response),
59
+ body: response.read
60
+ }
61
+ end
62
+
63
+ def build_response_headers(response)
64
+ response.headers.each.each_with_object({}) do |(k, v), o|
65
+ o[k] ||= []
66
+ o[k] << v
67
+ end.tap do |o|
68
+ o.each do |k, v|
69
+ o[k] = v.join(', ')
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,492 @@
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
+ body = "on_success fired"
482
+ stub_request(:any, "example.com").to_return(body: body)
483
+ @curl.http_get
484
+ end
485
+
486
+ it "should clear the body_str" do
487
+ @curl.reset
488
+ expect(@curl.body_str).to eq(nil)
489
+ end
490
+ end
491
+ end
492
+ end