webmock 3.3.0 → 3.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 9824be80903ce63b7e2f3a3b61c5924ba3d884ff
4
- data.tar.gz: 4666fd52ab43ddd61feabf9b53b565b332d56d17
2
+ SHA256:
3
+ metadata.gz: babd32444fb5057e9e1945acefbef6601b5b9e2c78a3670ff929a027b89529eb
4
+ data.tar.gz: 3016884b0119a6cf8e2685628744f661b7d0e0b59462b925b98598732d5cd1a7
5
5
  SHA512:
6
- metadata.gz: a9e1a7c45d9e2ae020ebb116edcd3d52b529df4a29495f0539f234738f34dff65d2e38c45de3a2361cb203be364c94d1e1eebd88ccbdaac27d0c0ed15e7f614c
7
- data.tar.gz: 421aca9b146365fa1f0c6425435620b290323e10230acdf39fe6b572fc3072aad7bca874243176b4cf03a39eb4ed239a3063b640f2abe3e7ebf9e6b15fb44785
6
+ metadata.gz: 15e986cdda0dc84d50d35e0e596e92ae18edac6d19c3dcf16930256fc518ddeecab5a5d7e0f5c404bf285f877627707872992547a35f4e4dee2fb31dc4af19f0
7
+ data.tar.gz: 3ac9e572b8785c1059c1c1388822854a7600cfc28017e48f6dbe2ee3934c29bab214f54b29cd73ee605e74abcac35a0d2dc7cb132bdc54bbfe6853f547626c55
@@ -1,10 +1,46 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.4.0
4
+
5
+ * Ruby 2.6 support. Prevent `Net/ReadTimeout` error in Ruby 2.6
6
+
7
+ Thanks to [Koichi ITO](https://github.com/koic)
8
+
9
+ * Handling query params, which represent nested hashes with keys starting with non word characters.
10
+
11
+ Thanks to [rapides](https://github.com/rapides) for reporting the issue.
12
+
13
+ * Patron adapter handles PATCH requests with body.
14
+
15
+ Thanks to [Mattia](https://github.com/iMacTia) for reporting the issue.
16
+
17
+ * Allowing requests with url encoded body to be matched by request stubs declared with hash body with non-string values.
18
+
19
+ stub_request(:post, "www.example.com").with(body: {"a" => 1, "b" => false})
20
+
21
+ RestClient.post('www.example.com', 'a=1&b=false', :content_type => 'application/x-www-form-urlencoded') # ===> Success
22
+
23
+ Thanks to [Kenny Ortmann](https://github.com/yairgo) for suggesting this feature.
24
+
25
+ * When request headers contain 'Accept'=>'application/json' and no registered stub matches the request, WebMock prints a suggested stub code with to_return body set to '{}'.
26
+
27
+ Thanks to [redbar0n](https://github.com/redbar0n)
28
+
29
+ * Improved suggested stub output when the request stub only contains headers declaration.
30
+
31
+ Thanks to [Olia Kremmyda](https://github.com/oliakremmyda)
32
+
33
+ * Fixed Curb adapter to handle `reset` method.
34
+
35
+ Thanks tp [dinhhuydh](https://github.com/dinhhuydh) for reporting the issue.
36
+ Thanks to [Olia Kremmyda](https://github.com/oliakremmyda) for fixing it.
37
+
38
+
3
39
  ## 3.3.0
4
40
 
5
41
  * Better formatting of outputted request stub snippets, displayed on failures due to unstubbed requests.
6
42
 
7
- Thanks to [Olia Kremmyda](https://github.com/Olia-Kremmyda)
43
+ Thanks to [Olia Kremmyda](https://github.com/oliakremmyda)
8
44
 
9
45
 
10
46
  ## 3.2.1
@@ -22,7 +58,7 @@
22
58
 
23
59
  * Fixed bug when handling redirection using Curb.
24
60
 
25
- Thanks to [Olia Kremmyda](https://github.com/Olia-Kremmyda)
61
+ Thanks to [Olia Kremmyda](https://github.com/oliakremmyda)
26
62
 
27
63
 
28
64
  ## 3.1.1
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  WebMock
2
2
  =======
3
- [![Gem Version](https://badge.fury.io/rb/webmock.svg)](http://badge.fury.io/rb/webmock) [![Build Status](https://secure.travis-ci.org/bblimke/webmock.svg?branch=master)](http://travis-ci.org/bblimke/webmock) [![Dependency Status](https://gemnasium.com/bblimke/webmock.svg)](http://gemnasium.com/bblimke/webmock) [![Code Climate](https://codeclimate.com/github/bblimke/webmock/badges/gpa.svg)](https://codeclimate.com/github/bblimke/webmock) [![Inline docs](http://inch-ci.org/github/bblimke/webmock.svg?branch=master)](http://inch-ci.org/github/bblimke/webmock)
3
+ [![Gem Version](https://badge.fury.io/rb/webmock.svg)](http://badge.fury.io/rb/webmock) [![Build Status](https://secure.travis-ci.org/bblimke/webmock.svg?branch=master)](http://travis-ci.org/bblimke/webmock) [![Dependency Status](https://gemnasium.com/bblimke/webmock.svg)](http://gemnasium.com/bblimke/webmock) [![Code Climate](https://codeclimate.com/github/bblimke/webmock/badges/gpa.svg)](https://codeclimate.com/github/bblimke/webmock) [![Mentioned in Awesome Ruby](https://awesome.re/mentioned-badge.svg)](https://github.com/markets/awesome-ruby) [![Inline docs](http://inch-ci.org/github/bblimke/webmock.svg?branch=master)](http://inch-ci.org/github/bblimke/webmock)
4
4
 
5
5
  Library for stubbing and setting expectations on HTTP requests in Ruby.
6
6
 
@@ -1053,7 +1053,8 @@ People who submitted patches and new features or suggested improvements. Many th
1053
1053
  * Olia Kremmyda
1054
1054
  * Michał Matyas
1055
1055
  * Matt Brictson
1056
- * Olia Kremmyda
1056
+ * Kenny Ortmann
1057
+ * redbar0n
1057
1058
 
1058
1059
  For a full list of contributors you can visit the
1059
1060
  [contributors](https://github.com/bblimke/webmock/contributors) page.
@@ -14,6 +14,7 @@ require 'webmock/util/uri'
14
14
  require 'webmock/util/headers'
15
15
  require 'webmock/util/hash_counter'
16
16
  require 'webmock/util/hash_keys_stringifier'
17
+ require 'webmock/util/values_stringifier'
17
18
  require 'webmock/util/json'
18
19
  require 'webmock/util/version_checker'
19
20
  require 'webmock/util/hash_validator'
@@ -332,6 +332,11 @@ if defined?(Curl)
332
332
  end
333
333
  METHOD
334
334
  end
335
+
336
+ def reset
337
+ instance_variable_set(:@body_str, nil)
338
+ super
339
+ end
335
340
  end
336
341
  end
337
342
  end
@@ -271,6 +271,20 @@ module Net #:nodoc: all
271
271
  end
272
272
  raise "Unable to create local socket" unless @io
273
273
  end
274
+
275
+ if RUBY_VERSION >= '2.6.0'
276
+ def rbuf_fill
277
+ trace = TracePoint.trace(:line) do |tp|
278
+ if tp.binding.local_variable_defined?(:tmp)
279
+ tp.binding.local_variable_set(:tmp, nil)
280
+ end
281
+ end
282
+
283
+ super
284
+
285
+ trace.disable
286
+ end
287
+ end
274
288
  end
275
289
 
276
290
  end
@@ -69,7 +69,7 @@ if defined?(::Patron)
69
69
  uri = WebMock::Util::URI.heuristic_parse(req.url)
70
70
  uri.path = uri.normalized_path.gsub("[^:]//","/")
71
71
 
72
- if [:put, :post].include?(req.action)
72
+ if [:put, :post, :patch].include?(req.action)
73
73
  if req.file_name
74
74
  if !File.exist?(req.file_name) || !File.readable?(req.file_name)
75
75
  raise ArgumentError.new("Unable to open specified file.")
@@ -243,7 +243,7 @@ module WebMock
243
243
 
244
244
  if (@pattern).is_a?(Hash)
245
245
  return true if @pattern.empty?
246
- matching_hashes?(body_as_hash(body, content_type), @pattern)
246
+ matching_body_hashes?(body_as_hash(body, content_type), @pattern, content_type)
247
247
  elsif (@pattern).is_a?(WebMock::Matchers::HashIncludingMatcher)
248
248
  @pattern == body_as_hash(body, content_type)
249
249
  else
@@ -298,15 +298,16 @@ module WebMock
298
298
  #
299
299
  # @return [Boolean] true if the paramaters match the comparison
300
300
  # hash, false if not.
301
- def matching_hashes?(query_parameters, pattern)
301
+ def matching_body_hashes?(query_parameters, pattern, content_type)
302
302
  return false unless query_parameters.is_a?(Hash)
303
303
  return false unless query_parameters.keys.sort == pattern.keys.sort
304
304
  query_parameters.each do |key, actual|
305
305
  expected = pattern[key]
306
306
 
307
307
  if actual.is_a?(Hash) && expected.is_a?(Hash)
308
- return false unless matching_hashes?(actual, expected)
308
+ return false unless matching_body_hashes?(actual, expected, content_type)
309
309
  else
310
+ expected = WebMock::Util::ValuesStringifier.stringify_values(expected) if url_encoded_body?(content_type)
310
311
  return false unless expected === actual
311
312
  end
312
313
  end
@@ -321,6 +322,9 @@ module WebMock
321
322
  Hash[WebMock::Util::HashKeysStringifier.stringify_keys!(hash, deep: true).sort]
322
323
  end
323
324
 
325
+ def url_encoded_body?(content_type)
326
+ content_type =~ %r{^application/x-www-form-urlencoded}
327
+ end
324
328
  end
325
329
 
326
330
  class HeadersPattern
@@ -20,13 +20,17 @@ module WebMock
20
20
  end
21
21
 
22
22
  if (request_pattern.headers_pattern)
23
- with << ",\n " unless with.empty?
23
+ with << "," unless with.empty?
24
24
 
25
- with << " headers: #{request_pattern.headers_pattern.pp_to_s}"
25
+ with << "\n headers: #{request_pattern.headers_pattern.pp_to_s}"
26
26
  end
27
27
  string << ".\n with(#{with})" unless with.empty?
28
28
  if with_response
29
- string << ".\n to_return(status: 200, body: \"\", headers: {})"
29
+ if request_pattern.headers_pattern && request_pattern.headers_pattern.matches?({ 'Accept' => "application/json" })
30
+ string << ".\n to_return(status: 200, body: \"{}\", headers: {})"
31
+ else
32
+ string << ".\n to_return(status: 200, body: \"\", headers: {})"
33
+ end
30
34
  end
31
35
  string
32
36
  end
@@ -2,7 +2,7 @@ require 'thread'
2
2
 
3
3
  module WebMock
4
4
  module Util
5
- class Util::HashCounter
5
+ class HashCounter
6
6
  attr_accessor :hash
7
7
  def initialize
8
8
  self.hash = {}
@@ -122,7 +122,7 @@ module WebMock::Util
122
122
 
123
123
  def fill_accumulator_for_subscript(accumulator, key, value)
124
124
  current_node = accumulator
125
- subkeys = key.split(/(?=\[\w)/)
125
+ subkeys = key.split(/(?=\[[^\[\]]+)/)
126
126
  subkeys[0..-2].each do |subkey|
127
127
  node = subkey =~ /\[\]\z/ ? [] : {}
128
128
  subkey = subkey.gsub(/[\[\]]/, '')
@@ -0,0 +1,20 @@
1
+ class WebMock::Util::ValuesStringifier
2
+ def self.stringify_values(value)
3
+ case value
4
+ when nil
5
+ value
6
+ when Hash
7
+ Hash[
8
+ value.map do |k, v|
9
+ [k, stringify_values(v)]
10
+ end
11
+ ]
12
+ when Array
13
+ value.map do |v|
14
+ stringify_values(v)
15
+ end
16
+ else
17
+ value.to_s
18
+ end
19
+ end
20
+ end
@@ -1,3 +1,3 @@
1
1
  module WebMock
2
- VERSION = '3.3.0' unless defined?(::WebMock::VERSION)
2
+ VERSION = '3.4.0' unless defined?(::WebMock::VERSION)
3
3
  end
@@ -462,5 +462,20 @@ unless RUBY_PLATFORM =~ /java/
462
462
  it_should_behave_like "Curb"
463
463
  include CurbSpecHelper::ClassPerform
464
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
465
480
  end
466
481
  end
@@ -19,6 +19,13 @@ unless RUBY_PLATFORM =~ /java/
19
19
  @sess.base_url = "http://www.example.com"
20
20
  end
21
21
 
22
+ it "should allow stubbing PATCH request with body" do
23
+ stub_request(:patch, "http://www.example.com/")
24
+ .with(body: "abc")
25
+
26
+ @sess.patch('/', "abc")
27
+ end
28
+
22
29
  describe "file requests" do
23
30
 
24
31
  before(:each) do
@@ -155,6 +155,24 @@ shared_examples_for "stubbing requests" do |*adapter_info|
155
155
  body: 'c[d][]=f&a=1&c[d][]=e')
156
156
  }.to raise_error(WebMock::NetConnectNotAllowedError, %r(Real HTTP connections are disabled. Unregistered request: POST http://www.example.com/ with body 'c\[d\]\[\]=f&a=1&c\[d\]\[\]=e'))
157
157
  end
158
+
159
+ describe "for request with form url encoded body and content type" do
160
+ it "should match if stubbed request body hash has string values matching string values in request body" do
161
+ WebMock.reset!
162
+ stub_request(:post, "www.example.com").with(body: {"foo" => '1'})
163
+ expect(http_request(
164
+ :post, "http://www.example.com/", headers: {'Content-Type' => 'application/x-www-form-urlencoded'},
165
+ body: "foo=1").status).to eq("200")
166
+ end
167
+
168
+ it "should match if stubbed request body hash has NON string values matching string values in request body" do
169
+ WebMock.reset!
170
+ stub_request(:post, "www.example.com").with(body: {"foo" => 1})
171
+ expect(http_request(
172
+ :post, "http://www.example.com/", headers: {'Content-Type' => 'application/x-www-form-urlencoded'},
173
+ body: "foo=1").status).to eq("200")
174
+ end
175
+ end
158
176
  end
159
177
 
160
178
 
@@ -187,6 +205,30 @@ shared_examples_for "stubbing requests" do |*adapter_info|
187
205
  :post, "http://www.example.com/", headers: {'Content-Type' => 'application/json'},
188
206
  body: "{\"foo\":\"a b c\"}").status).to eq("200")
189
207
  end
208
+
209
+ it "should match if stubbed request body hash has NON string values matching NON string values in request body" do
210
+ WebMock.reset!
211
+ stub_request(:post, "www.example.com").with(body: {"foo" => 1})
212
+ expect(http_request(
213
+ :post, "http://www.example.com/", headers: {'Content-Type' => 'application/json'},
214
+ body: "{\"foo\":1}").status).to eq("200")
215
+ end
216
+
217
+ it "should not match if stubbed request body hash has string values matching NON string values in request body" do
218
+ WebMock.reset!
219
+ stub_request(:post, "www.example.com").with(body: {"foo" => '1'})
220
+ expect{http_request(
221
+ :post, "http://www.example.com/", headers: {'Content-Type' => 'application/json'},
222
+ body: "{\"foo\":1}") }.to raise_error(WebMock::NetConnectNotAllowedError)
223
+ end
224
+
225
+ it "should not match if stubbed request body hash has NON string values matching string values in request body" do
226
+ WebMock.reset!
227
+ stub_request(:post, "www.example.com").with(body: {"foo" => 1})
228
+ expect{http_request(
229
+ :post, "http://www.example.com/", headers: {'Content-Type' => 'application/json'},
230
+ body: "{\"foo\":\"1\"}") }.to raise_error(WebMock::NetConnectNotAllowedError)
231
+ end
190
232
  end
191
233
 
192
234
  describe "for request with xml body and content type is set to xml" do
@@ -34,7 +34,7 @@ describe WebMock::StubRequestSnippet do
34
34
  it "should print stub request snippet with headers if any" do
35
35
  @request_signature.headers = {'B' => 'b', 'A' => 'a'}
36
36
  expected = 'stub_request(:get, "http://www.example.com/?a=b&c=d").'+
37
- "\n with( headers: {\n\t\ 'A\'=>\'a\',\n\t \'B\'=>\'b\'\n })." +
37
+ "\n with(\n headers: {\n\t\ 'A\'=>\'a\',\n\t \'B\'=>\'b\'\n })." +
38
38
  "\n to_return(status: 200, body: \"\", headers: {})"
39
39
  @request_stub = WebMock::RequestStub.from_request_signature(@request_signature)
40
40
  expect(WebMock::StubRequestSnippet.new(@request_stub).to_s).to eq(expected)
@@ -94,8 +94,22 @@ stub_request(:post, "http://www.example.com/").
94
94
  STUB
95
95
  expect(WebMock::StubRequestSnippet.new(@request_stub).to_s).to eq(expected.strip)
96
96
  end
97
- end
98
97
 
98
+ it "should print stub request snippet with valid JSON body when request header contains 'Accept'=>'application/json' " do
99
+ @request_signature = WebMock::RequestSignature.new(:post, "www.example.com",
100
+ headers: {'Accept' => 'application/json'})
101
+ @request_stub = WebMock::RequestStub.from_request_signature(@request_signature)
102
+ expected = <<-STUB
103
+ stub_request(:post, "http://www.example.com/").
104
+ with(
105
+ headers: {
106
+ \t 'Accept'=>'application/json'
107
+ }).
108
+ to_return(status: 200, body: \"{}\", headers: {})
109
+ STUB
110
+ expect(WebMock::StubRequestSnippet.new(@request_stub).to_s).to eq(expected.strip)
111
+ end
112
+ end
99
113
 
100
114
  end
101
115
  end
@@ -70,6 +70,12 @@ describe WebMock::Util::QueryMapper do
70
70
  hsh = subject.query_to_values(query)
71
71
  expect(hsh['a']).to eq('foo')
72
72
  end
73
+
74
+ it "should parse hash query with key starting with non word character" do
75
+ query = "a[$in]=1".freeze
76
+ hsh = subject.query_to_values(query)
77
+ expect(hsh).to eql({'a' => {'$in' => '1'}})
78
+ end
73
79
  end
74
80
 
75
81
  context '#to_query' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webmock
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0
4
+ version: 3.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bartosz Blimke
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-18 00:00:00.000000000 Z
11
+ date: 2018-04-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -305,6 +305,7 @@ files:
305
305
  - lib/webmock/util/json.rb
306
306
  - lib/webmock/util/query_mapper.rb
307
307
  - lib/webmock/util/uri.rb
308
+ - lib/webmock/util/values_stringifier.rb
308
309
  - lib/webmock/util/version_checker.rb
309
310
  - lib/webmock/version.rb
310
311
  - lib/webmock/webmock.rb
@@ -398,7 +399,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
398
399
  version: '0'
399
400
  requirements: []
400
401
  rubyforge_project: webmock
401
- rubygems_version: 2.6.13
402
+ rubygems_version: 2.7.6
402
403
  signing_key:
403
404
  specification_version: 4
404
405
  summary: Library for stubbing HTTP requests in Ruby.