faraday 0.9.1 → 0.17.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +212 -0
- data/LICENSE.md +1 -1
- data/README.md +203 -28
- data/Rakefile +6 -64
- data/lib/faraday/adapter/em_http.rb +17 -11
- data/lib/faraday/adapter/em_http_ssl_patch.rb +1 -1
- data/lib/faraday/adapter/em_synchrony.rb +19 -5
- data/lib/faraday/adapter/excon.rb +13 -11
- data/lib/faraday/adapter/httpclient.rb +31 -9
- data/lib/faraday/adapter/net_http.rb +36 -14
- data/lib/faraday/adapter/net_http_persistent.rb +37 -17
- data/lib/faraday/adapter/patron.rb +44 -21
- data/lib/faraday/adapter/rack.rb +1 -1
- data/lib/faraday/adapter/test.rb +79 -28
- data/lib/faraday/adapter/typhoeus.rb +4 -115
- data/lib/faraday/adapter.rb +10 -1
- data/lib/faraday/autoload.rb +1 -1
- data/lib/faraday/connection.rb +72 -20
- data/lib/faraday/deprecate.rb +107 -0
- data/lib/faraday/error.rb +132 -27
- data/lib/faraday/options.rb +45 -22
- data/lib/faraday/parameters.rb +56 -39
- data/lib/faraday/rack_builder.rb +29 -4
- data/lib/faraday/request/authorization.rb +1 -2
- data/lib/faraday/request/multipart.rb +7 -2
- data/lib/faraday/request/retry.rb +84 -19
- data/lib/faraday/request.rb +22 -0
- data/lib/faraday/response/logger.rb +29 -8
- data/lib/faraday/response/raise_error.rb +7 -3
- data/lib/faraday/response.rb +9 -5
- data/lib/faraday/utils.rb +32 -3
- data/lib/faraday.rb +15 -36
- data/spec/faraday/deprecate_spec.rb +69 -0
- data/spec/faraday/error_spec.rb +102 -0
- data/spec/faraday/response/raise_error_spec.rb +106 -0
- data/spec/spec_helper.rb +105 -0
- data/test/adapters/em_http_test.rb +10 -0
- data/test/adapters/em_synchrony_test.rb +22 -10
- data/test/adapters/excon_test.rb +10 -0
- data/test/adapters/httpclient_test.rb +14 -1
- data/test/adapters/integration.rb +17 -8
- data/test/adapters/logger_test.rb +65 -11
- data/test/adapters/net_http_persistent_test.rb +96 -2
- data/test/adapters/net_http_test.rb +67 -2
- data/test/adapters/patron_test.rb +28 -8
- data/test/adapters/rack_test.rb +8 -1
- data/test/adapters/test_middleware_test.rb +46 -3
- data/test/adapters/typhoeus_test.rb +19 -9
- data/test/composite_read_io_test.rb +16 -18
- data/test/connection_test.rb +294 -78
- data/test/env_test.rb +55 -5
- data/test/helper.rb +11 -17
- data/test/middleware/retry_test.rb +115 -10
- data/test/middleware_stack_test.rb +97 -10
- data/test/options_test.rb +97 -16
- data/test/parameters_test.rb +94 -1
- data/test/request_middleware_test.rb +24 -40
- data/test/response_middleware_test.rb +4 -4
- data/test/utils_test.rb +40 -0
- metadata +21 -66
- data/.document +0 -6
- data/CONTRIBUTING.md +0 -36
- data/Gemfile +0 -25
- data/faraday.gemspec +0 -34
- data/script/cached-bundle +0 -46
- data/script/console +0 -7
- data/script/generate_certs +0 -42
- data/script/package +0 -7
- data/script/proxy-server +0 -42
- data/script/release +0 -17
- data/script/s3-put +0 -71
- data/script/server +0 -36
- data/script/test +0 -172
data/test/env_test.rb
CHANGED
@@ -9,7 +9,7 @@ class EnvTest < Faraday::TestCase
|
|
9
9
|
@conn.options.timeout = 3
|
10
10
|
@conn.options.open_timeout = 5
|
11
11
|
@conn.ssl.verify = false
|
12
|
-
@conn.proxy 'http://proxy.com'
|
12
|
+
@conn.proxy = 'http://proxy.com'
|
13
13
|
end
|
14
14
|
|
15
15
|
def test_request_create_stores_method
|
@@ -24,6 +24,13 @@ class EnvTest < Faraday::TestCase
|
|
24
24
|
assert_equal 'http://sushi.com/api/foo.json?a=1', env.url.to_s
|
25
25
|
end
|
26
26
|
|
27
|
+
def test_request_create_stores_uri_with_anchor
|
28
|
+
env = make_env do |req|
|
29
|
+
req.url 'foo.json?b=2&a=1#qqq'
|
30
|
+
end
|
31
|
+
assert_equal 'http://sushi.com/api/foo.json?a=1&b=2', env.url.to_s
|
32
|
+
end
|
33
|
+
|
27
34
|
def test_request_create_stores_headers
|
28
35
|
env = make_env do |req|
|
29
36
|
req['Server'] = 'Faraday'
|
@@ -51,10 +58,16 @@ class EnvTest < Faraday::TestCase
|
|
51
58
|
req.options.timeout = 10
|
52
59
|
req.options.boundary = 'boo'
|
53
60
|
req.options.oauth[:consumer_secret] = 'xyz'
|
61
|
+
req.options.context = {
|
62
|
+
foo: 'foo',
|
63
|
+
bar: 'bar'
|
64
|
+
}
|
54
65
|
end
|
66
|
+
|
55
67
|
assert_equal 10, env.request.timeout
|
56
68
|
assert_equal 5, env.request.open_timeout
|
57
69
|
assert_equal 'boo', env.request.boundary
|
70
|
+
assert_equal env.request.context, { foo: 'foo', bar: 'bar' }
|
58
71
|
|
59
72
|
oauth_expected = {:consumer_secret => 'xyz', :consumer_key => 'anonymous'}
|
60
73
|
assert_equal oauth_expected, env.request.oauth
|
@@ -65,9 +78,15 @@ class EnvTest < Faraday::TestCase
|
|
65
78
|
assert_equal false, env.ssl.verify
|
66
79
|
end
|
67
80
|
|
68
|
-
def
|
81
|
+
def test_custom_members_are_retained
|
69
82
|
env = make_env
|
70
|
-
|
83
|
+
env[:foo] = "custom 1"
|
84
|
+
env[:bar] = :custom_2
|
85
|
+
env2 = Faraday::Env.from(env)
|
86
|
+
assert_equal "custom 1", env2[:foo]
|
87
|
+
assert_equal :custom_2, env2[:bar]
|
88
|
+
env2[:baz] = "custom 3"
|
89
|
+
assert_nil env[:baz]
|
71
90
|
end
|
72
91
|
|
73
92
|
private
|
@@ -124,7 +143,7 @@ class HeadersTest < Faraday::TestCase
|
|
124
143
|
assert_equal 'application/json', @headers.delete('content-type')
|
125
144
|
assert_equal 0, @headers.size
|
126
145
|
assert !@headers.include?('content-type')
|
127
|
-
|
146
|
+
assert_nil @headers.delete('content-type')
|
128
147
|
end
|
129
148
|
|
130
149
|
def test_parse_response_headers_leaves_http_status_line_out
|
@@ -174,6 +193,23 @@ class ResponseTest < Faraday::TestCase
|
|
174
193
|
assert_equal "YIKES", response.body
|
175
194
|
end
|
176
195
|
|
196
|
+
def test_response_body_is_available_during_on_complete
|
197
|
+
response = Faraday::Response.new
|
198
|
+
response.on_complete { |env| env[:body] = response.body.upcase }
|
199
|
+
response.finish(@env)
|
200
|
+
|
201
|
+
assert_equal "YIKES", response.body
|
202
|
+
end
|
203
|
+
|
204
|
+
def test_env_in_on_complete_is_identical_to_response_env
|
205
|
+
response = Faraday::Response.new
|
206
|
+
callback_env = nil
|
207
|
+
response.on_complete { |env| callback_env = env }
|
208
|
+
response.finish({})
|
209
|
+
|
210
|
+
assert_same response.env, callback_env
|
211
|
+
end
|
212
|
+
|
177
213
|
def test_not_success
|
178
214
|
assert !@response.success?
|
179
215
|
end
|
@@ -197,7 +233,7 @@ class ResponseTest < Faraday::TestCase
|
|
197
233
|
assert_equal :post, @response.env[:method]
|
198
234
|
end
|
199
235
|
|
200
|
-
def
|
236
|
+
def test_marshal_response
|
201
237
|
@response = Faraday::Response.new
|
202
238
|
@response.on_complete { }
|
203
239
|
@response.finish @env.merge(:params => 'moo')
|
@@ -207,6 +243,20 @@ class ResponseTest < Faraday::TestCase
|
|
207
243
|
assert_equal %w[body response_headers status], loaded.env.keys.map { |k| k.to_s }.sort
|
208
244
|
end
|
209
245
|
|
246
|
+
def test_marshal_request
|
247
|
+
@request = Faraday::Request.create(:post) do |request|
|
248
|
+
request.options = Faraday::RequestOptions.new
|
249
|
+
request.params = Faraday::Utils::ParamsHash.new({ 'a' => 'c' })
|
250
|
+
request.headers = { 'b' => 'd' }
|
251
|
+
request.body = 'hello, world!'
|
252
|
+
request.url 'http://localhost/foo'
|
253
|
+
end
|
254
|
+
|
255
|
+
loaded = Marshal.load(Marshal.dump(@request))
|
256
|
+
|
257
|
+
assert_equal @request, loaded
|
258
|
+
end
|
259
|
+
|
210
260
|
def test_hash
|
211
261
|
hash = @response.to_hash
|
212
262
|
assert_kind_of Hash, hash
|
data/test/helper.rb
CHANGED
@@ -1,27 +1,17 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'coveralls'
|
1
|
+
require 'simplecov'
|
2
|
+
require 'coveralls'
|
4
3
|
|
5
|
-
|
4
|
+
SimpleCov.formatters = [SimpleCov::Formatter::HTMLFormatter, Coveralls::SimpleCov::Formatter]
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
end
|
6
|
+
SimpleCov.start do
|
7
|
+
add_filter '/bundle/'
|
8
|
+
add_filter '/test/'
|
9
|
+
minimum_coverage(87)
|
12
10
|
end
|
13
11
|
|
14
12
|
gem 'minitest' if defined? Bundler
|
15
13
|
require 'minitest/autorun'
|
16
14
|
|
17
|
-
if ENV['LEFTRIGHT']
|
18
|
-
begin
|
19
|
-
require 'leftright'
|
20
|
-
rescue LoadError
|
21
|
-
puts "Run `gem install leftright` to install leftright."
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
15
|
require File.expand_path('../../lib/faraday', __FILE__)
|
26
16
|
|
27
17
|
require 'stringio'
|
@@ -74,6 +64,10 @@ module Faraday
|
|
74
64
|
defined? RUBY_ENGINE and 'rbx' == RUBY_ENGINE
|
75
65
|
end
|
76
66
|
|
67
|
+
def self.ruby_22_plus?
|
68
|
+
RUBY_VERSION > '2.2'
|
69
|
+
end
|
70
|
+
|
77
71
|
def self.ssl_mode?
|
78
72
|
ENV['SSL'] == 'yes'
|
79
73
|
end
|
@@ -4,17 +4,37 @@ module Middleware
|
|
4
4
|
class RetryTest < Faraday::TestCase
|
5
5
|
def setup
|
6
6
|
@times_called = 0
|
7
|
+
@envs = []
|
7
8
|
end
|
8
9
|
|
9
10
|
def conn(*retry_args)
|
10
11
|
Faraday.new do |b|
|
11
12
|
b.request :retry, *retry_args
|
13
|
+
|
12
14
|
b.adapter :test do |stub|
|
13
15
|
['get', 'post'].each do |method|
|
14
|
-
stub.send(method, '/unstable')
|
16
|
+
stub.send(method, '/unstable') do |env|
|
15
17
|
@times_called += 1
|
18
|
+
@envs << env.dup
|
19
|
+
env[:body] = nil # simulate blanking out response body
|
16
20
|
@explode.call @times_called
|
17
|
-
|
21
|
+
end
|
22
|
+
|
23
|
+
stub.send(method, '/throttled') do |env|
|
24
|
+
@times_called += 1
|
25
|
+
@envs << env.dup
|
26
|
+
|
27
|
+
params = env[:params]
|
28
|
+
|
29
|
+
status = (params['status'] || 429).to_i
|
30
|
+
headers = {}
|
31
|
+
|
32
|
+
retry_after = params['retry_after']
|
33
|
+
|
34
|
+
headers['Retry-After'] = retry_after if retry_after
|
35
|
+
|
36
|
+
[status, headers, '']
|
37
|
+
end
|
18
38
|
end
|
19
39
|
end
|
20
40
|
end
|
@@ -65,7 +85,7 @@ module Middleware
|
|
65
85
|
assert_in_delta 0.2, Time.now - started, 0.04
|
66
86
|
end
|
67
87
|
|
68
|
-
def
|
88
|
+
def test_calls_calculate_sleep_amount
|
69
89
|
explode_app = MiniTest::Mock.new
|
70
90
|
explode_app.expect(:call, nil, [{:body=>nil}])
|
71
91
|
def explode_app.call(env)
|
@@ -76,7 +96,7 @@ module Middleware
|
|
76
96
|
class << retry_middleware
|
77
97
|
attr_accessor :sleep_amount_retries
|
78
98
|
|
79
|
-
def
|
99
|
+
def calculate_sleep_amount(retries, env)
|
80
100
|
self.sleep_amount_retries.delete(retries)
|
81
101
|
0
|
82
102
|
end
|
@@ -92,22 +112,30 @@ module Middleware
|
|
92
112
|
|
93
113
|
def test_exponential_backoff
|
94
114
|
middleware = Faraday::Request::Retry.new(nil, :max => 5, :interval => 0.1, :backoff_factor => 2)
|
95
|
-
assert_equal middleware.
|
96
|
-
assert_equal middleware.
|
97
|
-
assert_equal middleware.
|
115
|
+
assert_equal middleware.send(:calculate_retry_interval, 5), 0.1
|
116
|
+
assert_equal middleware.send(:calculate_retry_interval, 4), 0.2
|
117
|
+
assert_equal middleware.send(:calculate_retry_interval, 3), 0.4
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_exponential_backoff_with_max_interval
|
121
|
+
middleware = Faraday::Request::Retry.new(nil, :max => 5, :interval => 1, :max_interval => 3, :backoff_factor => 2)
|
122
|
+
assert_equal middleware.send(:calculate_retry_interval, 5), 1
|
123
|
+
assert_equal middleware.send(:calculate_retry_interval, 4), 2
|
124
|
+
assert_equal middleware.send(:calculate_retry_interval, 3), 3
|
125
|
+
assert_equal middleware.send(:calculate_retry_interval, 2), 3
|
98
126
|
end
|
99
127
|
|
100
128
|
def test_random_additional_interval_amount
|
101
129
|
middleware = Faraday::Request::Retry.new(nil, :max => 2, :interval => 0.1, :interval_randomness => 1.0)
|
102
|
-
sleep_amount = middleware.
|
130
|
+
sleep_amount = middleware.send(:calculate_retry_interval, 2)
|
103
131
|
assert_operator sleep_amount, :>=, 0.1
|
104
132
|
assert_operator sleep_amount, :<=, 0.2
|
105
133
|
middleware = Faraday::Request::Retry.new(nil, :max => 2, :interval => 0.1, :interval_randomness => 0.5)
|
106
|
-
sleep_amount = middleware.
|
134
|
+
sleep_amount = middleware.send(:calculate_retry_interval, 2)
|
107
135
|
assert_operator sleep_amount, :>=, 0.1
|
108
136
|
assert_operator sleep_amount, :<=, 0.15
|
109
137
|
middleware = Faraday::Request::Retry.new(nil, :max => 2, :interval => 0.1, :interval_randomness => 0.25)
|
110
|
-
sleep_amount = middleware.
|
138
|
+
sleep_amount = middleware.send(:calculate_retry_interval, 2)
|
111
139
|
assert_operator sleep_amount, :>=, 0.1
|
112
140
|
assert_operator sleep_amount, :<=, 0.125
|
113
141
|
end
|
@@ -120,6 +148,17 @@ module Middleware
|
|
120
148
|
assert_equal 3, @times_called
|
121
149
|
end
|
122
150
|
|
151
|
+
def test_should_retry_with_body_if_block_returns_true_for_non_idempotent_request
|
152
|
+
body = { :foo => :bar }
|
153
|
+
@explode = lambda {|n| raise Errno::ETIMEDOUT }
|
154
|
+
check = lambda { |env,exception| true }
|
155
|
+
assert_raises(Errno::ETIMEDOUT) {
|
156
|
+
conn(:retry_if => check).post("/unstable", body)
|
157
|
+
}
|
158
|
+
assert_equal 3, @times_called
|
159
|
+
assert @envs.all? { |env| env[:body] === body }
|
160
|
+
end
|
161
|
+
|
123
162
|
def test_should_stop_retrying_if_block_returns_false_checking_env
|
124
163
|
@explode = lambda {|n| raise Errno::ETIMEDOUT }
|
125
164
|
check = lambda { |env,exception| env[:method] != :post }
|
@@ -173,5 +212,71 @@ module Middleware
|
|
173
212
|
assert_equal 2, @times_called
|
174
213
|
end
|
175
214
|
|
215
|
+
def test_should_rewind_files_on_retry
|
216
|
+
io = StringIO.new("Test data")
|
217
|
+
upload_io = Faraday::UploadIO.new(io, "application/octet/stream")
|
218
|
+
|
219
|
+
rewound = 0
|
220
|
+
rewind = lambda { rewound += 1 }
|
221
|
+
|
222
|
+
upload_io.stub :rewind, rewind do
|
223
|
+
@explode = lambda {|n| raise Errno::ETIMEDOUT }
|
224
|
+
check = lambda { |env,exception| true }
|
225
|
+
assert_raises(Errno::ETIMEDOUT) {
|
226
|
+
conn(:retry_if => check).post("/unstable", { :file => upload_io })
|
227
|
+
}
|
228
|
+
end
|
229
|
+
assert_equal 3, @times_called
|
230
|
+
assert_equal 2, rewound
|
231
|
+
end
|
232
|
+
|
233
|
+
def test_should_retry_retriable_response
|
234
|
+
params = { status: 429 }
|
235
|
+
response = conn(:max => 1, :retry_statuses => 429).get("/throttled", params)
|
236
|
+
|
237
|
+
assert_equal 2, @times_called
|
238
|
+
assert_equal 429, response.status
|
239
|
+
end
|
240
|
+
|
241
|
+
def test_should_not_retry_non_retriable_response
|
242
|
+
params = { status: 503 }
|
243
|
+
conn(:max => 1, :retry_statuses => 429).get("/throttled", params)
|
244
|
+
|
245
|
+
assert_equal 1, @times_called
|
246
|
+
end
|
247
|
+
|
248
|
+
def test_interval_if_retry_after_present
|
249
|
+
started = Time.now
|
250
|
+
|
251
|
+
params = { :retry_after => 0.5 }
|
252
|
+
conn(:max => 1, :interval => 0.1, :retry_statuses => [429]).get("/throttled", params)
|
253
|
+
|
254
|
+
assert Time.now - started > 0.5
|
255
|
+
end
|
256
|
+
|
257
|
+
def test_should_ignore_retry_after_if_less_then_calculated
|
258
|
+
started = Time.now
|
259
|
+
|
260
|
+
params = { :retry_after => 0.1 }
|
261
|
+
conn(:max => 1, :interval => 0.2, :retry_statuses => [429]).get("/throttled", params)
|
262
|
+
|
263
|
+
assert Time.now - started > 0.2
|
264
|
+
end
|
265
|
+
|
266
|
+
def test_interval_when_retry_after_is_timestamp
|
267
|
+
started = Time.now
|
268
|
+
|
269
|
+
params = { :retry_after => (Time.now.utc + 2).strftime('%a, %d %b %Y %H:%M:%S GMT') }
|
270
|
+
conn(:max => 1, :interval => 0.1, :retry_statuses => [429]).get("/throttled", params)
|
271
|
+
|
272
|
+
assert Time.now - started > 1
|
273
|
+
end
|
274
|
+
|
275
|
+
def test_should_not_retry_when_retry_after_greater_then_max_interval
|
276
|
+
params = { :retry_after => (Time.now.utc + 20).strftime('%a, %d %b %Y %H:%M:%S GMT') }
|
277
|
+
conn(:max => 2, :interval => 0.1, :retry_statuses => [429], max_interval: 5).get("/throttled", params)
|
278
|
+
|
279
|
+
assert_equal 1, @times_called
|
280
|
+
end
|
176
281
|
end
|
177
282
|
end
|
@@ -35,8 +35,9 @@ class MiddlewareStackTest < Faraday::TestCase
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def test_allows_extending
|
38
|
-
|
39
|
-
@
|
38
|
+
build_handlers_stack Apple
|
39
|
+
@builder.use Orange
|
40
|
+
@builder.adapter :test, &test_adapter
|
40
41
|
assert_handlers %w[Apple Orange]
|
41
42
|
end
|
42
43
|
|
@@ -46,20 +47,23 @@ class MiddlewareStackTest < Faraday::TestCase
|
|
46
47
|
end
|
47
48
|
|
48
49
|
def test_insert_before
|
49
|
-
|
50
|
+
build_handlers_stack Apple, Orange
|
50
51
|
@builder.insert_before Apple, Banana
|
52
|
+
@builder.adapter :test, &test_adapter
|
51
53
|
assert_handlers %w[Banana Apple Orange]
|
52
54
|
end
|
53
55
|
|
54
56
|
def test_insert_after
|
55
|
-
|
57
|
+
build_handlers_stack Apple, Orange
|
56
58
|
@builder.insert_after Apple, Banana
|
59
|
+
@builder.adapter :test, &test_adapter
|
57
60
|
assert_handlers %w[Apple Banana Orange]
|
58
61
|
end
|
59
62
|
|
60
63
|
def test_swap_handlers
|
61
|
-
|
64
|
+
build_handlers_stack Apple, Orange
|
62
65
|
@builder.swap Apple, Banana
|
66
|
+
@builder.adapter :test, &test_adapter
|
63
67
|
assert_handlers %w[Banana Orange]
|
64
68
|
end
|
65
69
|
|
@@ -143,6 +147,15 @@ class MiddlewareStackTest < Faraday::TestCase
|
|
143
147
|
assert_match "zomg/i_dont/exist", err.message
|
144
148
|
end
|
145
149
|
|
150
|
+
def test_env_stored_on_middleware_response_has_reference_to_the_response
|
151
|
+
env = response = nil
|
152
|
+
build_stack Struct.new(:app) {
|
153
|
+
define_method(:call) { |e| env, response = e, app.call(e) }
|
154
|
+
}
|
155
|
+
@conn.get("/")
|
156
|
+
assert_same env.response, response.env.response
|
157
|
+
end
|
158
|
+
|
146
159
|
private
|
147
160
|
|
148
161
|
# make a stack with test adapter that reflects the order of middleware
|
@@ -151,11 +164,21 @@ class MiddlewareStackTest < Faraday::TestCase
|
|
151
164
|
handlers.each { |handler| b.use(*handler) }
|
152
165
|
yield(b) if block_given?
|
153
166
|
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
167
|
+
@builder.adapter :test, &test_adapter
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def build_handlers_stack(*handlers)
|
172
|
+
@builder.build do |b|
|
173
|
+
handlers.each { |handler| b.use(*handler) }
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
def test_adapter
|
178
|
+
Proc.new do |stub|
|
179
|
+
stub.get '/' do |env|
|
180
|
+
# echo the "X-Middleware" request header in the body
|
181
|
+
[200, {}, env[:request_headers]['X-Middleware'].to_s]
|
159
182
|
end
|
160
183
|
end
|
161
184
|
end
|
@@ -171,3 +194,67 @@ class MiddlewareStackTest < Faraday::TestCase
|
|
171
194
|
component.instance_variable_get('@registered_middleware').delete(key)
|
172
195
|
end
|
173
196
|
end
|
197
|
+
|
198
|
+
class MiddlewareStackOrderTest < Faraday::TestCase
|
199
|
+
def test_adding_response_middleware_after_adapter
|
200
|
+
response_after_adapter = lambda do
|
201
|
+
Faraday::RackBuilder.new do |b|
|
202
|
+
b.adapter :test
|
203
|
+
b.response :raise_error
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
assert_output("", expected_middleware_warning, &response_after_adapter)
|
208
|
+
end
|
209
|
+
|
210
|
+
def test_adding_request_middleware_after_adapter
|
211
|
+
request_after_adapter = lambda do
|
212
|
+
Faraday::RackBuilder.new do |b|
|
213
|
+
b.adapter :test
|
214
|
+
b.request :multipart
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
assert_output("", expected_middleware_warning, &request_after_adapter)
|
219
|
+
end
|
220
|
+
|
221
|
+
def test_adding_request_middleware_after_adapter_via_use
|
222
|
+
use_after_adapter = lambda do
|
223
|
+
Faraday::RackBuilder.new do |b|
|
224
|
+
b.adapter :test
|
225
|
+
b.use Faraday::Request::Multipart
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
assert_output("", expected_middleware_warning, &use_after_adapter)
|
230
|
+
end
|
231
|
+
|
232
|
+
def test_adding_request_middleware_after_adapter_via_insert
|
233
|
+
insert_after_adapter = lambda do
|
234
|
+
Faraday::RackBuilder.new do |b|
|
235
|
+
b.adapter :test
|
236
|
+
b.insert(1, Faraday::Request::Multipart)
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
assert_output("", expected_middleware_warning, &insert_after_adapter)
|
241
|
+
end
|
242
|
+
|
243
|
+
def test_adding_request_middleware_before_adapter_via_insert_no_warning
|
244
|
+
builder = Faraday::RackBuilder.new do |b|
|
245
|
+
b.adapter :test
|
246
|
+
end
|
247
|
+
|
248
|
+
insert_before_adapter = lambda do
|
249
|
+
builder.insert(0, Faraday::Request::Multipart)
|
250
|
+
end
|
251
|
+
|
252
|
+
assert_output("", "", &insert_before_adapter)
|
253
|
+
end
|
254
|
+
|
255
|
+
private
|
256
|
+
|
257
|
+
def expected_middleware_warning
|
258
|
+
/Unexpected middleware set after the adapter/
|
259
|
+
end
|
260
|
+
end
|
data/test/options_test.rb
CHANGED
@@ -1,11 +1,91 @@
|
|
1
1
|
require File.expand_path('../helper', __FILE__)
|
2
2
|
|
3
3
|
class OptionsTest < Faraday::TestCase
|
4
|
-
|
4
|
+
SubOptions = Class.new(Faraday::Options.new(:sub_a, :sub_b))
|
5
5
|
class ParentOptions < Faraday::Options.new(:a, :b, :c)
|
6
6
|
options :c => SubOptions
|
7
7
|
end
|
8
8
|
|
9
|
+
def test_deep_merge
|
10
|
+
sub_opts1 = SubOptions.from(sub_a: 3)
|
11
|
+
sub_opts2 = SubOptions.from(sub_b: 4)
|
12
|
+
opt1 = ParentOptions.from(a: 1, c: sub_opts1)
|
13
|
+
opt2 = ParentOptions.from(b: 2, c: sub_opts2)
|
14
|
+
|
15
|
+
merged = opt1.merge(opt2)
|
16
|
+
|
17
|
+
expected_sub_opts = SubOptions.from(sub_a: 3, sub_b: 4)
|
18
|
+
assert_equal merged, ParentOptions.from(a: 1, b: 2, c: expected_sub_opts)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_deep_merge_with_hash
|
22
|
+
sub_opts1 = SubOptions.from(sub_a: 3)
|
23
|
+
sub_opts2 = { sub_b: 4 }
|
24
|
+
opt1 = ParentOptions.from(a: 1, c: sub_opts1)
|
25
|
+
opt2 = { b: 2, c: sub_opts2 }
|
26
|
+
|
27
|
+
merged = opt1.merge(opt2)
|
28
|
+
|
29
|
+
expected_sub_opts = SubOptions.from(sub_a: 3, sub_b: 4)
|
30
|
+
assert_equal merged, ParentOptions.from(a: 1, b: 2, c: expected_sub_opts)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_deep_merge_with_nil
|
34
|
+
sub_opts = SubOptions.new(3, 4)
|
35
|
+
options = ParentOptions.new(1, 2, sub_opts)
|
36
|
+
assert_equal options.a, 1
|
37
|
+
assert_equal options.b, 2
|
38
|
+
assert_equal options.c.sub_a, 3
|
39
|
+
assert_equal options.c.sub_b, 4
|
40
|
+
|
41
|
+
options2 = ParentOptions.from(b: 5, c: nil)
|
42
|
+
|
43
|
+
merged = options.merge(options2)
|
44
|
+
|
45
|
+
assert_equal merged.b, 5
|
46
|
+
assert_equal merged.c, sub_opts
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_deep_merge_with_sub_nil
|
50
|
+
options = ParentOptions.from(a: 1)
|
51
|
+
|
52
|
+
sub_opts = SubOptions.new(3, 4)
|
53
|
+
options2 = ParentOptions.from(b: 2, c: sub_opts)
|
54
|
+
|
55
|
+
assert_equal options.a, 1
|
56
|
+
assert_equal options2.b, 2
|
57
|
+
assert_equal options2.c.sub_a, 3
|
58
|
+
assert_equal options2.c.sub_b, 4
|
59
|
+
|
60
|
+
merged = options.merge(options2)
|
61
|
+
|
62
|
+
assert_equal merged.c, sub_opts
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_dup_is_shallow
|
66
|
+
sub_opts = SubOptions.from(sub_a: 3)
|
67
|
+
opts = ParentOptions.from(b: 1, c: sub_opts)
|
68
|
+
|
69
|
+
duped = opts.dup
|
70
|
+
duped.b = 2
|
71
|
+
duped.c.sub_a = 4
|
72
|
+
|
73
|
+
assert_equal opts.b, 1
|
74
|
+
assert_equal opts.c.sub_a, 4
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_deep_dup
|
78
|
+
sub_opts = SubOptions.from(sub_a: 3)
|
79
|
+
opts = ParentOptions.from(b: 1, c: sub_opts)
|
80
|
+
|
81
|
+
duped = opts.deep_dup
|
82
|
+
duped.b = 2
|
83
|
+
duped.c.sub_a = 4
|
84
|
+
|
85
|
+
assert_equal opts.b, 1
|
86
|
+
assert_equal opts.c.sub_a, 3
|
87
|
+
end
|
88
|
+
|
9
89
|
def test_clear
|
10
90
|
options = SubOptions.new(1)
|
11
91
|
assert !options.empty?
|
@@ -16,9 +96,9 @@ class OptionsTest < Faraday::TestCase
|
|
16
96
|
def test_empty
|
17
97
|
options = SubOptions.new
|
18
98
|
assert options.empty?
|
19
|
-
options.
|
99
|
+
options.sub_a = 1
|
20
100
|
assert !options.empty?
|
21
|
-
options.delete(:
|
101
|
+
options.delete(:sub_a)
|
22
102
|
assert options.empty?
|
23
103
|
end
|
24
104
|
|
@@ -32,13 +112,9 @@ class OptionsTest < Faraday::TestCase
|
|
32
112
|
|
33
113
|
def test_key?
|
34
114
|
options = SubOptions.new
|
35
|
-
assert !options.key?(:
|
36
|
-
options.
|
37
|
-
|
38
|
-
assert options.key?(:sub)
|
39
|
-
else
|
40
|
-
assert options.key?("sub")
|
41
|
-
end
|
115
|
+
assert !options.key?(:sub_a)
|
116
|
+
options.sub_a = 1
|
117
|
+
assert options.key?(:sub_a)
|
42
118
|
end
|
43
119
|
|
44
120
|
def test_each_value
|
@@ -52,7 +128,7 @@ class OptionsTest < Faraday::TestCase
|
|
52
128
|
def test_value?
|
53
129
|
options = SubOptions.new
|
54
130
|
assert !options.value?(1)
|
55
|
-
options.
|
131
|
+
options.sub_a = 1
|
56
132
|
assert options.value?(1)
|
57
133
|
end
|
58
134
|
|
@@ -83,6 +159,11 @@ class OptionsTest < Faraday::TestCase
|
|
83
159
|
assert_equal 'http', options.scheme
|
84
160
|
end
|
85
161
|
|
162
|
+
def test_proxy_options_from_nil
|
163
|
+
options = Faraday::ProxyOptions.from nil
|
164
|
+
assert_kind_of Faraday::ProxyOptions, options
|
165
|
+
end
|
166
|
+
|
86
167
|
def test_proxy_options_hash_access
|
87
168
|
proxy = Faraday::ProxyOptions.from 'http://a%40b:pw%20d@example.org'
|
88
169
|
assert_equal 'a@b', proxy[:user]
|
@@ -112,7 +193,7 @@ class OptionsTest < Faraday::TestCase
|
|
112
193
|
assert_equal 1, options.a
|
113
194
|
assert_nil options.b
|
114
195
|
assert_kind_of SubOptions, options.c
|
115
|
-
assert_equal 1, options.c.
|
196
|
+
assert_equal 1, options.c.sub_a
|
116
197
|
end
|
117
198
|
|
118
199
|
def test_from_hash
|
@@ -123,19 +204,19 @@ class OptionsTest < Faraday::TestCase
|
|
123
204
|
end
|
124
205
|
|
125
206
|
def test_from_hash_with_sub_object
|
126
|
-
options = ParentOptions.from :a => 1, :c => {:
|
207
|
+
options = ParentOptions.from :a => 1, :c => {:sub_a => 1}
|
127
208
|
assert_kind_of ParentOptions, options
|
128
209
|
assert_equal 1, options.a
|
129
210
|
assert_nil options.b
|
130
211
|
assert_kind_of SubOptions, options.c
|
131
|
-
assert_equal 1, options.c.
|
212
|
+
assert_equal 1, options.c.sub_a
|
132
213
|
end
|
133
214
|
|
134
215
|
def test_inheritance
|
135
216
|
subclass = Class.new(ParentOptions)
|
136
|
-
options = subclass.from(:c => {:
|
217
|
+
options = subclass.from(:c => {:sub_a => 'hello'})
|
137
218
|
assert_kind_of SubOptions, options.c
|
138
|
-
assert_equal 'hello', options.c.
|
219
|
+
assert_equal 'hello', options.c.sub_a
|
139
220
|
end
|
140
221
|
|
141
222
|
def test_from_deep_hash
|