webmock 3.7.6 → 3.9.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
2
  SHA256:
3
- metadata.gz: 337947555c0257e2a9eb31d5af91db7a2540ad489fd27dc31ad3409e14a9b028
4
- data.tar.gz: bd7cde5d8e0c7226e1c9a38303dee583ac2e974658373215b7c11396579adef2
3
+ metadata.gz: 603d6344674ad0d4b41e3b9fb2523d0d629f781873e0b5ac6dc72331ce30139a
4
+ data.tar.gz: 034c21429d7b11336d59485f198abb0b61f3dce89ec59c2298bb81d1f8cd987e
5
5
  SHA512:
6
- metadata.gz: e94e7cd1f009c514204c4642ce13df9eb338fcd0cadea61347f02550606680c1605ea00b03c6453d34c89b407987b02d1b3a01c6ae9bc26ec56aec8103726999
7
- data.tar.gz: 0fc2817995308a59726a703c3ab221e9aa7ee10b35909a637dfe9620c5c185d06ea5327f86234e6578568d94e7ca566df112601eb27f762d258c183b10c67dbc
6
+ metadata.gz: e4a36fc1d613f0187c361d4d1fed3a3c2f082496839b1af649a752916fa9e1285a8261aec34fe25a236a35d930782a5b6cd62de919481e99198390b65407577d
7
+ data.tar.gz: c3b93eaaa8f3a513e54d90f179ced6b48f08805232060ebd2cf41407bdd2f000d5cd8a01e584237bb634ad0ca5a00607d000ec7c257b51ebdbe96790937cc7ae
@@ -1,21 +1,24 @@
1
1
  before_install:
2
- - gem update --system
3
- - gem update bundler
2
+ - gem update --system -N
4
3
  rvm:
5
- - 2.3.8
6
- - 2.4.6
7
4
  - 2.5.5
8
5
  - 2.6.3
9
- - 2.6.3
10
- - 2.7.0-preview1
6
+ - 2.7.0
11
7
  - rbx-2
12
8
  - ruby-head
13
- - jruby-9.1.17.0
14
- - jruby-9.2.7.0
15
- - jruby-head
16
- jdk: openjdk8
17
9
  matrix:
10
+ include:
11
+ - rvm: jruby-9.1.17.0
12
+ jdk: openjdk8
13
+ - rvm: jruby-9.2.11.1
14
+ jdk: openjdk11
15
+ - rvm: jruby-head
16
+ jdk: openjdk11
18
17
  allow_failures:
19
18
  - rvm: jruby-head
20
19
  - rvm: ruby-head
21
20
  - rvm: rbx-2
21
+ env:
22
+ global:
23
+ JRUBY_OPTS: "--debug"
24
+
@@ -1,5 +1,69 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.9.0
4
+
5
+ * Allow using a "callable" (like a proc) as URI pattern
6
+
7
+ stub_request(:any, ->(uri) { true })
8
+
9
+ Thanks to [John Hawthorn](https://github.com/jhawthorn)
10
+
11
+ * Added stubbed IO on stubbed socket in Net::HTTP adapter.
12
+
13
+ Thanks to [Thilo Rusche](https://github.com/trusche)
14
+
15
+ * When 'webmock/rspec' is required, reset WebMock after all after(:each/example) hooks
16
+
17
+ Thanks to [Andrew Stuntz](https://github.com/drews256)
18
+
19
+ * Fixed `net_connect_allowed?` when invoked with no arguments, when there were any allowed URIs passed to `disable_net_connect?`.
20
+
21
+ Thanks to [Lucas Uyezu](https://github.com/lucasuyezu)
22
+
23
+ * Fixed async-http adapter which caused Async::HTTP::Client or Async::HTTP::Internet to hang and never return a response.
24
+
25
+ Thanks to (Bruno Sutic)[https://github.com/bruno-] and [Samuel Williams](https://github.com/ioquatix)
26
+
27
+ * Fixed warning when using async-http adapter
28
+
29
+ Thanks to (Bruno Sutic)[https://github.com/bruno-]
30
+
31
+ * Dropped support for Ruby 2.3 - EOL date: 2019-03-31
32
+
33
+ * Dropped support for Ruby 2.4 - EOL date: 2020-03-31
34
+
35
+ * Handling matching of Addressable::Template patterns that have an ip address without port and patterns that have ip address and don’t have schema and path.
36
+
37
+ Thanks to (Rafael França)[https://github.com/rafaelfranca] and (guppy0356)[https://github.com/guppy0356]
38
+
39
+ ## 3.8.3
40
+
41
+ * Fixed problem introduced in version 3.4.2, which caused matching against Addressable::Template representing host part of the URI to raise an error.
42
+
43
+ Thanks to [Vesa Laakso](https://github.com/valscion)
44
+
45
+ ## 3.8.2
46
+
47
+ * Support correct encoding parameter for HTTP.rb 2.x and earlier
48
+
49
+ Thanks to [Alex Coomans](https://github.com/drcapulet)
50
+
51
+ ## 3.8.1
52
+
53
+ * Added support for mocking non-ASCII bodies when making requests with HTTP.rb
54
+
55
+ Thanks to [Patrik Ragnarsson](https://github.com/dentarg)
56
+
57
+ ## 3.8.0
58
+
59
+ * Fixed options handling when initialising Async::HTTP::Client
60
+
61
+ Thanks to [Samuel Williams](https://github.com/ioquatix)
62
+
63
+ * Ruby 2.7 support.
64
+
65
+ Thanks to [Ryan Davis](https://github.com/zenspider) and [Brandur](https://github.com/brandur)
66
+
3
67
  ## 3.7.6
4
68
 
5
69
  * Suppressed keyword argument warnings in Ruby 2.7 in async-http adapter.
data/README.md CHANGED
@@ -38,9 +38,6 @@ Supported HTTP libraries
38
38
  Supported Ruby Interpreters
39
39
  ---------------------------
40
40
 
41
- * MRI 2.2
42
- * MRI 2.3
43
- * MRI 2.4
44
41
  * MRI 2.5
45
42
  * MRI 2.6
46
43
  * MRI 2.7
@@ -243,6 +240,12 @@ stub_request(:any, /example/)
243
240
  Net::HTTP.get('www.example.com', '/') # ===> Success
244
241
  ```
245
242
 
243
+ ### Matching uris using lambda
244
+
245
+ ```ruby
246
+ stub_request(:any, ->(uri) { true })
247
+ ```
248
+
246
249
  ### Matching uris using RFC 6570 - Basic Example
247
250
 
248
251
  ```ruby
@@ -300,6 +303,12 @@ stub_request(:any, "www.example.com").
300
303
  Net::HTTP.get("www.example.com", '/') # ===> "abc"
301
304
  ```
302
305
 
306
+ Set appropriate Content-Type for HTTParty's `parsed_response`.
307
+
308
+ ```ruby
309
+ stub_request(:any, "www.example.com").to_return body: '{}', headers: {content_type: 'application/json'}
310
+ ```
311
+
303
312
  ### Response with body specified as IO object
304
313
 
305
314
  ```ruby
@@ -1115,6 +1124,18 @@ People who submitted patches and new features or suggested improvements. Many th
1115
1124
  * Orien Madgwick
1116
1125
  * Andrei Sidorov
1117
1126
  * Marco Costa
1127
+ * Ryan Davis
1128
+ * Brandur
1129
+ * Samuel Williams
1130
+ * Patrik Ragnarsson
1131
+ * Alex Coomans
1132
+ * Vesa Laakso
1133
+ * John Hawthorn
1134
+ * guppy0356
1135
+ * Thilo Rusche
1136
+ * Andrew Stuntz
1137
+ * Lucas Uyezu
1138
+ * Bruno Sutic
1118
1139
 
1119
1140
  For a full list of contributors you can visit the
1120
1141
  [contributors](https://github.com/bblimke/webmock/contributors) page.
@@ -36,7 +36,7 @@ if defined?(Async::HTTP)
36
36
  protocol = endpoint.protocol,
37
37
  scheme = endpoint.scheme,
38
38
  authority = endpoint.authority,
39
- options = {}
39
+ **options
40
40
  )
41
41
  webmock_endpoint = WebMockEndpoint.new(scheme, authority, protocol)
42
42
 
@@ -136,7 +136,7 @@ if defined?(Async::HTTP)
136
136
 
137
137
  def connect
138
138
  server_socket, client_socket = create_connected_sockets
139
- Async do
139
+ Async(transient: true) do
140
140
  accept_socket(server_socket)
141
141
  end
142
142
  client_socket
@@ -151,7 +151,7 @@ if defined?(Async::HTTP)
151
151
  def create_connected_sockets
152
152
  Async::IO::Socket.pair(Socket::AF_UNIX, Socket::SOCK_STREAM).tap do |sockets|
153
153
  sockets.each do |socket|
154
- socket.instance_variable_set :@alpn_protocol, @alpn_protocol
154
+ socket.instance_variable_set :@alpn_protocol, nil
155
155
  socket.instance_eval do
156
156
  def alpn_protocol
157
157
  nil # means HTTP11 will be used for HTTPS
@@ -14,9 +14,19 @@ module HTTP
14
14
  def from_webmock(webmock_response, request_signature = nil)
15
15
  status = Status.new(webmock_response.status.first)
16
16
  headers = webmock_response.headers || {}
17
- body = Body.new Streamer.new webmock_response.body
18
17
  uri = normalize_uri(request_signature && request_signature.uri)
19
18
 
19
+ # HTTP.rb 3.0+ uses a keyword argument to pass the encoding, but 1.x
20
+ # and 2.x use a positional argument, and 0.x don't support supplying
21
+ # the encoding.
22
+ body = if HTTP::VERSION < "1.0.0"
23
+ Body.new(Streamer.new(webmock_response.body))
24
+ elsif HTTP::VERSION < "3.0.0"
25
+ Body.new(Streamer.new(webmock_response.body), webmock_response.body.encoding)
26
+ else
27
+ Body.new(Streamer.new(webmock_response.body), encoding: webmock_response.body.encoding)
28
+ end
29
+
20
30
  return new(status, "1.1", headers, body, uri) if HTTP::VERSION < "1.0.0"
21
31
 
22
32
  new({
@@ -228,9 +228,9 @@ class PatchedStringIO < StringIO #:nodoc:
228
228
 
229
229
  alias_method :orig_read_nonblock, :read_nonblock
230
230
 
231
- def read_nonblock(size, *args)
231
+ def read_nonblock(size, *args, **kwargs)
232
232
  args.reject! {|arg| !arg.is_a?(Hash)}
233
- orig_read_nonblock(size, *args)
233
+ orig_read_nonblock(size, *args, **kwargs)
234
234
  end
235
235
 
236
236
  end
@@ -252,12 +252,19 @@ class StubSocket #:nodoc:
252
252
  def readuntil(*args)
253
253
  end
254
254
 
255
+ def io
256
+ @io ||= StubIO.new
257
+ end
258
+
259
+ class StubIO
260
+ def setsockopt(*args); end
261
+ end
255
262
  end
256
263
 
257
264
  module Net #:nodoc: all
258
265
 
259
266
  class WebMockNetBufferedIO < BufferedIO
260
- def initialize(io, *args)
267
+ def initialize(io, *args, **kwargs)
261
268
  io = case io
262
269
  when Socket, OpenSSL::SSL::SSLSocket, IO
263
270
  io
@@ -268,23 +275,33 @@ module Net #:nodoc: all
268
275
  end
269
276
  raise "Unable to create local socket" unless io
270
277
 
271
- super
278
+ # Prior to 2.4.0 `BufferedIO` only takes a single argument (`io`) with no
279
+ # options. Here we pass through our full set of arguments only if we're
280
+ # on 2.4.0 or later, and use a simplified invocation otherwise.
281
+ if RUBY_VERSION >= '2.4.0'
282
+ super
283
+ else
284
+ super(io)
285
+ end
272
286
  end
273
287
 
274
288
  if RUBY_VERSION >= '2.6.0'
289
+ # https://github.com/ruby/ruby/blob/7d02441f0d6e5c9d0a73a024519eba4f69e36dce/lib/net/protocol.rb#L208
290
+ # Modified version of method from ruby, so that nil is always passed into orig_read_nonblock to avoid timeout
275
291
  def rbuf_fill
276
- current_thread_id = Thread.current.object_id
277
-
278
- trace = TracePoint.trace(:line) do |tp|
279
- next unless Thread.current.object_id == current_thread_id
280
- if tp.binding.local_variable_defined?(:tmp)
281
- tp.binding.local_variable_set(:tmp, nil)
282
- end
283
- end
284
-
285
- super
286
- ensure
287
- trace.disable
292
+ case rv = @io.read_nonblock(BUFSIZE, nil, exception: false)
293
+ when String
294
+ return if rv.nil?
295
+ @rbuf << rv
296
+ rv.clear
297
+ return
298
+ when :wait_readable
299
+ @io.to_io.wait_readable(@read_timeout) or raise Net::ReadTimeout
300
+ when :wait_writable
301
+ @io.to_io.wait_writable(@read_timeout) or raise Net::ReadTimeout
302
+ when nil
303
+ raise EOFError, 'end of file reached'
304
+ end while true
288
305
  end
289
306
  end
290
307
  end
@@ -80,6 +80,8 @@ module WebMock
80
80
  URIRegexpPattern.new(uri)
81
81
  elsif uri.is_a?(Addressable::Template)
82
82
  URIAddressablePattern.new(uri)
83
+ elsif uri.respond_to?(:call)
84
+ URICallablePattern.new(uri)
83
85
  else
84
86
  URIStringPattern.new(uri)
85
87
  end
@@ -108,10 +110,10 @@ module WebMock
108
110
 
109
111
  def initialize(pattern)
110
112
  @pattern = case pattern
111
- when Addressable::URI, Addressable::Template
112
- pattern
113
+ when String
114
+ WebMock::Util::URI.normalize_uri(pattern)
113
115
  else
114
- WebMock::Util::URI.normalize_uri(pattern)
116
+ pattern
115
117
  end
116
118
  @query_params = nil
117
119
  end
@@ -131,38 +133,44 @@ module WebMock
131
133
  end
132
134
  end
133
135
 
136
+ def matches?(uri)
137
+ pattern_matches?(uri) && query_params_matches?(uri)
138
+ end
139
+
134
140
  def to_s
135
- str = @pattern.inspect
141
+ str = pattern_inspect
136
142
  str += " with query params #{@query_params.inspect}" if @query_params
137
143
  str
138
144
  end
139
- end
140
145
 
141
- class URIRegexpPattern < URIPattern
142
- def matches?(uri)
143
- WebMock::Util::URI.variations_of_uri_as_strings(uri).any? { |u| u.match(@pattern) } &&
144
- (@query_params.nil? || @query_params == WebMock::Util::QueryMapper.query_to_values(uri.query, notation: Config.instance.query_values_notation))
146
+ private
147
+
148
+ def pattern_inspect
149
+ @pattern.inspect
145
150
  end
146
151
 
147
- def to_s
148
- str = @pattern.inspect
149
- str += " with query params #{@query_params.inspect}" if @query_params
150
- str
152
+ def query_params_matches?(uri)
153
+ @query_params.nil? || @query_params == WebMock::Util::QueryMapper.query_to_values(uri.query, notation: Config.instance.query_values_notation)
151
154
  end
152
155
  end
153
156
 
154
- class URIAddressablePattern < URIPattern
155
- def matches?(uri)
156
- if @query_params.nil?
157
- # Let Addressable check the whole URI
158
- matches_with_variations?(uri)
159
- else
160
- # WebMock checks the query, Addressable checks everything else
161
- matches_with_variations?(uri.omit(:query)) &&
162
- @query_params == WebMock::Util::QueryMapper.query_to_values(uri.query)
163
- end
157
+ class URICallablePattern < URIPattern
158
+ private
159
+
160
+ def pattern_matches?(uri)
161
+ @pattern.call(uri)
164
162
  end
163
+ end
165
164
 
165
+ class URIRegexpPattern < URIPattern
166
+ private
167
+
168
+ def pattern_matches?(uri)
169
+ WebMock::Util::URI.variations_of_uri_as_strings(uri).any? { |u| u.match(@pattern) }
170
+ end
171
+ end
172
+
173
+ class URIAddressablePattern < URIPattern
166
174
  def add_query_params(query_params)
167
175
  @@add_query_params_warned ||= false
168
176
  if not @@add_query_params_warned
@@ -172,27 +180,57 @@ module WebMock
172
180
  super(query_params)
173
181
  end
174
182
 
175
- def to_s
176
- str = @pattern.pattern.inspect
177
- str += " with variables #{@pattern.variables.inspect}" if @pattern.variables
178
- str
183
+ private
184
+
185
+ def pattern_matches?(uri)
186
+ if @query_params.nil?
187
+ # Let Addressable check the whole URI
188
+ matches_with_variations?(uri)
189
+ else
190
+ # WebMock checks the query, Addressable checks everything else
191
+ matches_with_variations?(uri.omit(:query))
192
+ end
179
193
  end
180
194
 
181
- private
195
+ def pattern_inspect
196
+ @pattern.pattern.inspect
197
+ end
182
198
 
183
199
  def matches_with_variations?(uri)
184
- normalized_template = Addressable::Template.new(WebMock::Util::URI.heuristic_parse(@pattern.pattern))
200
+ template =
201
+ begin
202
+ Addressable::Template.new(WebMock::Util::URI.heuristic_parse(@pattern.pattern))
203
+ rescue Addressable::URI::InvalidURIError
204
+ Addressable::Template.new(@pattern.pattern)
205
+ end
206
+ WebMock::Util::URI.variations_of_uri_as_strings(uri).any? { |u|
207
+ template_matches_uri?(template, u)
208
+ }
209
+ end
185
210
 
186
- WebMock::Util::URI.variations_of_uri_as_strings(uri).any? { |u| normalized_template.match(u) }
211
+ def template_matches_uri?(template, uri)
212
+ template.match(uri)
213
+ rescue Addressable::URI::InvalidURIError
214
+ false
187
215
  end
188
216
  end
189
217
 
190
218
  class URIStringPattern < URIPattern
191
- def matches?(uri)
219
+ def add_query_params(query_params)
220
+ super
221
+ if @query_params.is_a?(Hash) || @query_params.is_a?(String)
222
+ query_hash = (WebMock::Util::QueryMapper.query_to_values(@pattern.query, notation: Config.instance.query_values_notation) || {}).merge(@query_params)
223
+ @pattern.query = WebMock::Util::QueryMapper.values_to_query(query_hash, notation: WebMock::Config.instance.query_values_notation)
224
+ @query_params = nil
225
+ end
226
+ end
227
+
228
+ private
229
+
230
+ def pattern_matches?(uri)
192
231
  if @pattern.is_a?(Addressable::URI)
193
232
  if @query_params
194
- uri.omit(:query) === @pattern &&
195
- (@query_params.nil? || @query_params == WebMock::Util::QueryMapper.query_to_values(uri.query, notation: Config.instance.query_values_notation))
233
+ uri.omit(:query) === @pattern
196
234
  else
197
235
  uri === @pattern
198
236
  end
@@ -201,19 +239,8 @@ module WebMock
201
239
  end
202
240
  end
203
241
 
204
- def add_query_params(query_params)
205
- super
206
- if @query_params.is_a?(Hash) || @query_params.is_a?(String)
207
- query_hash = (WebMock::Util::QueryMapper.query_to_values(@pattern.query, notation: Config.instance.query_values_notation) || {}).merge(@query_params)
208
- @pattern.query = WebMock::Util::QueryMapper.values_to_query(query_hash, notation: WebMock::Config.instance.query_values_notation)
209
- @query_params = nil
210
- end
211
- end
212
-
213
- def to_s
214
- str = WebMock::Util::URI.strip_default_port_from_uri_string(@pattern.to_s)
215
- str += " with query params #{@query_params.inspect}" if @query_params
216
- str
242
+ def pattern_inspect
243
+ WebMock::Util::URI.strip_default_port_from_uri_string(@pattern.to_s)
217
244
  end
218
245
  end
219
246
 
@@ -33,7 +33,8 @@ RSPEC_CONFIGURER.configure { |config|
33
33
  WebMock.disable!
34
34
  end
35
35
 
36
- config.after(:each) do
36
+ config.around(:each) do |example|
37
+ example.run
37
38
  WebMock.reset!
38
39
  end
39
40
  }
@@ -24,7 +24,7 @@ module WebMock
24
24
  # doesn't run immediately after stub.with.
25
25
  responses = {}
26
26
 
27
- stub = ::WebMock::RequestStub.new(:any, /.*/).with { |request|
27
+ stub = ::WebMock::RequestStub.new(:any, ->(uri) { true }).with { |request|
28
28
  responses[request.object_id] = yield(request)
29
29
  }.to_return(lambda { |request| responses.delete(request.object_id) })
30
30
 
@@ -1,3 +1,3 @@
1
1
  module WebMock
2
- VERSION = '3.7.6' unless defined?(::WebMock::VERSION)
2
+ VERSION = '3.9.0' unless defined?(::WebMock::VERSION)
3
3
  end
@@ -59,11 +59,13 @@ module WebMock
59
59
  end
60
60
 
61
61
  def self.net_connect_allowed?(uri = nil)
62
+ return !!Config.instance.allow_net_connect if uri.nil?
63
+
62
64
  if uri.is_a?(String)
63
65
  uri = WebMock::Util::URI.normalize_uri(uri)
64
66
  end
65
67
 
66
- Config.instance.allow_net_connect ||
68
+ !!Config.instance.allow_net_connect ||
67
69
  ( Config.instance.allow_localhost && WebMock::Util::URI.is_uri_localhost?(uri) ||
68
70
  Config.instance.allow && net_connect_explicit_allowed?(Config.instance.allow, uri) )
69
71
  end
@@ -136,6 +136,8 @@ unless RUBY_PLATFORM =~ /java/
136
136
  end
137
137
 
138
138
  context 'scheme and protocol' do
139
+ let(:default_response_headers) { {} }
140
+
139
141
  before do
140
142
  stub_request(
141
143
  :get, "#{scheme}://www.example.com"
@@ -152,7 +154,7 @@ unless RUBY_PLATFORM =~ /java/
152
154
  specify do
153
155
  expect(subject).to eq(
154
156
  status: 200,
155
- headers: {},
157
+ headers: default_response_headers,
156
158
  body: 'BODY'
157
159
  )
158
160
  end
@@ -169,6 +171,7 @@ unless RUBY_PLATFORM =~ /java/
169
171
 
170
172
  context 'HTTP10 protocol' do
171
173
  let(:protocol) { Async::HTTP::Protocol::HTTP10 }
174
+ let(:default_response_headers) { {"connection"=>["keep-alive"]} }
172
175
 
173
176
  include_examples :common
174
177
  end
@@ -197,6 +200,7 @@ unless RUBY_PLATFORM =~ /java/
197
200
 
198
201
  context 'HTTP10 protocol' do
199
202
  let(:protocol) { Async::HTTP::Protocol::HTTP10 }
203
+ let(:default_response_headers) { {"connection"=>["keep-alive"]} }
200
204
 
201
205
  include_examples :common
202
206
  end
@@ -74,13 +74,13 @@ describe "HTTP.rb" do
74
74
  context "streamer" do
75
75
  it "can be read to a provided buffer" do
76
76
  stub_request(:get, "example.com/foo")
77
- .to_return(status: 200, body: "Hello world!")
77
+ .to_return(status: 200, body: "Hello world!")
78
78
  response = HTTP.get "http://example.com/foo"
79
79
 
80
80
  buffer = ""
81
81
  response.body.readpartial(1024, buffer)
82
82
 
83
- expect(buffer).to eq "Hello world!"
83
+ expect(buffer).to eq "Hello world!"
84
84
  end
85
85
 
86
86
  it "can be closed" do
@@ -201,6 +201,18 @@ describe "Net:HTTP" do
201
201
  expect(Net::HTTP.get_response(Addressable::URI.parse('http://www.example.com/hello?a=1')).body).to eq("abc")
202
202
  end
203
203
 
204
+ it "should support method calls on stubbed socket" do
205
+ WebMock.allow_net_connect!
206
+ stub_request(:get, 'www.google.com')#.with(headers: {"My-Header" => 99})
207
+ req = Net::HTTP::Get.new('/')
208
+ Net::HTTP.start('www.google.com') do |http|
209
+ http.request(req, '')
210
+ socket = http.instance_variable_get(:@socket)
211
+ expect(socket).to be_a(StubSocket)
212
+ expect { socket.io.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) }.to_not raise_error
213
+ end
214
+ end
215
+
204
216
  describe "connecting on Net::HTTP.start" do
205
217
  before(:each) do
206
218
  @http = Net::HTTP.new('www.google.com', 443)
@@ -640,4 +640,22 @@ shared_examples_for "stubbing requests" do |*adapter_info|
640
640
  }.to raise_error(WebMock::NetConnectNotAllowedError, %r(Real HTTP connections are disabled. Unregistered request: GET http://www.example.com/))
641
641
  end
642
642
  end
643
+
644
+ describe "in Rspec around(:each) hook" do
645
+ # order goes
646
+ # around(:each)
647
+ # before(:each)
648
+ # after(:each)
649
+ # anything after example.run in around(:each)
650
+ around(:each) do |example|
651
+ example.run
652
+ expect {
653
+ http_request(:get, "http://www.example.com/")
654
+ }.to_not raise_error # WebMock::NetConnectNotAllowedError
655
+ end
656
+
657
+ it "should still allow me to make a mocked request" do
658
+ stub_request(:get, "www.example.com")
659
+ end
660
+ end
643
661
  end
@@ -111,6 +111,16 @@ describe WebMock::RequestPattern do
111
111
  to match(WebMock::RequestSignature.new(:get, "www.example.com"))
112
112
  end
113
113
 
114
+ it "should match if uri proc pattern returning true" do
115
+ expect(WebMock::RequestPattern.new(:get, ->(uri) { true })).
116
+ to match(WebMock::RequestSignature.new(:get, "www.example.com"))
117
+ end
118
+
119
+ it "should not match if uri proc pattern returns false" do
120
+ expect(WebMock::RequestPattern.new(:get, ->(uri) { false })).
121
+ not_to match(WebMock::RequestSignature.new(:get, "www.example.com"))
122
+ end
123
+
114
124
  it "should match if uri Addressable::Template pattern matches unescaped form of request uri" do
115
125
  expect(WebMock::RequestPattern.new(:get, Addressable::Template.new("www.example.com/{any_path}"))).
116
126
  to match(WebMock::RequestSignature.new(:get, "www.example.com/my%20path"))
@@ -132,6 +142,30 @@ describe WebMock::RequestPattern do
132
142
  expect(WebMock::RequestPattern.new(:get, uri)).to match(signature)
133
143
  end
134
144
 
145
+ it "should match if Addressable::Template pattern that has ip address host without port matches request uri" do
146
+ signature = WebMock::RequestSignature.new(:get, "127.0.0.1/1234")
147
+ uri = Addressable::Template.new("127.0.0.1/{id}")
148
+ expect(WebMock::RequestPattern.new(:get, uri)).to match(signature)
149
+ end
150
+
151
+ it "should match if Addressable::Template pattern host matches request uri" do
152
+ signature = WebMock::RequestSignature.new(:get, "www.example.com")
153
+ uri = Addressable::Template.new("{subdomain}.example.com")
154
+ expect(WebMock::RequestPattern.new(:get, uri)).to match(signature)
155
+ end
156
+
157
+ it "should not match if Addressable::Template pattern host does not match request uri" do
158
+ signature = WebMock::RequestSignature.new(:get, "www.bad-example.com")
159
+ uri = Addressable::Template.new("{subdomain}.example.com")
160
+ expect(WebMock::RequestPattern.new(:get, uri)).not_to match(signature)
161
+ end
162
+
163
+ it "should match if uri Addressable::Template pattern matches request uri without a schema and a path " do
164
+ signature = WebMock::RequestSignature.new(:get, "127.0.0.1:3000")
165
+ uri = Addressable::Template.new("127.0.0.1:3000")
166
+ expect(WebMock::RequestPattern.new(:get, uri)).to match(signature)
167
+ end
168
+
135
169
  it "should match for uris with same parameters as pattern" do
136
170
  expect(WebMock::RequestPattern.new(:get, "www.example.com?a=1&b=2")).
137
171
  to match(WebMock::RequestSignature.new(:get, "www.example.com?a=1&b=2"))
@@ -229,6 +263,42 @@ describe WebMock::RequestPattern do
229
263
  end
230
264
  end
231
265
 
266
+ describe "when uri is described as a proc" do
267
+ it "should match request query params" do
268
+ expect(WebMock::RequestPattern.new(:get, ->(uri) { true }, query: {"a" => ["b", "c"]})).
269
+ to match(WebMock::RequestSignature.new(:get, "www.example.com?a[]=b&a[]=c"))
270
+ end
271
+
272
+ it "should match request query params if params don't match" do
273
+ expect(WebMock::RequestPattern.new(:get, ->(uri) { true }, query: {"x" => ["b", "c"]})).
274
+ not_to match(WebMock::RequestSignature.new(:get, "www.example.com?a[]=b&a[]=c"))
275
+ end
276
+
277
+ it "should match when query params are declared as HashIncluding matcher matching params" do
278
+ expect(WebMock::RequestPattern.new(:get, ->(uri) { true },
279
+ query: WebMock::Matchers::HashIncludingMatcher.new({"a" => ["b", "c"]}))).
280
+ to match(WebMock::RequestSignature.new(:get, "www.example.com?a[]=b&a[]=c&b=1"))
281
+ end
282
+
283
+ it "should not match when query params are declared as HashIncluding matcher not matching params" do
284
+ expect(WebMock::RequestPattern.new(:get, ->(uri) { true },
285
+ query: WebMock::Matchers::HashIncludingMatcher.new({"x" => ["b", "c"]}))).
286
+ not_to match(WebMock::RequestSignature.new(:get, "www.example.com?a[]=b&a[]=c&b=1"))
287
+ end
288
+
289
+ it "should match when query params are declared as RSpec HashIncluding matcher matching params" do
290
+ expect(WebMock::RequestPattern.new(:get, ->(uri) { true },
291
+ query: RSpec::Mocks::ArgumentMatchers::HashIncludingMatcher.new({"a" => ["b", "c"]}))).
292
+ to match(WebMock::RequestSignature.new(:get, "www.example.com?a[]=b&a[]=c&b=1"))
293
+ end
294
+
295
+ it "should not match when query params are declared as RSpec HashIncluding matcher not matching params" do
296
+ expect(WebMock::RequestPattern.new(:get, ->(uri) { true },
297
+ query: RSpec::Mocks::ArgumentMatchers::HashIncludingMatcher.new({"a" => ["b", "d"]}))).
298
+ not_to match(WebMock::RequestSignature.new(:get, "www.example.com?a[]=b&a[]=c&b=1"))
299
+ end
300
+ end
301
+
232
302
  describe "when uri is described as Addressable::Template" do
233
303
  it "should raise error if query params are specified" do
234
304
  expect(WebMock::RequestPattern.new(:get, Addressable::Template.new("www.example.com"), query: {"a" => ["b", "c"]})).
@@ -1,19 +1,60 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "WebMock version" do
4
- it "should report version" do
5
- expect(WebMock.version).to eq(WebMock::VERSION)
6
- end
3
+ describe "WebMock" do
7
4
 
8
- it "should not require safe_yaml" do
9
- expect(defined?SafeYAML).to eq(nil)
10
- end
5
+ describe ".version" do
6
+ it "should report version" do
7
+ expect(WebMock.version).to eq(WebMock::VERSION)
8
+ end
9
+
10
+ it "should not require safe_yaml" do
11
+ expect(defined?SafeYAML).to eq(nil)
12
+ end
11
13
 
12
- it "should alias enable_net_connect! to allow_net_connect!" do
13
- expect(WebMock.method(:enable_net_connect!)).to eq(WebMock.method(:allow_net_connect!))
14
+ it "should alias enable_net_connect! to allow_net_connect!" do
15
+ expect(WebMock.method(:enable_net_connect!)).to eq(WebMock.method(:allow_net_connect!))
16
+ end
17
+
18
+ it "should alias disallow_net_connect! to disable_net_connect!" do
19
+ expect(WebMock.method(:disallow_net_connect!)).to eq(WebMock.method(:disable_net_connect!))
20
+ end
14
21
  end
15
22
 
16
- it "should alias disallow_net_connect! to disable_net_connect!" do
17
- expect(WebMock.method(:disallow_net_connect!)).to eq(WebMock.method(:disable_net_connect!))
23
+ describe ".net_connect_allowed?" do
24
+ context 'enabled globally' do
25
+ before do
26
+ WebMock.enable_net_connect!
27
+ end
28
+
29
+ context 'without arguments' do
30
+ it 'returns WebMock::Config.instance.allow_net_connect' do
31
+ expect(WebMock.net_connect_allowed?).to eql(true)
32
+ end
33
+ end
34
+ end
35
+
36
+ context 'disabled with allowed remote string' do
37
+ before do
38
+ WebMock.disable_net_connect!(allow: "http://192.168.64.2:20031")
39
+ end
40
+
41
+ context 'without arguments' do
42
+ it 'returns WebMock::Config.instance.allow_net_connect' do
43
+ expect(WebMock.net_connect_allowed?).to eql(false)
44
+ end
45
+ end
46
+ end
47
+
48
+ context 'disabled globally' do
49
+ before do
50
+ WebMock.disable_net_connect!
51
+ end
52
+
53
+ context 'without arguments' do
54
+ it 'returns WebMock::Config.instance.allow_net_connect' do
55
+ expect(WebMock.net_connect_allowed?).to eql(false)
56
+ end
57
+ end
58
+ end
18
59
  end
19
60
  end
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.7.6
4
+ version: 3.9.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: 2019-09-29 00:00:00.000000000 Z
11
+ date: 2020-09-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -407,9 +407,9 @@ licenses:
407
407
  - MIT
408
408
  metadata:
409
409
  bug_tracker_uri: https://github.com/bblimke/webmock/issues
410
- changelog_uri: https://github.com/bblimke/webmock/blob/v3.7.6/CHANGELOG.md
411
- documentation_uri: https://www.rubydoc.info/gems/webmock/3.7.6
412
- source_code_uri: https://github.com/bblimke/webmock/tree/v3.7.6
410
+ changelog_uri: https://github.com/bblimke/webmock/blob/v3.9.0/CHANGELOG.md
411
+ documentation_uri: https://www.rubydoc.info/gems/webmock/3.9.0
412
+ source_code_uri: https://github.com/bblimke/webmock/tree/v3.9.0
413
413
  wiki_uri: https://github.com/bblimke/webmock/wiki
414
414
  post_install_message:
415
415
  rdoc_options: []
@@ -426,7 +426,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
426
426
  - !ruby/object:Gem::Version
427
427
  version: '0'
428
428
  requirements: []
429
- rubygems_version: 3.0.3
429
+ rubygems_version: 3.1.2
430
430
  signing_key:
431
431
  specification_version: 4
432
432
  summary: Library for stubbing HTTP requests in Ruby.