faraday 0.9.0.rc5 → 0.9.0.rc6

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 (45) hide show
  1. data/Gemfile +6 -5
  2. data/README.md +0 -22
  3. data/faraday.gemspec +2 -2
  4. data/lib/faraday.rb +6 -2
  5. data/lib/faraday/adapter/em_http.rb +34 -14
  6. data/lib/faraday/adapter/em_http_ssl_patch.rb +56 -0
  7. data/lib/faraday/adapter/em_synchrony.rb +21 -20
  8. data/lib/faraday/adapter/excon.rb +16 -0
  9. data/lib/faraday/adapter/httpclient.rb +14 -0
  10. data/lib/faraday/adapter/net_http.rb +6 -2
  11. data/lib/faraday/adapter/net_http_persistent.rb +15 -3
  12. data/lib/faraday/adapter/patron.rb +13 -11
  13. data/lib/faraday/adapter/typhoeus.rb +11 -0
  14. data/lib/faraday/autoload.rb +2 -4
  15. data/lib/faraday/connection.rb +30 -3
  16. data/lib/faraday/error.rb +4 -1
  17. data/lib/faraday/options.rb +117 -23
  18. data/lib/faraday/request/instrumentation.rb +1 -3
  19. data/lib/faraday/request/multipart.rb +1 -1
  20. data/lib/faraday/request/retry.rb +38 -9
  21. data/lib/faraday/response.rb +1 -2
  22. data/lib/faraday/response/raise_error.rb +3 -0
  23. data/lib/faraday/utils.rb +10 -4
  24. data/script/proxy-server +42 -0
  25. data/script/server +1 -3
  26. data/script/test +35 -7
  27. data/test/adapters/excon_test.rb +4 -0
  28. data/test/adapters/httpclient_test.rb +5 -0
  29. data/test/adapters/integration.rb +48 -2
  30. data/test/adapters/net_http_persistent_test.rb +10 -1
  31. data/test/adapters/patron_test.rb +3 -0
  32. data/test/adapters/rack_test.rb +5 -0
  33. data/test/adapters/typhoeus_test.rb +3 -13
  34. data/test/authentication_middleware_test.rb +6 -6
  35. data/test/connection_test.rb +123 -49
  36. data/test/env_test.rb +19 -1
  37. data/test/helper.rb +2 -4
  38. data/test/live_server.rb +4 -2
  39. data/test/middleware/instrumentation_test.rb +13 -0
  40. data/test/middleware/retry_test.rb +47 -0
  41. data/test/multibyte.txt +1 -0
  42. data/test/options_test.rb +93 -17
  43. data/test/request_middleware_test.rb +6 -6
  44. data/test/utils_test.rb +34 -13
  45. metadata +69 -44
@@ -98,6 +98,25 @@ class HeadersTest < Faraday::TestCase
98
98
  assert_equal 'application/xml', @headers['content-type']
99
99
  end
100
100
 
101
+ def test_fetch_key
102
+ @headers['Content-Type'] = 'application/json'
103
+ block_called = false
104
+ assert_equal 'application/json', @headers.fetch('content-type') { block_called = true }
105
+ assert_equal 'application/json', @headers.fetch('Content-Type')
106
+ assert_equal 'application/json', @headers.fetch('CONTENT-TYPE')
107
+ assert_equal 'application/json', @headers.fetch(:content_type)
108
+ assert_equal false, block_called
109
+
110
+ assert_equal 'default', @headers.fetch('invalid', 'default')
111
+ assert_equal false, @headers.fetch('invalid', false)
112
+ assert_nil @headers.fetch('invalid', nil)
113
+
114
+ assert_equal 'Invalid key', @headers.fetch('Invalid') { |key| "#{key} key" }
115
+
116
+ expected_error = defined?(KeyError) ? KeyError : IndexError
117
+ assert_raises(expected_error) { @headers.fetch('invalid') }
118
+ end
119
+
101
120
  def test_delete_key
102
121
  @headers['Content-Type'] = 'application/json'
103
122
  assert_equal 1, @headers.size
@@ -189,4 +208,3 @@ class ResponseTest < Faraday::TestCase
189
208
  assert_equal hash[:body], @response.body
190
209
  end
191
210
  end
192
-
@@ -11,6 +11,7 @@ SimpleCov.start do
11
11
  add_filter '/bundle/'
12
12
  end
13
13
 
14
+ gem 'minitest' if defined? Bundler
14
15
  require 'minitest/autorun'
15
16
 
16
17
  if ENV['LEFTRIGHT']
@@ -22,9 +23,6 @@ if ENV['LEFTRIGHT']
22
23
  end
23
24
 
24
25
  require File.expand_path('../../lib/faraday', __FILE__)
25
- Dir[File.expand_path('../../lib/faraday/r*/*', __FILE__)].each do |file|
26
- require file
27
- end
28
26
 
29
27
  require 'stringio'
30
28
  require 'uri'
@@ -50,7 +48,7 @@ module Faraday
50
48
  end
51
49
  end
52
50
 
53
- class TestCase < MiniTest::Unit::TestCase
51
+ class TestCase < MiniTest::Test
54
52
  extend LiveServerConfig
55
53
  self.live_server = ENV['LIVE']
56
54
 
@@ -25,9 +25,11 @@ class LiveServer < Sinatra::Base
25
25
 
26
26
  post '/file' do
27
27
  if params[:uploaded_file].respond_to? :each_key
28
- "file %s %s" % [
28
+ "file %s %s %d" % [
29
29
  params[:uploaded_file][:filename],
30
- params[:uploaded_file][:type]]
30
+ params[:uploaded_file][:type],
31
+ params[:uploaded_file][:tempfile].size
32
+ ]
31
33
  else
32
34
  status 400
33
35
  end
@@ -28,6 +28,19 @@ module Middleware
28
28
  assert_equal :boom, options(:instrumenter => :boom).instrumenter
29
29
  end
30
30
 
31
+ def test_instrumentation_with_default_name
32
+ assert_equal 0, @instrumenter.instrumentations.size
33
+
34
+ faraday = conn
35
+ res = faraday.get '/'
36
+ assert_equal 'ok', res.body
37
+
38
+ assert_equal 1, @instrumenter.instrumentations.size
39
+ name, env = @instrumenter.instrumentations.first
40
+ assert_equal 'request.faraday', name
41
+ assert_equal '/', env[:url].path
42
+ end
43
+
31
44
  def test_instrumentation
32
45
  assert_equal 0, @instrumenter.instrumentations.size
33
46
 
@@ -51,6 +51,53 @@ module Middleware
51
51
  assert_in_delta 0.2, Time.now - started, 0.03
52
52
  end
53
53
 
54
+ def test_calls_sleep_amount
55
+ explode_app = MiniTest::Mock.new
56
+ explode_app.expect(:call, nil, [{:body=>nil}])
57
+ def explode_app.call(env)
58
+ raise Errno::ETIMEDOUT
59
+ end
60
+
61
+ retry_middleware = Faraday::Request::Retry.new(explode_app)
62
+ class << retry_middleware
63
+ attr_accessor :sleep_amount_retries
64
+
65
+ def sleep_amount(retries)
66
+ self.sleep_amount_retries.delete(retries)
67
+ 0
68
+ end
69
+ end
70
+ retry_middleware.sleep_amount_retries = [2, 1]
71
+
72
+ assert_raises(Errno::ETIMEDOUT) {
73
+ retry_middleware.call({})
74
+ }
75
+
76
+ assert_empty retry_middleware.sleep_amount_retries
77
+ end
78
+
79
+ def test_exponential_backoff
80
+ middleware = Faraday::Request::Retry.new(nil, :max => 5, :interval => 0.1, :backoff_factor => 2)
81
+ assert_equal middleware.sleep_amount(5), 0.1
82
+ assert_equal middleware.sleep_amount(4), 0.2
83
+ assert_equal middleware.sleep_amount(3), 0.4
84
+ end
85
+
86
+ def test_random_additional_interval_amount
87
+ middleware = Faraday::Request::Retry.new(nil, :max => 2, :interval => 0.1, :interval_randomness => 1.0)
88
+ sleep_amount = middleware.sleep_amount(2)
89
+ assert_operator sleep_amount, :>=, 0.1
90
+ assert_operator sleep_amount, :<=, 0.2
91
+ middleware = Faraday::Request::Retry.new(nil, :max => 2, :interval => 0.1, :interval_randomness => 0.5)
92
+ sleep_amount = middleware.sleep_amount(2)
93
+ assert_operator sleep_amount, :>=, 0.1
94
+ assert_operator sleep_amount, :<=, 0.15
95
+ middleware = Faraday::Request::Retry.new(nil, :max => 2, :interval => 0.1, :interval_randomness => 0.25)
96
+ sleep_amount = middleware.sleep_amount(2)
97
+ assert_operator sleep_amount, :>=, 0.1
98
+ assert_operator sleep_amount, :<=, 0.125
99
+ end
100
+
54
101
  def test_custom_exceptions
55
102
  @explode = lambda {|n| raise "boom!" }
56
103
  assert_raises(RuntimeError) {
@@ -0,0 +1 @@
1
+ ファイル
@@ -2,7 +2,7 @@ require File.expand_path('../helper', __FILE__)
2
2
 
3
3
  class OptionsTest < Faraday::TestCase
4
4
  class SubOptions < Faraday::Options.new(:sub); end
5
- class Options < Faraday::Options.new(:a, :b, :c)
5
+ class ParentOptions < Faraday::Options.new(:a, :b, :c)
6
6
  options :c => SubOptions
7
7
  end
8
8
 
@@ -33,18 +33,32 @@ class OptionsTest < Faraday::TestCase
33
33
  assert_equal 'http', options.scheme
34
34
  end
35
35
 
36
+ def test_proxy_options_hash_access
37
+ proxy = Faraday::ProxyOptions.from 'http://a%40b:pw%20d@example.org'
38
+ assert_equal 'a@b', proxy[:user]
39
+ assert_equal 'a@b', proxy.user
40
+ assert_equal 'pw d', proxy[:password]
41
+ assert_equal 'pw d', proxy.password
42
+ end
43
+
44
+ def test_proxy_options_no_auth
45
+ proxy = Faraday::ProxyOptions.from 'http://example.org'
46
+ assert_nil proxy.user
47
+ assert_nil proxy.password
48
+ end
49
+
36
50
  def test_from_options
37
- options = Options.new 1
51
+ options = ParentOptions.new 1
38
52
 
39
- value = Options.from(options)
53
+ value = ParentOptions.from(options)
40
54
  assert_equal 1, value.a
41
55
  assert_nil value.b
42
56
  end
43
57
 
44
58
  def test_from_options_with_sub_object
45
59
  sub = SubOptions.new 1
46
- options = Options.from :a => 1, :c => sub
47
- assert_kind_of Options, options
60
+ options = ParentOptions.from :a => 1, :c => sub
61
+ assert_kind_of ParentOptions, options
48
62
  assert_equal 1, options.a
49
63
  assert_nil options.b
50
64
  assert_kind_of SubOptions, options.c
@@ -52,24 +66,31 @@ class OptionsTest < Faraday::TestCase
52
66
  end
53
67
 
54
68
  def test_from_hash
55
- options = Options.from :a => 1
56
- assert_kind_of Options, options
69
+ options = ParentOptions.from :a => 1
70
+ assert_kind_of ParentOptions, options
57
71
  assert_equal 1, options.a
58
72
  assert_nil options.b
59
73
  end
60
74
 
61
75
  def test_from_hash_with_sub_object
62
- options = Options.from :a => 1, :c => {:sub => 1}
63
- assert_kind_of Options, options
76
+ options = ParentOptions.from :a => 1, :c => {:sub => 1}
77
+ assert_kind_of ParentOptions, options
64
78
  assert_equal 1, options.a
65
79
  assert_nil options.b
66
80
  assert_kind_of SubOptions, options.c
67
81
  assert_equal 1, options.c.sub
68
82
  end
69
83
 
84
+ def test_inheritance
85
+ subclass = Class.new(ParentOptions)
86
+ options = subclass.from(:c => {:sub => 'hello'})
87
+ assert_kind_of SubOptions, options.c
88
+ assert_equal 'hello', options.c.sub
89
+ end
90
+
70
91
  def test_from_deep_hash
71
92
  hash = {:b => 1}
72
- options = Options.from :a => hash
93
+ options = ParentOptions.from :a => hash
73
94
  assert_equal 1, options.a[:b]
74
95
 
75
96
  hash[:b] = 2
@@ -81,20 +102,20 @@ class OptionsTest < Faraday::TestCase
81
102
  end
82
103
 
83
104
  def test_from_nil
84
- options = Options.from(nil)
85
- assert_kind_of Options, options
105
+ options = ParentOptions.from(nil)
106
+ assert_kind_of ParentOptions, options
86
107
  assert_nil options.a
87
108
  assert_nil options.b
88
109
  end
89
110
 
90
111
  def test_invalid_key
91
112
  assert_raises NoMethodError do
92
- Options.from :invalid => 1
113
+ ParentOptions.from :invalid => 1
93
114
  end
94
115
  end
95
116
 
96
117
  def test_update
97
- options = Options.new 1
118
+ options = ParentOptions.new 1
98
119
  assert_equal 1, options.a
99
120
  assert_nil options.b
100
121
 
@@ -105,14 +126,14 @@ class OptionsTest < Faraday::TestCase
105
126
  end
106
127
 
107
128
  def test_delete
108
- options = Options.new 1
129
+ options = ParentOptions.new 1
109
130
  assert_equal 1, options.a
110
131
  assert_equal 1, options.delete(:a)
111
132
  assert_nil options.a
112
133
  end
113
134
 
114
135
  def test_merge
115
- options = Options.new 1
136
+ options = ParentOptions.new 1
116
137
  assert_equal 1, options.a
117
138
  assert_nil options.b
118
139
 
@@ -122,5 +143,60 @@ class OptionsTest < Faraday::TestCase
122
143
  assert_equal 1, options.a
123
144
  assert_nil options.b
124
145
  end
125
- end
126
146
 
147
+ def test_env_access_member
148
+ e = Faraday::Env.new
149
+ assert_nil e.method
150
+ e.method = :get
151
+ assert_equal :get, e.method
152
+ end
153
+
154
+ def test_env_access_symbol_non_member
155
+ e = Faraday::Env.new
156
+ assert_nil e[:custom]
157
+ e[:custom] = :boom
158
+ assert_equal :boom, e[:custom]
159
+ end
160
+
161
+ def test_env_access_string_non_member
162
+ e = Faraday::Env.new
163
+ assert_nil e["custom"]
164
+ e["custom"] = :boom
165
+ assert_equal :boom, e["custom"]
166
+ end
167
+
168
+ def test_env_fetch_ignores_false
169
+ ssl = Faraday::SSLOptions.new
170
+ ssl.verify = false
171
+ assert !ssl.fetch(:verify, true)
172
+ end
173
+
174
+ def test_fetch_grabs_value
175
+ opt = Faraday::SSLOptions.new
176
+ opt.verify = 1
177
+ assert_equal 1, opt.fetch(:verify, false) { |k| :blah }
178
+ end
179
+
180
+ def test_fetch_uses_falsey_default
181
+ opt = Faraday::SSLOptions.new
182
+ assert_equal false, opt.fetch(:verify, false) { |k| :blah }
183
+ end
184
+
185
+ def test_fetch_accepts_block
186
+ opt = Faraday::SSLOptions.new
187
+ assert_equal "yo :verify", opt.fetch(:verify) { |k| "yo #{k.inspect}"}
188
+ end
189
+
190
+ def test_fetch_needs_a_default_if_key_is_missing
191
+ opt = Faraday::SSLOptions.new
192
+ assert_raises Faraday::Options.fetch_error_class do
193
+ opt.fetch :verify
194
+ end
195
+ end
196
+
197
+ def test_fetch_works_with_key
198
+ opt = Faraday::SSLOptions.new
199
+ opt.verify = 1
200
+ assert_equal 1, opt.fetch(:verify)
201
+ end
202
+ end
@@ -77,7 +77,7 @@ class RequestMiddlewareTest < Faraday::TestCase
77
77
  response = @conn.post('/echo', {:str => "eé cç aã aâ"})
78
78
  assert_equal "str=e%C3%A9+c%C3%A7+a%C3%A3+a%C3%A2", response.body
79
79
  }
80
- assert err.empty?
80
+ assert err.empty?, "stderr did include: #{err}"
81
81
  end
82
82
 
83
83
  def test_url_encoded_unicode_with_kcode_set
@@ -86,7 +86,7 @@ class RequestMiddlewareTest < Faraday::TestCase
86
86
  response = @conn.post('/echo', {:str => "eé cç aã aâ"})
87
87
  assert_equal "str=e%C3%A9+c%C3%A7+a%C3%A3+a%C3%A2", response.body
88
88
  }
89
- assert err.empty?
89
+ assert err.empty?, "stderr did include: #{err}"
90
90
  end
91
91
  end
92
92
 
@@ -106,7 +106,7 @@ class RequestMiddlewareTest < Faraday::TestCase
106
106
  response = @conn.post('/echo', payload)
107
107
 
108
108
  assert_kind_of Faraday::CompositeReadIO, response.body
109
- assert_equal "multipart/form-data;boundary=%s" % Faraday::Request::Multipart::DEFAULT_BOUNDARY,
109
+ assert_equal "multipart/form-data; boundary=%s" % Faraday::Request::Multipart::DEFAULT_BOUNDARY,
110
110
  response.headers['Content-Type']
111
111
 
112
112
  response.body.send(:ios).map{|io| io.read}.each do |io|
@@ -116,7 +116,7 @@ class RequestMiddlewareTest < Faraday::TestCase
116
116
  end
117
117
  assert_equal [], regexes
118
118
  end
119
-
119
+
120
120
  def test_multipart_with_arrays
121
121
  # assume params are out of order
122
122
  regexes = [
@@ -128,7 +128,7 @@ class RequestMiddlewareTest < Faraday::TestCase
128
128
  response = @conn.post('/echo', payload)
129
129
 
130
130
  assert_kind_of Faraday::CompositeReadIO, response.body
131
- assert_equal "multipart/form-data;boundary=%s" % Faraday::Request::Multipart::DEFAULT_BOUNDARY,
131
+ assert_equal "multipart/form-data; boundary=%s" % Faraday::Request::Multipart::DEFAULT_BOUNDARY,
132
132
  response.headers['Content-Type']
133
133
 
134
134
  response.body.send(:ios).map{|io| io.read}.each do |io|
@@ -138,5 +138,5 @@ class RequestMiddlewareTest < Faraday::TestCase
138
138
  end
139
139
  assert_equal [], regexes
140
140
  end
141
-
141
+
142
142
  end
@@ -5,33 +5,54 @@ class TestUtils < Faraday::TestCase
5
5
  @url = "http://example.com/abc"
6
6
  end
7
7
 
8
- def teardown
9
- Faraday::Utils.default_uri_parser = nil
8
+ # emulates ActiveSupport::SafeBuffer#gsub
9
+ FakeSafeBuffer = Struct.new(:string) do
10
+ def to_s() self end
11
+ def gsub(regex)
12
+ string.gsub(regex) {
13
+ match, = $&, '' =~ /a/
14
+ yield match
15
+ }
16
+ end
17
+ end
18
+
19
+ def test_escaping_safe_buffer
20
+ str = FakeSafeBuffer.new('$32,000.00')
21
+ assert_equal '%2432%2C000.00', Faraday::Utils.escape(str)
10
22
  end
11
23
 
12
24
  def test_parses_with_default
13
- assert_equal %(#<Method: Kernel.URI>), Faraday::Utils.default_uri_parser.to_s
14
- uri = normalize(@url)
15
- assert_equal 'example.com', uri.host
25
+ with_default_uri_parser(nil) do
26
+ uri = normalize(@url)
27
+ assert_equal 'example.com', uri.host
28
+ end
16
29
  end
17
30
 
18
31
  def test_parses_with_URI
19
- Faraday::Utils.default_uri_parser = ::URI
20
- assert_equal %(#<Method: URI.parse>), Faraday::Utils.default_uri_parser.to_s
21
- uri = normalize(@url)
22
- assert_equal 'example.com', uri.host
32
+ with_default_uri_parser(::URI) do
33
+ uri = normalize(@url)
34
+ assert_equal 'example.com', uri.host
35
+ end
23
36
  end
24
37
 
25
38
  def test_parses_with_block
26
- Faraday::Utils.default_uri_parser = lambda do |uri|
27
- "booya#{"!" * uri.size}"
39
+ with_default_uri_parser(lambda {|u| "booya#{"!" * u.size}" }) do
40
+ assert_equal 'booya!!!!!!!!!!!!!!!!!!!!!!', normalize(@url)
28
41
  end
29
-
30
- assert_equal 'booya!!!!!!!!!!!!!!!!!!!!!!', normalize(@url)
31
42
  end
32
43
 
33
44
  def normalize(url)
34
45
  Faraday::Utils::URI(url)
35
46
  end
47
+
48
+ def with_default_uri_parser(parser)
49
+ old_parser = Faraday::Utils.default_uri_parser
50
+ begin
51
+ Faraday::Utils.default_uri_parser = parser
52
+ yield
53
+ ensure
54
+ Faraday::Utils.default_uri_parser = old_parser
55
+ end
56
+ end
36
57
  end
37
58