faraday 0.8.11 → 0.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.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.document +6 -0
  3. data/CHANGELOG.md +15 -0
  4. data/CONTRIBUTING.md +36 -0
  5. data/Gemfile +10 -3
  6. data/LICENSE.md +1 -1
  7. data/README.md +17 -51
  8. data/Rakefile +2 -18
  9. data/faraday.gemspec +34 -0
  10. data/lib/faraday/adapter/em_http.rb +34 -0
  11. data/lib/faraday/adapter/em_http_ssl_patch.rb +56 -0
  12. data/lib/faraday/adapter/em_synchrony.rb +11 -24
  13. data/lib/faraday/adapter/excon.rb +12 -2
  14. data/lib/faraday/adapter/httpclient.rb +106 -0
  15. data/lib/faraday/adapter/net_http.rb +10 -6
  16. data/lib/faraday/adapter/patron.rb +2 -8
  17. data/lib/faraday/adapter/rack.rb +0 -2
  18. data/lib/faraday/adapter/test.rb +39 -39
  19. data/lib/faraday/adapter/typhoeus.rb +12 -3
  20. data/lib/faraday/adapter.rb +20 -35
  21. data/lib/faraday/autoload.rb +85 -0
  22. data/lib/faraday/connection.rb +232 -125
  23. data/lib/faraday/error.rb +42 -34
  24. data/lib/faraday/options.rb +350 -0
  25. data/lib/faraday/parameters.rb +193 -0
  26. data/lib/faraday/{builder.rb → rack_builder.rb} +79 -22
  27. data/lib/faraday/request/authorization.rb +7 -5
  28. data/lib/faraday/request/basic_authentication.rb +1 -1
  29. data/lib/faraday/request/instrumentation.rb +36 -0
  30. data/lib/faraday/request/multipart.rb +10 -9
  31. data/lib/faraday/request/retry.rb +99 -4
  32. data/lib/faraday/request/token_authentication.rb +2 -2
  33. data/lib/faraday/request/url_encoded.rb +7 -6
  34. data/lib/faraday/request.rb +21 -30
  35. data/lib/faraday/response/logger.rb +4 -4
  36. data/lib/faraday/response/raise_error.rb +4 -2
  37. data/lib/faraday/response.rb +17 -23
  38. data/lib/faraday/utils.rb +81 -71
  39. data/lib/faraday.rb +187 -68
  40. data/script/console +7 -0
  41. data/script/proxy-server +1 -0
  42. data/script/release +6 -3
  43. data/script/test +4 -2
  44. data/test/adapters/em_http_test.rb +6 -1
  45. data/test/adapters/em_synchrony_test.rb +7 -1
  46. data/test/adapters/httpclient_test.rb +21 -0
  47. data/test/adapters/integration.rb +23 -8
  48. data/test/adapters/logger_test.rb +1 -1
  49. data/test/adapters/net_http_persistent_test.rb +10 -1
  50. data/test/adapters/net_http_test.rb +0 -31
  51. data/test/adapters/patron_test.rb +4 -1
  52. data/test/adapters/test_middleware_test.rb +48 -4
  53. data/test/adapters/typhoeus_test.rb +8 -1
  54. data/test/authentication_middleware_test.rb +2 -2
  55. data/test/connection_test.rb +160 -84
  56. data/test/env_test.rb +51 -24
  57. data/test/helper.rb +13 -13
  58. data/test/live_server.rb +8 -0
  59. data/test/middleware/instrumentation_test.rb +88 -0
  60. data/test/middleware/retry_test.rb +88 -35
  61. data/test/middleware_stack_test.rb +13 -12
  62. data/test/options_test.rb +252 -0
  63. data/test/request_middleware_test.rb +11 -1
  64. data/test/response_middleware_test.rb +2 -4
  65. data/test/strawberry.rb +2 -0
  66. data/test/utils_test.rb +34 -6
  67. metadata +71 -11
  68. data/test/parameters_test.rb +0 -24
@@ -0,0 +1,88 @@
1
+ require File.expand_path("../../helper", __FILE__)
2
+
3
+ module Middleware
4
+ class InstrumentationTest < Faraday::TestCase
5
+ def setup
6
+ @instrumenter = FakeInstrumenter.new
7
+ end
8
+
9
+ def test_default_name
10
+ assert_equal 'request.faraday', options.name
11
+ end
12
+
13
+ def test_default_instrumenter
14
+ begin
15
+ instrumenter = options.instrumenter
16
+ rescue NameError => err
17
+ assert_match 'ActiveSupport', err.to_s
18
+ else
19
+ assert_equal ActiveSupport::Notifications, instrumenter
20
+ end
21
+ end
22
+
23
+ def test_name
24
+ assert_equal 'booya', options(:name => 'booya').name
25
+ end
26
+
27
+ def test_instrumenter
28
+ assert_equal :boom, options(:instrumenter => :boom).instrumenter
29
+ end
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
+
44
+ def test_instrumentation
45
+ assert_equal 0, @instrumenter.instrumentations.size
46
+
47
+ faraday = conn :name => 'booya'
48
+ res = faraday.get '/'
49
+ assert_equal 'ok', res.body
50
+
51
+ assert_equal 1, @instrumenter.instrumentations.size
52
+ name, env = @instrumenter.instrumentations.first
53
+ assert_equal 'booya', name
54
+ assert_equal '/', env[:url].path
55
+ end
56
+
57
+ class FakeInstrumenter
58
+ attr_reader :instrumentations
59
+
60
+ def initialize
61
+ @instrumentations = []
62
+ end
63
+
64
+ def instrument(name, env)
65
+ @instrumentations << [name, env]
66
+ yield
67
+ end
68
+ end
69
+
70
+ def options(hash = nil)
71
+ Faraday::Request::Instrumentation::Options.from hash
72
+ end
73
+
74
+ def conn(hash = nil)
75
+ hash ||= {}
76
+ hash[:instrumenter] = @instrumenter
77
+
78
+ Faraday.new do |f|
79
+ f.request :instrumentation, hash
80
+ f.adapter :test do |stub|
81
+ stub.get '/' do
82
+ [200, {}, 'ok']
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -1,56 +1,109 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), "..", "helper"))
1
+ require File.expand_path("../../helper", __FILE__)
2
2
 
3
3
  module Middleware
4
4
  class RetryTest < Faraday::TestCase
5
5
  def setup
6
- @stubs = Faraday::Adapter::Test::Stubs.new
7
- @conn = Faraday.new do |b|
8
- b.request :retry, 2
9
- b.use ContentValidator
10
- b.adapter :test, @stubs
11
- end
6
+ @times_called = 0
12
7
  end
13
8
 
14
- ContentValidator = Struct.new(:app) do
15
- def call(env)
16
- response = app.call(env)
17
- type = response[:content_type]
18
- raise "wrong content-type: %p" % type unless type == "application/json"
9
+ def conn(*retry_args)
10
+ Faraday.new do |b|
11
+ b.request :retry, *retry_args
12
+ b.adapter :test do |stub|
13
+ stub.post('/unstable') {
14
+ @times_called += 1
15
+ @explode.call @times_called
16
+ }
17
+ end
19
18
  end
20
19
  end
21
20
 
22
- def test_retries
23
- times_called = 0
21
+ def test_unhandled_error
22
+ @explode = lambda {|n| raise "boom!" }
23
+ assert_raises(RuntimeError) { conn.post("/unstable") }
24
+ assert_equal 1, @times_called
25
+ end
24
26
 
25
- @stubs.post("/echo") do
26
- times_called += 1
27
- [200, {}, "hello"]
28
- end
27
+ def test_handled_error
28
+ @explode = lambda {|n| raise Errno::ETIMEDOUT }
29
+ assert_raises(Errno::ETIMEDOUT) { conn.post("/unstable") }
30
+ assert_equal 3, @times_called
31
+ end
29
32
 
30
- @conn.post("/echo") rescue nil
31
- assert_equal times_called, 3
33
+ def test_legacy_max_retries
34
+ @explode = lambda {|n| raise Errno::ETIMEDOUT }
35
+ assert_raises(Errno::ETIMEDOUT) { conn(1).post("/unstable") }
36
+ assert_equal 2, @times_called
32
37
  end
33
38
 
34
- def test_retry_with_body
35
- times_called = 0
36
- bodies_received = []
39
+ def test_new_max_retries
40
+ @explode = lambda {|n| raise Errno::ETIMEDOUT }
41
+ assert_raises(Errno::ETIMEDOUT) { conn(:max => 3).post("/unstable") }
42
+ assert_equal 4, @times_called
43
+ end
44
+
45
+ def test_interval
46
+ @explode = lambda {|n| raise Errno::ETIMEDOUT }
47
+ started = Time.now
48
+ assert_raises(Errno::ETIMEDOUT) {
49
+ conn(:max => 2, :interval => 0.1).post("/unstable")
50
+ }
51
+ assert_in_delta 0.2, Time.now - started, 0.04
52
+ end
37
53
 
38
- @stubs.post("/echo") do |env|
39
- times_called += 1
40
- bodies_received << env[:body]
41
- if times_called < 2
42
- [200, {"Content-type" => "text/plain"}, "hello"]
43
- else
44
- [200, {"Content-type" => "application/json"}, '{"message": "hello"}']
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
45
68
  end
46
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
47
85
 
48
- body = {:foo => "bar"}
49
- @conn.post("/echo", body)
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
50
100
 
51
- assert_equal times_called, 2
52
- assert_same body, bodies_received[0]
53
- assert_same body, bodies_received[1]
101
+ def test_custom_exceptions
102
+ @explode = lambda {|n| raise "boom!" }
103
+ assert_raises(RuntimeError) {
104
+ conn(:exceptions => StandardError).post("/unstable")
105
+ }
106
+ assert_equal 3, @times_called
54
107
  end
55
108
  end
56
109
  end
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
1
+ require File.expand_path('../helper', __FILE__)
2
2
 
3
3
  class MiddlewareStackTest < Faraday::TestCase
4
4
  # mock handler classes
@@ -75,7 +75,7 @@ class MiddlewareStackTest < Faraday::TestCase
75
75
  @conn.get('/')
76
76
  assert @builder.locked?
77
77
 
78
- assert_raises Faraday::Builder::StackLocked do
78
+ assert_raises Faraday::RackBuilder::StackLocked do
79
79
  @conn.use Orange
80
80
  end
81
81
  end
@@ -95,16 +95,16 @@ class MiddlewareStackTest < Faraday::TestCase
95
95
  build_stack Apple
96
96
  assert_equal @builder.handlers.first, Apple
97
97
  assert_equal @builder.handlers[0,1], [Apple]
98
- assert_equal @builder.handlers.first, Faraday::Builder::Handler.new(Apple)
98
+ assert_equal @builder.handlers.first, Faraday::RackBuilder::Handler.new(Apple)
99
99
  end
100
100
 
101
101
  def test_unregistered_symbol
102
- err = assert_raise(RuntimeError) { build_stack :apple }
102
+ err = assert_raises(Faraday::Error){ build_stack :apple }
103
103
  assert_equal ":apple is not registered on Faraday::Middleware", err.message
104
104
  end
105
105
 
106
106
  def test_registered_symbol
107
- Faraday.register_middleware :apple => Apple
107
+ Faraday::Middleware.register_middleware :apple => Apple
108
108
  begin
109
109
  build_stack :apple
110
110
  assert_handlers %w[Apple]
@@ -114,7 +114,7 @@ class MiddlewareStackTest < Faraday::TestCase
114
114
  end
115
115
 
116
116
  def test_registered_symbol_with_proc
117
- Faraday.register_middleware :apple => lambda { Apple }
117
+ Faraday::Middleware.register_middleware :apple => lambda { Apple }
118
118
  begin
119
119
  build_stack :apple
120
120
  assert_handlers %w[Apple]
@@ -123,13 +123,14 @@ class MiddlewareStackTest < Faraday::TestCase
123
123
  end
124
124
  end
125
125
 
126
- def test_registered_symbol_with_type
127
- Faraday.register_middleware :request, :orange => Orange
126
+ def test_registered_symbol_with_array
127
+ Faraday::Middleware.register_middleware File.expand_path("..", __FILE__),
128
+ :strawberry => [lambda { Strawberry }, 'strawberry']
128
129
  begin
129
- build_stack {|b| b.request :orange }
130
- assert_handlers %w[Orange]
130
+ build_stack :strawberry
131
+ assert_handlers %w[Strawberry]
131
132
  ensure
132
- unregister_middleware Faraday::Request, :orange
133
+ unregister_middleware Faraday::Middleware, :strawberry
133
134
  end
134
135
  end
135
136
 
@@ -148,7 +149,7 @@ class MiddlewareStackTest < Faraday::TestCase
148
149
  def build_stack(*handlers)
149
150
  @builder.build do |b|
150
151
  handlers.each { |handler| b.use(*handler) }
151
- yield b if block_given?
152
+ yield(b) if block_given?
152
153
 
153
154
  b.adapter :test do |stub|
154
155
  stub.get '/' do |env|
@@ -0,0 +1,252 @@
1
+ require File.expand_path('../helper', __FILE__)
2
+
3
+ class OptionsTest < Faraday::TestCase
4
+ class SubOptions < Faraday::Options.new(:sub); end
5
+ class ParentOptions < Faraday::Options.new(:a, :b, :c)
6
+ options :c => SubOptions
7
+ end
8
+
9
+ def test_clear
10
+ options = SubOptions.new(1)
11
+ assert !options.empty?
12
+ assert options.clear
13
+ assert options.empty?
14
+ end
15
+
16
+ def test_empty
17
+ options = SubOptions.new
18
+ assert options.empty?
19
+ options.sub = 1
20
+ assert !options.empty?
21
+ options.delete(:sub)
22
+ assert options.empty?
23
+ end
24
+
25
+ def test_each_key
26
+ options = ParentOptions.new(1, 2, 3)
27
+ enum = options.each_key
28
+ assert_equal enum.next.to_sym, :a
29
+ assert_equal enum.next.to_sym, :b
30
+ assert_equal enum.next.to_sym, :c
31
+ end
32
+
33
+ def test_key?
34
+ options = SubOptions.new
35
+ assert !options.key?(:sub)
36
+ options.sub = 1
37
+ if RUBY_VERSION >= '1.9'
38
+ assert options.key?(:sub)
39
+ else
40
+ assert options.key?("sub")
41
+ end
42
+ end
43
+
44
+ def test_each_value
45
+ options = ParentOptions.new(1, 2, 3)
46
+ enum = options.each_value
47
+ assert_equal enum.next, 1
48
+ assert_equal enum.next, 2
49
+ assert_equal enum.next, 3
50
+ end
51
+
52
+ def test_value?
53
+ options = SubOptions.new
54
+ assert !options.value?(1)
55
+ options.sub = 1
56
+ assert options.value?(1)
57
+ end
58
+
59
+ def test_request_proxy_setter
60
+ options = Faraday::RequestOptions.new
61
+ assert_nil options.proxy
62
+
63
+ assert_raises NoMethodError do
64
+ options[:proxy] = {:booya => 1}
65
+ end
66
+
67
+ options[:proxy] = {:user => 'user'}
68
+ assert_kind_of Faraday::ProxyOptions, options.proxy
69
+ assert_equal 'user', options.proxy.user
70
+
71
+ options.proxy = nil
72
+ assert_nil options.proxy
73
+ end
74
+
75
+ def test_proxy_options_from_string
76
+ options = Faraday::ProxyOptions.from 'http://user:pass@example.org'
77
+ assert_equal 'user', options.user
78
+ assert_equal 'pass', options.password
79
+ assert_kind_of URI, options.uri
80
+ assert_equal '', options.path
81
+ assert_equal 80, options.port
82
+ assert_equal 'example.org', options.host
83
+ assert_equal 'http', options.scheme
84
+ end
85
+
86
+ def test_proxy_options_hash_access
87
+ proxy = Faraday::ProxyOptions.from 'http://a%40b:pw%20d@example.org'
88
+ assert_equal 'a@b', proxy[:user]
89
+ assert_equal 'a@b', proxy.user
90
+ assert_equal 'pw d', proxy[:password]
91
+ assert_equal 'pw d', proxy.password
92
+ end
93
+
94
+ def test_proxy_options_no_auth
95
+ proxy = Faraday::ProxyOptions.from 'http://example.org'
96
+ assert_nil proxy.user
97
+ assert_nil proxy.password
98
+ end
99
+
100
+ def test_from_options
101
+ options = ParentOptions.new(1)
102
+
103
+ value = ParentOptions.from(options)
104
+ assert_equal 1, value.a
105
+ assert_nil value.b
106
+ end
107
+
108
+ def test_from_options_with_sub_object
109
+ sub = SubOptions.new(1)
110
+ options = ParentOptions.from :a => 1, :c => sub
111
+ assert_kind_of ParentOptions, options
112
+ assert_equal 1, options.a
113
+ assert_nil options.b
114
+ assert_kind_of SubOptions, options.c
115
+ assert_equal 1, options.c.sub
116
+ end
117
+
118
+ def test_from_hash
119
+ options = ParentOptions.from :a => 1
120
+ assert_kind_of ParentOptions, options
121
+ assert_equal 1, options.a
122
+ assert_nil options.b
123
+ end
124
+
125
+ def test_from_hash_with_sub_object
126
+ options = ParentOptions.from :a => 1, :c => {:sub => 1}
127
+ assert_kind_of ParentOptions, options
128
+ assert_equal 1, options.a
129
+ assert_nil options.b
130
+ assert_kind_of SubOptions, options.c
131
+ assert_equal 1, options.c.sub
132
+ end
133
+
134
+ def test_inheritance
135
+ subclass = Class.new(ParentOptions)
136
+ options = subclass.from(:c => {:sub => 'hello'})
137
+ assert_kind_of SubOptions, options.c
138
+ assert_equal 'hello', options.c.sub
139
+ end
140
+
141
+ def test_from_deep_hash
142
+ hash = {:b => 1}
143
+ options = ParentOptions.from :a => hash
144
+ assert_equal 1, options.a[:b]
145
+
146
+ hash[:b] = 2
147
+ assert_equal 1, options.a[:b]
148
+
149
+ options.a[:b] = 3
150
+ assert_equal 2, hash[:b]
151
+ assert_equal 3, options.a[:b]
152
+ end
153
+
154
+ def test_from_nil
155
+ options = ParentOptions.from(nil)
156
+ assert_kind_of ParentOptions, options
157
+ assert_nil options.a
158
+ assert_nil options.b
159
+ end
160
+
161
+ def test_invalid_key
162
+ assert_raises NoMethodError do
163
+ ParentOptions.from :invalid => 1
164
+ end
165
+ end
166
+
167
+ def test_update
168
+ options = ParentOptions.new(1)
169
+ assert_equal 1, options.a
170
+ assert_nil options.b
171
+
172
+ updated = options.update :a => 2, :b => 3
173
+ assert_equal 2, options.a
174
+ assert_equal 3, options.b
175
+ assert_equal options, updated
176
+ end
177
+
178
+ def test_delete
179
+ options = ParentOptions.new(1)
180
+ assert_equal 1, options.a
181
+ assert_equal 1, options.delete(:a)
182
+ assert_nil options.a
183
+ end
184
+
185
+ def test_merge
186
+ options = ParentOptions.new(1)
187
+ assert_equal 1, options.a
188
+ assert_nil options.b
189
+
190
+ dup = options.merge :a => 2, :b => 3
191
+ assert_equal 2, dup.a
192
+ assert_equal 3, dup.b
193
+ assert_equal 1, options.a
194
+ assert_nil options.b
195
+ end
196
+
197
+ def test_env_access_member
198
+ e = Faraday::Env.new
199
+ assert_nil e.method
200
+ e.method = :get
201
+ assert_equal :get, e.method
202
+ end
203
+
204
+ def test_env_access_symbol_non_member
205
+ e = Faraday::Env.new
206
+ assert_nil e[:custom]
207
+ e[:custom] = :boom
208
+ assert_equal :boom, e[:custom]
209
+ end
210
+
211
+ def test_env_access_string_non_member
212
+ e = Faraday::Env.new
213
+ assert_nil e["custom"]
214
+ e["custom"] = :boom
215
+ assert_equal :boom, e["custom"]
216
+ end
217
+
218
+ def test_env_fetch_ignores_false
219
+ ssl = Faraday::SSLOptions.new
220
+ ssl.verify = false
221
+ assert !ssl.fetch(:verify, true)
222
+ end
223
+
224
+ def test_fetch_grabs_value
225
+ opt = Faraday::SSLOptions.new
226
+ opt.verify = 1
227
+ assert_equal 1, opt.fetch(:verify, false) { |k| :blah }
228
+ end
229
+
230
+ def test_fetch_uses_falsey_default
231
+ opt = Faraday::SSLOptions.new
232
+ assert_equal false, opt.fetch(:verify, false) { |k| :blah }
233
+ end
234
+
235
+ def test_fetch_accepts_block
236
+ opt = Faraday::SSLOptions.new
237
+ assert_equal "yo :verify", opt.fetch(:verify) { |k| "yo #{k.inspect}"}
238
+ end
239
+
240
+ def test_fetch_needs_a_default_if_key_is_missing
241
+ opt = Faraday::SSLOptions.new
242
+ assert_raises Faraday::Options.fetch_error_class do
243
+ opt.fetch :verify
244
+ end
245
+ end
246
+
247
+ def test_fetch_works_with_key
248
+ opt = Faraday::SSLOptions.new
249
+ opt.verify = 1
250
+ assert_equal 1, opt.fetch(:verify)
251
+ end
252
+ end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
+ require File.expand_path('../helper', __FILE__)
3
3
 
4
4
  Faraday::CompositeReadIO.class_eval { attr_reader :ios }
5
5
 
@@ -62,6 +62,16 @@ class RequestMiddlewareTest < Faraday::TestCase
62
62
  assert_equal expected, Faraday::Utils.parse_nested_query(response.body)
63
63
  end
64
64
 
65
+ def test_url_encoded_non_nested
66
+ response = @conn.post('/echo', { :dimensions => ['date', 'location']}) do |req|
67
+ req.options.params_encoder = Faraday::FlatParamsEncoder
68
+ end
69
+ assert_equal 'application/x-www-form-urlencoded', response.headers['Content-Type']
70
+ expected = { 'dimensions' => ['date', 'location'] }
71
+ assert_equal expected, Faraday::Utils.parse_query(response.body)
72
+ assert_equal 'dimensions=date&dimensions=location', response.body
73
+ end
74
+
65
75
  def test_url_encoded_unicode
66
76
  err = capture_warnings {
67
77
  response = @conn.post('/echo', {:str => "eé cç aã aâ"})
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
1
+ require File.expand_path('../helper', __FILE__)
2
2
 
3
3
  class ResponseMiddlewareTest < Faraday::TestCase
4
4
  def setup
@@ -19,9 +19,7 @@ class ResponseMiddlewareTest < Faraday::TestCase
19
19
  end
20
20
 
21
21
  def test_success
22
- assert_nothing_raised do
23
- @conn.get('ok')
24
- end
22
+ assert @conn.get('ok')
25
23
  end
26
24
 
27
25
  def test_raises_not_found
@@ -0,0 +1,2 @@
1
+ class MiddlewareStackTest::Strawberry < MiddlewareStackTest::Handler
2
+ end
data/test/utils_test.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  require File.expand_path('../helper', __FILE__)
2
2
 
3
3
  class TestUtils < Faraday::TestCase
4
+ def setup
5
+ @url = "http://example.com/abc"
6
+ end
4
7
 
5
8
  # emulates ActiveSupport::SafeBuffer#gsub
6
9
  FakeSafeBuffer = Struct.new(:string) do
@@ -8,7 +11,7 @@ class TestUtils < Faraday::TestCase
8
11
  def gsub(regex)
9
12
  string.gsub(regex) {
10
13
  match, = $&, '' =~ /a/
11
- yield match
14
+ yield(match)
12
15
  }
13
16
  end
14
17
  end
@@ -18,13 +21,38 @@ class TestUtils < Faraday::TestCase
18
21
  assert_equal '%2432%2C000.00', Faraday::Utils.escape(str)
19
22
  end
20
23
 
21
- def test_replace_header_hash
22
- headers = Faraday::Utils::Headers.new('authorization' => 't0ps3cr3t!')
23
- assert headers.include?('authorization')
24
+ def test_parses_with_default
25
+ with_default_uri_parser(nil) do
26
+ uri = normalize(@url)
27
+ assert_equal 'example.com', uri.host
28
+ end
29
+ end
24
30
 
25
- headers.replace({'content-type' => 'text/plain'})
31
+ def test_parses_with_URI
32
+ with_default_uri_parser(::URI) do
33
+ uri = normalize(@url)
34
+ assert_equal 'example.com', uri.host
35
+ end
36
+ end
26
37
 
27
- assert !headers.include?('authorization')
38
+ def test_parses_with_block
39
+ with_default_uri_parser(lambda {|u| "booya#{"!" * u.size}" }) do
40
+ assert_equal 'booya!!!!!!!!!!!!!!!!!!!!!!', normalize(@url)
41
+ end
42
+ end
43
+
44
+ def normalize(url)
45
+ Faraday::Utils::URI(url)
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
28
56
  end
29
57
  end
30
58