faraday 0.9.0.rc5 → 0.9.0.rc6

Sign up to get free protection for your applications and to get access to all the features.
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