faraday 0.7.4 → 1.0.1
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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +276 -0
- data/LICENSE.md +1 -1
- data/README.md +40 -153
- data/Rakefile +4 -139
- data/examples/client_spec.rb +65 -0
- data/examples/client_test.rb +79 -0
- data/lib/faraday/adapter/em_http.rb +286 -0
- data/lib/faraday/adapter/em_http_ssl_patch.rb +62 -0
- data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +69 -0
- data/lib/faraday/adapter/em_synchrony.rb +120 -36
- data/lib/faraday/adapter/excon.rb +108 -12
- data/lib/faraday/adapter/httpclient.rb +152 -0
- data/lib/faraday/adapter/net_http.rb +187 -43
- data/lib/faraday/adapter/net_http_persistent.rb +91 -0
- data/lib/faraday/adapter/patron.rb +106 -10
- data/lib/faraday/adapter/rack.rb +75 -0
- data/lib/faraday/adapter/test.rb +160 -61
- data/lib/faraday/adapter/typhoeus.rb +7 -46
- data/lib/faraday/adapter.rb +105 -33
- data/lib/faraday/adapter_registry.rb +30 -0
- data/lib/faraday/autoload.rb +95 -0
- data/lib/faraday/connection.rb +525 -157
- data/lib/faraday/dependency_loader.rb +37 -0
- data/lib/faraday/encoders/flat_params_encoder.rb +98 -0
- data/lib/faraday/encoders/nested_params_encoder.rb +171 -0
- data/lib/faraday/error.rb +122 -30
- data/lib/faraday/file_part.rb +128 -0
- data/lib/faraday/logging/formatter.rb +105 -0
- data/lib/faraday/middleware.rb +14 -22
- data/lib/faraday/middleware_registry.rb +129 -0
- data/lib/faraday/options/connection_options.rb +22 -0
- data/lib/faraday/options/env.rb +181 -0
- data/lib/faraday/options/proxy_options.rb +28 -0
- data/lib/faraday/options/request_options.rb +22 -0
- data/lib/faraday/options/ssl_options.rb +59 -0
- data/lib/faraday/options.rb +222 -0
- data/lib/faraday/param_part.rb +53 -0
- data/lib/faraday/parameters.rb +5 -0
- data/lib/faraday/rack_builder.rb +248 -0
- data/lib/faraday/request/authorization.rb +55 -0
- data/lib/faraday/request/basic_authentication.rb +20 -0
- data/lib/faraday/request/instrumentation.rb +54 -0
- data/lib/faraday/request/multipart.rb +84 -48
- data/lib/faraday/request/retry.rb +239 -0
- data/lib/faraday/request/token_authentication.rb +20 -0
- data/lib/faraday/request/url_encoded.rb +46 -27
- data/lib/faraday/request.rb +112 -50
- data/lib/faraday/response/logger.rb +24 -25
- data/lib/faraday/response/raise_error.rb +40 -11
- data/lib/faraday/response.rb +44 -35
- data/lib/faraday/utils/headers.rb +139 -0
- data/lib/faraday/utils/params_hash.rb +61 -0
- data/lib/faraday/utils.rb +72 -117
- data/lib/faraday.rb +142 -64
- data/spec/external_adapters/faraday_specs_setup.rb +14 -0
- data/spec/faraday/adapter/em_http_spec.rb +47 -0
- data/spec/faraday/adapter/em_synchrony_spec.rb +16 -0
- data/spec/faraday/adapter/excon_spec.rb +49 -0
- data/spec/faraday/adapter/httpclient_spec.rb +73 -0
- data/spec/faraday/adapter/net_http_persistent_spec.rb +57 -0
- data/spec/faraday/adapter/net_http_spec.rb +64 -0
- data/spec/faraday/adapter/patron_spec.rb +18 -0
- data/spec/faraday/adapter/rack_spec.rb +8 -0
- data/spec/faraday/adapter/typhoeus_spec.rb +7 -0
- data/spec/faraday/adapter_registry_spec.rb +28 -0
- data/spec/faraday/adapter_spec.rb +55 -0
- data/spec/faraday/composite_read_io_spec.rb +80 -0
- data/spec/faraday/connection_spec.rb +691 -0
- data/spec/faraday/error_spec.rb +45 -0
- data/spec/faraday/middleware_spec.rb +26 -0
- data/spec/faraday/options/env_spec.rb +70 -0
- data/spec/faraday/options/options_spec.rb +297 -0
- data/spec/faraday/options/proxy_options_spec.rb +37 -0
- data/spec/faraday/options/request_options_spec.rb +19 -0
- data/spec/faraday/params_encoders/flat_spec.rb +34 -0
- data/spec/faraday/params_encoders/nested_spec.rb +134 -0
- data/spec/faraday/rack_builder_spec.rb +196 -0
- data/spec/faraday/request/authorization_spec.rb +88 -0
- data/spec/faraday/request/instrumentation_spec.rb +76 -0
- data/spec/faraday/request/multipart_spec.rb +274 -0
- data/spec/faraday/request/retry_spec.rb +242 -0
- data/spec/faraday/request/url_encoded_spec.rb +83 -0
- data/spec/faraday/request_spec.rb +109 -0
- data/spec/faraday/response/logger_spec.rb +220 -0
- data/spec/faraday/response/middleware_spec.rb +68 -0
- data/spec/faraday/response/raise_error_spec.rb +106 -0
- data/spec/faraday/response_spec.rb +75 -0
- data/spec/faraday/utils/headers_spec.rb +82 -0
- data/spec/faraday/utils_spec.rb +56 -0
- data/spec/faraday_spec.rb +37 -0
- data/spec/spec_helper.rb +132 -0
- data/spec/support/disabling_stub.rb +14 -0
- data/spec/support/fake_safe_buffer.rb +15 -0
- data/spec/support/helper_methods.rb +133 -0
- data/spec/support/shared_examples/adapter.rb +104 -0
- data/spec/support/shared_examples/params_encoder.rb +18 -0
- data/spec/support/shared_examples/request_method.rb +234 -0
- data/spec/support/streaming_response_checker.rb +35 -0
- data/spec/support/webmock_rack_app.rb +68 -0
- metadata +126 -126
- data/Gemfile +0 -29
- data/config.ru +0 -6
- data/faraday.gemspec +0 -92
- data/lib/faraday/adapter/action_dispatch.rb +0 -29
- data/lib/faraday/builder.rb +0 -160
- data/lib/faraday/request/json.rb +0 -35
- data/lib/faraday/upload_io.rb +0 -23
- data/test/adapters/live_test.rb +0 -205
- data/test/adapters/logger_test.rb +0 -37
- data/test/adapters/net_http_test.rb +0 -33
- data/test/adapters/test_middleware_test.rb +0 -70
- data/test/connection_test.rb +0 -254
- data/test/env_test.rb +0 -158
- data/test/helper.rb +0 -41
- data/test/live_server.rb +0 -45
- data/test/middleware_stack_test.rb +0 -118
- data/test/request_middleware_test.rb +0 -116
- data/test/response_middleware_test.rb +0 -74
data/test/env_test.rb
DELETED
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
|
|
2
|
-
|
|
3
|
-
class EnvTest < Faraday::TestCase
|
|
4
|
-
def setup
|
|
5
|
-
@conn = Faraday.new :url => 'http://sushi.com/api',
|
|
6
|
-
:headers => {'Mime-Version' => '1.0'},
|
|
7
|
-
:request => {:oauth => {:consumer_key => 'anonymous'}}
|
|
8
|
-
|
|
9
|
-
@conn.options[:timeout] = 3
|
|
10
|
-
@conn.options[:open_timeout] = 5
|
|
11
|
-
@conn.ssl[:verify] = false
|
|
12
|
-
@conn.proxy 'http://proxy.com'
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def test_request_create_stores_method
|
|
16
|
-
env = make_env(:get)
|
|
17
|
-
assert_equal :get, env[:method]
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def test_request_create_stores_addressable_uri
|
|
21
|
-
env = make_env do |req|
|
|
22
|
-
req.url 'foo.json', 'a' => 1
|
|
23
|
-
end
|
|
24
|
-
assert_equal 'http://sushi.com/api/foo.json?a=1', env[:url].to_s
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def test_request_create_stores_headers
|
|
28
|
-
env = make_env do |req|
|
|
29
|
-
req['Server'] = 'Faraday'
|
|
30
|
-
end
|
|
31
|
-
headers = env[:request_headers]
|
|
32
|
-
assert_equal '1.0', headers['mime-version']
|
|
33
|
-
assert_equal 'Faraday', headers['server']
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def test_request_create_stores_body
|
|
37
|
-
env = make_env do |req|
|
|
38
|
-
req.body = 'hi'
|
|
39
|
-
end
|
|
40
|
-
assert_equal 'hi', env[:body]
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def test_global_request_options
|
|
44
|
-
env = make_env
|
|
45
|
-
assert_equal 3, env[:request][:timeout]
|
|
46
|
-
assert_equal 5, env[:request][:open_timeout]
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def test_per_request_options
|
|
50
|
-
env = make_env do |req|
|
|
51
|
-
req.options[:timeout] = 10
|
|
52
|
-
req.options[:custom] = true
|
|
53
|
-
req.options[:oauth] = {:consumer_secret => 'xyz'}
|
|
54
|
-
end
|
|
55
|
-
assert_equal 10, env[:request][:timeout]
|
|
56
|
-
assert_equal 5, env[:request][:open_timeout]
|
|
57
|
-
assert_equal true, env[:request][:custom]
|
|
58
|
-
|
|
59
|
-
oauth_expected = {:consumer_secret => 'xyz', :consumer_key => 'anonymous'}
|
|
60
|
-
assert_equal oauth_expected, env[:request][:oauth]
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def test_request_create_stores_ssl_options
|
|
64
|
-
env = make_env
|
|
65
|
-
assert_equal false, env[:ssl][:verify]
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def test_request_create_stores_proxy_options
|
|
69
|
-
env = make_env
|
|
70
|
-
assert_equal 'proxy.com', env[:request][:proxy][:uri].host
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
private
|
|
74
|
-
|
|
75
|
-
def make_env(method = :get, connection = @conn, &block)
|
|
76
|
-
request = Faraday::Request.create(method, &block)
|
|
77
|
-
request.to_env(connection)
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
class HeadersTest < Faraday::TestCase
|
|
82
|
-
def setup
|
|
83
|
-
@headers = Faraday::Utils::Headers.new
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
def test_parse_response_headers_leaves_http_status_line_out
|
|
87
|
-
@headers.parse("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n")
|
|
88
|
-
assert_equal %w(Content-Type), @headers.keys
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
def test_parse_response_headers_parses_lower_cased_header_name_and_value
|
|
92
|
-
@headers.parse("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n")
|
|
93
|
-
assert_equal 'text/html', @headers['content-type']
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def test_parse_response_headers_parses_lower_cased_header_name_and_value_with_colon
|
|
97
|
-
@headers.parse("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nLocation: http://sushi.com/\r\n\r\n")
|
|
98
|
-
assert_equal 'http://sushi.com/', @headers['location']
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
def test_parse_response_headers_parses_blank_lines
|
|
102
|
-
@headers.parse("HTTP/1.1 200 OK\r\n\r\nContent-Type: text/html\r\n\r\n")
|
|
103
|
-
assert_equal 'text/html', @headers['content-type']
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
class ResponseTest < Faraday::TestCase
|
|
108
|
-
def setup
|
|
109
|
-
@env = {
|
|
110
|
-
:status => 404, :body => 'yikes',
|
|
111
|
-
:response_headers => Faraday::Utils::Headers.new('Content-Type' => 'text/plain')
|
|
112
|
-
}
|
|
113
|
-
@response = Faraday::Response.new @env
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
def test_finished
|
|
117
|
-
assert @response.finished?
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
def test_error_on_finish
|
|
121
|
-
assert_raises RuntimeError do
|
|
122
|
-
@response.finish({})
|
|
123
|
-
end
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
def test_not_success
|
|
127
|
-
assert !@response.success?
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
def test_status
|
|
131
|
-
assert_equal 404, @response.status
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
def test_body
|
|
135
|
-
assert_equal 'yikes', @response.body
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
def test_headers
|
|
139
|
-
assert_equal 'text/plain', @response.headers['Content-Type']
|
|
140
|
-
assert_equal 'text/plain', @response['content-type']
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
def test_apply_request
|
|
144
|
-
@response.apply_request :body => 'a=b', :method => :post
|
|
145
|
-
assert_equal 'yikes', @response.body
|
|
146
|
-
assert_equal :post, @response.env[:method]
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
def test_marshal
|
|
150
|
-
@response = Faraday::Response.new
|
|
151
|
-
@response.on_complete { }
|
|
152
|
-
@response.finish @env.merge(:custom => 'moo')
|
|
153
|
-
|
|
154
|
-
loaded = Marshal.load Marshal.dump(@response)
|
|
155
|
-
assert_nil loaded.env[:custom]
|
|
156
|
-
assert_equal %w[body response_headers status], loaded.env.keys.map { |k| k.to_s }.sort
|
|
157
|
-
end
|
|
158
|
-
end
|
data/test/helper.rb
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
require 'rubygems'
|
|
2
|
-
require 'test/unit'
|
|
3
|
-
|
|
4
|
-
if ENV['LEFTRIGHT']
|
|
5
|
-
begin
|
|
6
|
-
require 'leftright'
|
|
7
|
-
rescue LoadError
|
|
8
|
-
puts "Run `gem install leftright` to install leftright."
|
|
9
|
-
end
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
unless $LOAD_PATH.include? 'lib'
|
|
13
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
14
|
-
$LOAD_PATH.unshift(File.join($LOAD_PATH.first, '..', 'lib'))
|
|
15
|
-
end
|
|
16
|
-
require 'faraday'
|
|
17
|
-
|
|
18
|
-
begin
|
|
19
|
-
require 'ruby-debug'
|
|
20
|
-
rescue LoadError
|
|
21
|
-
# ignore
|
|
22
|
-
else
|
|
23
|
-
Debugger.start
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
module Faraday
|
|
27
|
-
class TestCase < Test::Unit::TestCase
|
|
28
|
-
LIVE_SERVER = case ENV['LIVE']
|
|
29
|
-
when /^http/ then ENV['LIVE']
|
|
30
|
-
when nil then nil
|
|
31
|
-
else 'http://localhost:4567'
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def test_default
|
|
35
|
-
assert true
|
|
36
|
-
end unless defined? ::MiniTest
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
require 'webmock/test_unit'
|
|
41
|
-
WebMock.disable_net_connect!(:allow => Faraday::TestCase::LIVE_SERVER)
|
data/test/live_server.rb
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
require 'sinatra'
|
|
2
|
-
set :logging, false
|
|
3
|
-
|
|
4
|
-
get '/hello_world' do
|
|
5
|
-
'hello world'
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
get '/json' do
|
|
9
|
-
content_type 'application/json'
|
|
10
|
-
"[1,2,3]"
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
post '/file' do
|
|
14
|
-
if params[:uploaded_file].respond_to? :each_key
|
|
15
|
-
"file %s %s" % [
|
|
16
|
-
params[:uploaded_file][:filename],
|
|
17
|
-
params[:uploaded_file][:type]]
|
|
18
|
-
else
|
|
19
|
-
status 400
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
[:get, :post].each do |method|
|
|
24
|
-
send(method, '/hello') do
|
|
25
|
-
"hello #{params[:name]}"
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
%w[POST PUT PATCH].each do |http_method|
|
|
30
|
-
settings.send(:route, http_method, '/echo_name') do
|
|
31
|
-
params[:name].inspect
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
options '/options' do
|
|
36
|
-
'hi'
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
delete '/delete_with_json' do
|
|
40
|
-
%/{"deleted":true}/
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
get '/multi' do
|
|
44
|
-
[200, { 'Set-Cookie' => %w[ one two ] }, '']
|
|
45
|
-
end
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
|
|
2
|
-
|
|
3
|
-
class MiddlewareStackTest < Faraday::TestCase
|
|
4
|
-
# mock handler classes
|
|
5
|
-
class Handler < Struct.new(:app)
|
|
6
|
-
def call(env)
|
|
7
|
-
(env[:request_headers]['X-Middleware'] ||= '') << ":#{self.class.name.split('::').last}"
|
|
8
|
-
app.call(env)
|
|
9
|
-
end
|
|
10
|
-
end
|
|
11
|
-
class Apple < Handler; end
|
|
12
|
-
class Orange < Handler; end
|
|
13
|
-
class Banana < Handler; end
|
|
14
|
-
|
|
15
|
-
def setup
|
|
16
|
-
@conn = Faraday::Connection.new
|
|
17
|
-
@builder = @conn.builder
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
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
|
|
23
|
-
assert @builder[0] == default_middleware
|
|
24
|
-
assert @builder[1] == default_adapter_klass
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def test_allows_rebuilding
|
|
28
|
-
build_stack Apple
|
|
29
|
-
build_stack Orange
|
|
30
|
-
assert_handlers %w[Orange]
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def test_allows_extending
|
|
34
|
-
build_stack Apple
|
|
35
|
-
@conn.use Orange
|
|
36
|
-
assert_handlers %w[Apple Orange]
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def test_builder_is_passed_to_new_faraday_connection
|
|
40
|
-
new_conn = Faraday::Connection.new :builder => @builder
|
|
41
|
-
assert_equal @builder, new_conn.builder
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def test_insert_before
|
|
45
|
-
build_stack Apple, Orange
|
|
46
|
-
@builder.insert_before Apple, Banana
|
|
47
|
-
assert_handlers %w[Banana Apple Orange]
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
def test_insert_after
|
|
51
|
-
build_stack Apple, Orange
|
|
52
|
-
@builder.insert_after Apple, Banana
|
|
53
|
-
assert_handlers %w[Apple Banana Orange]
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def test_swap_handlers
|
|
57
|
-
build_stack Apple, Orange
|
|
58
|
-
@builder.swap Apple, Banana
|
|
59
|
-
assert_handlers %w[Banana Orange]
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def test_delete_handler
|
|
63
|
-
build_stack Apple, Orange
|
|
64
|
-
@builder.delete Apple
|
|
65
|
-
assert_handlers %w[Orange]
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def test_stack_is_locked_after_making_requests
|
|
69
|
-
build_stack Apple
|
|
70
|
-
assert !@builder.locked?
|
|
71
|
-
@conn.get('/')
|
|
72
|
-
assert @builder.locked?
|
|
73
|
-
|
|
74
|
-
assert_raises Faraday::Builder::StackLocked do
|
|
75
|
-
@conn.use Orange
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def test_duped_stack_is_unlocked
|
|
80
|
-
build_stack Apple
|
|
81
|
-
assert !@builder.locked?
|
|
82
|
-
@builder.lock!
|
|
83
|
-
assert @builder.locked?
|
|
84
|
-
|
|
85
|
-
duped_connection = @conn.dup
|
|
86
|
-
assert_equal @builder, duped_connection.builder
|
|
87
|
-
assert !duped_connection.builder.locked?
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
def test_handler_comparison
|
|
91
|
-
build_stack Apple
|
|
92
|
-
assert_equal @builder.handlers.first, Apple
|
|
93
|
-
assert_equal @builder.handlers[0,1], [Apple]
|
|
94
|
-
assert_equal @builder.handlers.first, Faraday::Builder::Handler.new(Apple)
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
private
|
|
98
|
-
|
|
99
|
-
# make a stack with test adapter that reflects the order of middleware
|
|
100
|
-
def build_stack(*handlers)
|
|
101
|
-
@builder.build do |b|
|
|
102
|
-
handlers.each { |handler| b.use(*handler) }
|
|
103
|
-
|
|
104
|
-
b.adapter :test do |stub|
|
|
105
|
-
stub.get '/' do |env|
|
|
106
|
-
# echo the "X-Middleware" request header in the body
|
|
107
|
-
[200, {}, env[:request_headers]['X-Middleware'].to_s]
|
|
108
|
-
end
|
|
109
|
-
end
|
|
110
|
-
end
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
def assert_handlers(list)
|
|
114
|
-
echoed_list = @conn.get('/').body.to_s.split(':')
|
|
115
|
-
echoed_list.shift if echoed_list.first == ''
|
|
116
|
-
assert_equal list, echoed_list
|
|
117
|
-
end
|
|
118
|
-
end
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
|
|
2
|
-
require 'rack/utils'
|
|
3
|
-
|
|
4
|
-
Faraday::CompositeReadIO.send :attr_reader, :ios
|
|
5
|
-
|
|
6
|
-
class RequestMiddlewareTest < Faraday::TestCase
|
|
7
|
-
def setup
|
|
8
|
-
@conn = Faraday.new do |b|
|
|
9
|
-
b.request :multipart
|
|
10
|
-
b.request :url_encoded
|
|
11
|
-
b.request :json
|
|
12
|
-
b.adapter :test do |stub|
|
|
13
|
-
stub.post('/echo') do |env|
|
|
14
|
-
posted_as = env[:request_headers]['Content-Type']
|
|
15
|
-
[200, {'Content-Type' => posted_as}, env[:body]]
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def test_does_nothing_without_payload
|
|
22
|
-
response = @conn.post('/echo')
|
|
23
|
-
assert_nil response.headers['Content-Type']
|
|
24
|
-
assert response.body.empty?
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def test_ignores_custom_content_type
|
|
28
|
-
response = @conn.post('/echo', { :some => 'data' }, 'content-type' => 'application/x-foo')
|
|
29
|
-
assert_equal 'application/x-foo', response.headers['Content-Type']
|
|
30
|
-
assert_equal({ :some => 'data' }, response.body)
|
|
31
|
-
end
|
|
32
|
-
|
|
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
|
-
def test_json_fails_with_useful_message_when_no_json_adapter_available
|
|
46
|
-
without_json_adapter do
|
|
47
|
-
expected_msg = "No JSON adapter available. Install either activesupport or yajl-ruby."
|
|
48
|
-
# assert_raise doesn't work to check the message (at least on 1.8.7)
|
|
49
|
-
begin
|
|
50
|
-
@conn.post('/echo', { :fruit => %w[apples oranges] }, 'content-type' => 'application/json')
|
|
51
|
-
fail "Exception not raised"
|
|
52
|
-
rescue Faraday::Error::MissingDependency => e
|
|
53
|
-
assert_equal expected_msg, e.message
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def test_url_encoded_does_not_fail_when_no_json_adapter_available
|
|
59
|
-
without_json_adapter do
|
|
60
|
-
assert_nothing_raised {
|
|
61
|
-
@conn.post('/echo', { :fruit => %w[apples oranges] })
|
|
62
|
-
}
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
def without_json_adapter
|
|
67
|
-
original_adapter = Faraday::Request::JSON.adapter
|
|
68
|
-
Faraday::Request::JSON.adapter = nil
|
|
69
|
-
begin
|
|
70
|
-
yield
|
|
71
|
-
ensure
|
|
72
|
-
Faraday::Request::JSON.adapter = original_adapter
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
def test_url_encoded_no_header
|
|
77
|
-
response = @conn.post('/echo', { :fruit => %w[apples oranges] })
|
|
78
|
-
assert_equal 'application/x-www-form-urlencoded', response.headers['Content-Type']
|
|
79
|
-
assert_equal 'fruit[]=apples&fruit[]=oranges', response.body
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
def test_url_encoded_with_header
|
|
83
|
-
response = @conn.post('/echo', {'a'=>123}, 'content-type' => 'application/x-www-form-urlencoded')
|
|
84
|
-
assert_equal 'application/x-www-form-urlencoded', response.headers['Content-Type']
|
|
85
|
-
assert_equal 'a=123', response.body
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def test_url_encoded_nested
|
|
89
|
-
response = @conn.post('/echo', { :user => {:name => 'Mislav', :web => 'mislav.net'} })
|
|
90
|
-
assert_equal 'application/x-www-form-urlencoded', response.headers['Content-Type']
|
|
91
|
-
expected = { 'user' => {'name' => 'Mislav', 'web' => 'mislav.net'} }
|
|
92
|
-
assert_equal expected, Rack::Utils.parse_nested_query(response.body)
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
def test_multipart
|
|
96
|
-
# assume params are out of order
|
|
97
|
-
regexes = [
|
|
98
|
-
/name\=\"a\"/,
|
|
99
|
-
/name=\"b\[c\]\"\; filename\=\"request_middleware_test\.rb\"/,
|
|
100
|
-
/name=\"b\[d\]\"/]
|
|
101
|
-
|
|
102
|
-
payload = {:a => 1, :b => {:c => Faraday::UploadIO.new(__FILE__, 'text/x-ruby'), :d => 2}}
|
|
103
|
-
response = @conn.post('/echo', payload)
|
|
104
|
-
|
|
105
|
-
assert_kind_of Faraday::CompositeReadIO, response.body
|
|
106
|
-
assert_equal "multipart/form-data;boundary=%s" % Faraday::Request::Multipart::DEFAULT_BOUNDARY,
|
|
107
|
-
response.headers['Content-Type']
|
|
108
|
-
|
|
109
|
-
response.body.send(:ios).map{|io| io.read}.each do |io|
|
|
110
|
-
if re = regexes.detect { |r| io =~ r }
|
|
111
|
-
regexes.delete re
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
assert_equal [], regexes
|
|
115
|
-
end
|
|
116
|
-
end
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
|
|
2
|
-
|
|
3
|
-
class ResponseMiddlewareTest < Faraday::TestCase
|
|
4
|
-
def setup
|
|
5
|
-
@conn = Faraday.new do |b|
|
|
6
|
-
b.response :raise_error
|
|
7
|
-
b.adapter :test do |stub|
|
|
8
|
-
stub.get('ok') { [200, {'Content-Type' => 'text/html'}, '<body></body>'] }
|
|
9
|
-
stub.get('not-found') { [404, {'X-Reason' => 'because'}, 'keep looking'] }
|
|
10
|
-
stub.get('error') { [500, {'X-Error' => 'bailout'}, 'fail'] }
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
class ResponseUpcaser < Faraday::Response::Middleware
|
|
16
|
-
def parse(body)
|
|
17
|
-
body.upcase
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def test_success
|
|
22
|
-
assert_nothing_raised do
|
|
23
|
-
@conn.get('ok')
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def test_raises_not_found
|
|
28
|
-
error = assert_raises Faraday::Error::ResourceNotFound do
|
|
29
|
-
@conn.get('not-found')
|
|
30
|
-
end
|
|
31
|
-
assert_equal 'the server responded with status 404', error.message
|
|
32
|
-
assert_equal 'because', error.response[:headers]['X-Reason']
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def test_raises_error
|
|
36
|
-
error = assert_raises Faraday::Error::ClientError do
|
|
37
|
-
@conn.get('error')
|
|
38
|
-
end
|
|
39
|
-
assert_equal 'the server responded with status 500', error.message
|
|
40
|
-
assert_equal 'bailout', error.response[:headers]['X-Error']
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def test_upcase
|
|
44
|
-
@conn.builder.insert(0, ResponseUpcaser)
|
|
45
|
-
assert_equal '<BODY></BODY>', @conn.get('ok').body
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
class ResponseNoBodyMiddleWareTest < Faraday::TestCase
|
|
50
|
-
def setup
|
|
51
|
-
@conn = Faraday.new do |b|
|
|
52
|
-
b.response :raise_error
|
|
53
|
-
b.adapter :test do |stub|
|
|
54
|
-
stub.get('not modified') { [304, nil, nil] }
|
|
55
|
-
stub.get('no content') { [204, nil, nil] }
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
@conn.builder.insert(0, NotCalled)
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
class NotCalled < Faraday::Response::Middleware
|
|
62
|
-
def parse(body)
|
|
63
|
-
raise "this should not be called"
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def test_204
|
|
68
|
-
assert_equal nil, @conn.get('no content').body
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
def test_304
|
|
72
|
-
assert_equal nil, @conn.get('not modified').body
|
|
73
|
-
end
|
|
74
|
-
end
|