faraday 0.6.0 → 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 (83) hide show
  1. checksums.yaml +7 -0
  2. data/.document +6 -0
  3. data/CHANGELOG.md +15 -0
  4. data/CONTRIBUTING.md +36 -0
  5. data/Gemfile +25 -15
  6. data/{LICENSE → LICENSE.md} +1 -1
  7. data/README.md +187 -137
  8. data/Rakefile +38 -101
  9. data/faraday.gemspec +26 -81
  10. data/lib/faraday/adapter/em_http.rb +237 -0
  11. data/lib/faraday/adapter/em_http_ssl_patch.rb +56 -0
  12. data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +66 -0
  13. data/lib/faraday/adapter/em_synchrony.rb +65 -38
  14. data/lib/faraday/adapter/excon.rb +60 -9
  15. data/lib/faraday/adapter/httpclient.rb +106 -0
  16. data/lib/faraday/adapter/net_http.rb +89 -38
  17. data/lib/faraday/adapter/net_http_persistent.rb +47 -0
  18. data/lib/faraday/adapter/patron.rb +46 -9
  19. data/lib/faraday/adapter/rack.rb +58 -0
  20. data/lib/faraday/adapter/test.rb +68 -28
  21. data/lib/faraday/adapter/typhoeus.rb +94 -16
  22. data/lib/faraday/adapter.rb +33 -25
  23. data/lib/faraday/autoload.rb +85 -0
  24. data/lib/faraday/connection.rb +342 -134
  25. data/lib/faraday/error.rb +44 -29
  26. data/lib/faraday/middleware.rb +18 -10
  27. data/lib/faraday/options.rb +350 -0
  28. data/lib/faraday/parameters.rb +193 -0
  29. data/lib/faraday/rack_builder.rb +212 -0
  30. data/lib/faraday/request/authorization.rb +42 -0
  31. data/lib/faraday/request/basic_authentication.rb +13 -0
  32. data/lib/faraday/request/instrumentation.rb +36 -0
  33. data/lib/faraday/request/multipart.rb +15 -15
  34. data/lib/faraday/request/retry.rb +118 -0
  35. data/lib/faraday/request/token_authentication.rb +15 -0
  36. data/lib/faraday/request/url_encoded.rb +8 -9
  37. data/lib/faraday/request.rb +46 -45
  38. data/lib/faraday/response/logger.rb +4 -4
  39. data/lib/faraday/response/raise_error.rb +8 -3
  40. data/lib/faraday/response.rb +20 -25
  41. data/lib/faraday/upload_io.rb +51 -7
  42. data/lib/faraday/utils.rb +240 -44
  43. data/lib/faraday.rb +218 -38
  44. data/script/console +7 -0
  45. data/script/generate_certs +42 -0
  46. data/script/package +7 -0
  47. data/script/proxy-server +42 -0
  48. data/script/release +17 -0
  49. data/script/server +36 -0
  50. data/script/test +172 -0
  51. data/test/adapters/default_test.rb +14 -0
  52. data/test/adapters/em_http_test.rb +20 -0
  53. data/test/adapters/em_synchrony_test.rb +20 -0
  54. data/test/adapters/excon_test.rb +20 -0
  55. data/test/adapters/httpclient_test.rb +21 -0
  56. data/test/adapters/integration.rb +254 -0
  57. data/test/adapters/logger_test.rb +3 -3
  58. data/test/adapters/net_http_persistent_test.rb +20 -0
  59. data/test/adapters/net_http_test.rb +6 -25
  60. data/test/adapters/patron_test.rb +20 -0
  61. data/test/adapters/rack_test.rb +31 -0
  62. data/test/adapters/test_middleware_test.rb +74 -3
  63. data/test/adapters/typhoeus_test.rb +28 -0
  64. data/test/authentication_middleware_test.rb +65 -0
  65. data/test/composite_read_io_test.rb +111 -0
  66. data/test/connection_test.rb +381 -104
  67. data/test/env_test.rb +116 -40
  68. data/test/helper.rb +61 -25
  69. data/test/live_server.rb +55 -29
  70. data/test/middleware/instrumentation_test.rb +88 -0
  71. data/test/middleware/retry_test.rb +109 -0
  72. data/test/middleware_stack_test.rb +87 -5
  73. data/test/multibyte.txt +1 -0
  74. data/test/options_test.rb +252 -0
  75. data/test/request_middleware_test.rb +78 -21
  76. data/test/response_middleware_test.rb +32 -7
  77. data/test/strawberry.rb +2 -0
  78. data/test/utils_test.rb +58 -0
  79. metadata +116 -117
  80. data/lib/faraday/adapter/action_dispatch.rb +0 -30
  81. data/lib/faraday/builder.rb +0 -137
  82. data/lib/faraday/request/json.rb +0 -31
  83. data/test/adapters/live_test.rb +0 -186
@@ -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
@@ -12,22 +12,24 @@ class MiddlewareStackTest < Faraday::TestCase
12
12
  class Orange < Handler; end
13
13
  class Banana < Handler; end
14
14
 
15
+ class Broken < Faraday::Middleware
16
+ dependency 'zomg/i_dont/exist'
17
+ end
18
+
15
19
  def setup
16
20
  @conn = Faraday::Connection.new
17
21
  @builder = @conn.builder
18
22
  end
19
23
 
20
24
  def test_sets_default_adapter_if_none_set
21
- default_middleware = Faraday::Request.lookup_module :url_encoded
22
- default_adapter_klass = Faraday::Adapter.lookup_module Faraday.default_adapter
25
+ default_middleware = Faraday::Request.lookup_middleware :url_encoded
26
+ default_adapter_klass = Faraday::Adapter.lookup_middleware Faraday.default_adapter
23
27
  assert @builder[0] == default_middleware
24
28
  assert @builder[1] == default_adapter_klass
25
29
  end
26
30
 
27
31
  def test_allows_rebuilding
28
32
  build_stack Apple
29
- assert_handlers %w[Apple]
30
-
31
33
  build_stack Orange
32
34
  assert_handlers %w[Orange]
33
35
  end
@@ -67,12 +69,87 @@ class MiddlewareStackTest < Faraday::TestCase
67
69
  assert_handlers %w[Orange]
68
70
  end
69
71
 
72
+ def test_stack_is_locked_after_making_requests
73
+ build_stack Apple
74
+ assert !@builder.locked?
75
+ @conn.get('/')
76
+ assert @builder.locked?
77
+
78
+ assert_raises Faraday::RackBuilder::StackLocked do
79
+ @conn.use Orange
80
+ end
81
+ end
82
+
83
+ def test_duped_stack_is_unlocked
84
+ build_stack Apple
85
+ assert !@builder.locked?
86
+ @builder.lock!
87
+ assert @builder.locked?
88
+
89
+ duped_connection = @conn.dup
90
+ assert_equal @builder, duped_connection.builder
91
+ assert !duped_connection.builder.locked?
92
+ end
93
+
94
+ def test_handler_comparison
95
+ build_stack Apple
96
+ assert_equal @builder.handlers.first, Apple
97
+ assert_equal @builder.handlers[0,1], [Apple]
98
+ assert_equal @builder.handlers.first, Faraday::RackBuilder::Handler.new(Apple)
99
+ end
100
+
101
+ def test_unregistered_symbol
102
+ err = assert_raises(Faraday::Error){ build_stack :apple }
103
+ assert_equal ":apple is not registered on Faraday::Middleware", err.message
104
+ end
105
+
106
+ def test_registered_symbol
107
+ Faraday::Middleware.register_middleware :apple => Apple
108
+ begin
109
+ build_stack :apple
110
+ assert_handlers %w[Apple]
111
+ ensure
112
+ unregister_middleware Faraday::Middleware, :apple
113
+ end
114
+ end
115
+
116
+ def test_registered_symbol_with_proc
117
+ Faraday::Middleware.register_middleware :apple => lambda { Apple }
118
+ begin
119
+ build_stack :apple
120
+ assert_handlers %w[Apple]
121
+ ensure
122
+ unregister_middleware Faraday::Middleware, :apple
123
+ end
124
+ end
125
+
126
+ def test_registered_symbol_with_array
127
+ Faraday::Middleware.register_middleware File.expand_path("..", __FILE__),
128
+ :strawberry => [lambda { Strawberry }, 'strawberry']
129
+ begin
130
+ build_stack :strawberry
131
+ assert_handlers %w[Strawberry]
132
+ ensure
133
+ unregister_middleware Faraday::Middleware, :strawberry
134
+ end
135
+ end
136
+
137
+ def test_missing_dependencies
138
+ build_stack Broken
139
+ err = assert_raises RuntimeError do
140
+ @conn.get('/')
141
+ end
142
+ assert_match "missing dependency for MiddlewareStackTest::Broken: ", err.message
143
+ assert_match "zomg/i_dont/exist", err.message
144
+ end
145
+
70
146
  private
71
147
 
72
148
  # make a stack with test adapter that reflects the order of middleware
73
149
  def build_stack(*handlers)
74
150
  @builder.build do |b|
75
151
  handlers.each { |handler| b.use(*handler) }
152
+ yield(b) if block_given?
76
153
 
77
154
  b.adapter :test do |stub|
78
155
  stub.get '/' do |env|
@@ -88,4 +165,9 @@ class MiddlewareStackTest < Faraday::TestCase
88
165
  echoed_list.shift if echoed_list.first == ''
89
166
  assert_equal list, echoed_list
90
167
  end
168
+
169
+ def unregister_middleware(component, key)
170
+ # TODO: unregister API?
171
+ component.instance_variable_get('@registered_middleware').delete(key)
172
+ end
91
173
  end
@@ -0,0 +1 @@
1
+ ファイル
@@ -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,14 +1,13 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
- require 'rack/utils'
1
+ # encoding: utf-8
2
+ require File.expand_path('../helper', __FILE__)
3
3
 
4
- Faraday::CompositeReadIO.send :attr_reader, :ios
4
+ Faraday::CompositeReadIO.class_eval { attr_reader :ios }
5
5
 
6
6
  class RequestMiddlewareTest < Faraday::TestCase
7
7
  def setup
8
8
  @conn = Faraday.new do |b|
9
9
  b.request :multipart
10
10
  b.request :url_encoded
11
- b.request :json
12
11
  b.adapter :test do |stub|
13
12
  stub.post('/echo') do |env|
14
13
  posted_as = env[:request_headers]['Content-Type']
@@ -18,6 +17,20 @@ class RequestMiddlewareTest < Faraday::TestCase
18
17
  end
19
18
  end
20
19
 
20
+ def with_utf8
21
+ if defined?(RUBY_VERSION) && RUBY_VERSION.match(/1.8.\d/)
22
+ begin
23
+ previous_kcode = $KCODE
24
+ $KCODE = "UTF8"
25
+ yield
26
+ ensure
27
+ $KCODE = previous_kcode
28
+ end
29
+ else
30
+ yield
31
+ end
32
+ end
33
+
21
34
  def test_does_nothing_without_payload
22
35
  response = @conn.post('/echo')
23
36
  assert_nil response.headers['Content-Type']
@@ -30,22 +43,10 @@ class RequestMiddlewareTest < Faraday::TestCase
30
43
  assert_equal({ :some => 'data' }, response.body)
31
44
  end
32
45
 
33
- def test_json_encodes_hash
34
- response = @conn.post('/echo', { :fruit => %w[apples oranges] }, 'content-type' => 'application/json')
35
- assert_equal 'application/json', response.headers['Content-Type']
36
- assert_equal '{"fruit":["apples","oranges"]}', response.body
37
- end
38
-
39
- def test_json_skips_encoding_for_strings
40
- response = @conn.post('/echo', '{"a":"b"}', 'content-type' => 'application/json')
41
- assert_equal 'application/json', response.headers['Content-Type']
42
- assert_equal '{"a":"b"}', response.body
43
- end
44
-
45
46
  def test_url_encoded_no_header
46
47
  response = @conn.post('/echo', { :fruit => %w[apples oranges] })
47
48
  assert_equal 'application/x-www-form-urlencoded', response.headers['Content-Type']
48
- assert_equal 'fruit[]=apples&fruit[]=oranges', response.body
49
+ assert_equal 'fruit%5B%5D=apples&fruit%5B%5D=oranges', response.body
49
50
  end
50
51
 
51
52
  def test_url_encoded_with_header
@@ -58,7 +59,40 @@ class RequestMiddlewareTest < Faraday::TestCase
58
59
  response = @conn.post('/echo', { :user => {:name => 'Mislav', :web => 'mislav.net'} })
59
60
  assert_equal 'application/x-www-form-urlencoded', response.headers['Content-Type']
60
61
  expected = { 'user' => {'name' => 'Mislav', 'web' => 'mislav.net'} }
61
- assert_equal expected, Rack::Utils.parse_nested_query(response.body)
62
+ assert_equal expected, Faraday::Utils.parse_nested_query(response.body)
63
+ end
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
+
75
+ def test_url_encoded_unicode
76
+ err = capture_warnings {
77
+ response = @conn.post('/echo', {:str => "eé cç aã aâ"})
78
+ assert_equal "str=e%C3%A9+c%C3%A7+a%C3%A3+a%C3%A2", response.body
79
+ }
80
+ assert err.empty?, "stderr did include: #{err}"
81
+ end
82
+
83
+ def test_url_encoded_unicode_with_kcode_set
84
+ with_utf8 do
85
+ err = capture_warnings {
86
+ response = @conn.post('/echo', {:str => "eé cç aã aâ"})
87
+ assert_equal "str=e%C3%A9+c%C3%A7+a%C3%A3+a%C3%A2", response.body
88
+ }
89
+ assert err.empty?, "stderr did include: #{err}"
90
+ end
91
+ end
92
+
93
+ def test_url_encoded_nested_keys
94
+ response = @conn.post('/echo', {'a'=>{'b'=>{'c'=>['d']}}})
95
+ assert_equal "a%5Bb%5D%5Bc%5D%5B%5D=d", response.body
62
96
  end
63
97
 
64
98
  def test_multipart
@@ -72,14 +106,37 @@ class RequestMiddlewareTest < Faraday::TestCase
72
106
  response = @conn.post('/echo', payload)
73
107
 
74
108
  assert_kind_of Faraday::CompositeReadIO, response.body
75
- 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,
76
110
  response.headers['Content-Type']
77
-
78
- response.body.send(:ios).map(&:read).each do |io|
111
+
112
+ response.body.send(:ios).map{|io| io.read}.each do |io|
113
+ if re = regexes.detect { |r| io =~ r }
114
+ regexes.delete re
115
+ end
116
+ end
117
+ assert_equal [], regexes
118
+ end
119
+
120
+ def test_multipart_with_arrays
121
+ # assume params are out of order
122
+ regexes = [
123
+ /name\=\"a\"/,
124
+ /name=\"b\[\]\[c\]\"\; filename\=\"request_middleware_test\.rb\"/,
125
+ /name=\"b\[\]\[d\]\"/]
126
+
127
+ payload = {:a => 1, :b =>[{:c => Faraday::UploadIO.new(__FILE__, 'text/x-ruby'), :d => 2}]}
128
+ response = @conn.post('/echo', payload)
129
+
130
+ assert_kind_of Faraday::CompositeReadIO, response.body
131
+ assert_equal "multipart/form-data; boundary=%s" % Faraday::Request::Multipart::DEFAULT_BOUNDARY,
132
+ response.headers['Content-Type']
133
+
134
+ response.body.send(:ios).map{|io| io.read}.each do |io|
79
135
  if re = regexes.detect { |r| io =~ r }
80
136
  regexes.delete re
81
137
  end
82
138
  end
83
139
  assert_equal [], regexes
84
140
  end
141
+
85
142
  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 ResponseMiddlewareTest < Faraday::TestCase
4
4
  def setup
@@ -19,11 +19,9 @@ 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
28
26
  error = assert_raises Faraday::Error::ResourceNotFound do
29
27
  @conn.get('not-found')
@@ -31,7 +29,7 @@ class ResponseMiddlewareTest < Faraday::TestCase
31
29
  assert_equal 'the server responded with status 404', error.message
32
30
  assert_equal 'because', error.response[:headers]['X-Reason']
33
31
  end
34
-
32
+
35
33
  def test_raises_error
36
34
  error = assert_raises Faraday::Error::ClientError do
37
35
  @conn.get('error')
@@ -39,9 +37,36 @@ class ResponseMiddlewareTest < Faraday::TestCase
39
37
  assert_equal 'the server responded with status 500', error.message
40
38
  assert_equal 'bailout', error.response[:headers]['X-Error']
41
39
  end
42
-
40
+
43
41
  def test_upcase
44
42
  @conn.builder.insert(0, ResponseUpcaser)
45
43
  assert_equal '<BODY></BODY>', @conn.get('ok').body
46
44
  end
47
45
  end
46
+
47
+ class ResponseNoBodyMiddleWareTest < Faraday::TestCase
48
+ def setup
49
+ @conn = Faraday.new do |b|
50
+ b.response :raise_error
51
+ b.adapter :test do |stub|
52
+ stub.get('not_modified') { [304, nil, nil] }
53
+ stub.get('no_content') { [204, nil, nil] }
54
+ end
55
+ end
56
+ @conn.builder.insert(0, NotCalled)
57
+ end
58
+
59
+ class NotCalled < Faraday::Response::Middleware
60
+ def parse(body)
61
+ raise "this should not be called"
62
+ end
63
+ end
64
+
65
+ def test_204
66
+ assert_equal nil, @conn.get('no_content').body
67
+ end
68
+
69
+ def test_304
70
+ assert_equal nil, @conn.get('not_modified').body
71
+ end
72
+ end
@@ -0,0 +1,2 @@
1
+ class MiddlewareStackTest::Strawberry < MiddlewareStackTest::Handler
2
+ end
@@ -0,0 +1,58 @@
1
+ require File.expand_path('../helper', __FILE__)
2
+
3
+ class TestUtils < Faraday::TestCase
4
+ def setup
5
+ @url = "http://example.com/abc"
6
+ end
7
+
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)
22
+ end
23
+
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
30
+
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
37
+
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
56
+ end
57
+ end
58
+